version 2003 (Modified)
統合された4Dのコンパイラは、データベースアプリケーションを機械語レベルに翻訳します。コンパイラの利点は次の通りです:
・速度: データベースの実行速度を3倍から1000倍速くします。
・コードの検証: データベースアプリケーションコードの整合性をチェックし、論理的矛盾や構文的矛盾を検出します。
・保護: データベースをコンパイルすると、インタプリタコードを削除できます。コンパイルされたデータベースは、故意的にも不注意からもストラクチャやメソッドの表示や修正することができないこと以外は、オリジナルのデータベースと同じに動作します。
・スタンドアロンのダブルクリックで起動するアプリケーション: コンパイル後のデータベースは、独自のアイコンを持つスタンドアロンアプリケーション(.EXEファイル)に作り変えることもできます。
コンパイラの操作については、Design Referenceマニュアルを参照してください。
このテーマのコマンドは、コンパイラの使用に関連があります。これらのコマンドは、データベース中のデータタイプを定義します。IDLEコマンドは、コンパイルされたデータベースで特別に使用されるコマンドです。
| C_BLOB | C_INTEGER | C_REAL | IDLE |
| C_BOOLEAN | C_LONGINT | C_STRING | |
| C_DATE | C_PICTURE | C_TEXT | |
| C_GRAPH | C_POINTER | C_TIME |
IDLEコマンド以外のこれらのコマンドは、変数を宣言し、それらを指定したデータタイプとしてキャストします。変数を宣言することによって、変数のデータタイプに関連する曖昧さが解決されます。変数がこれらのコマンドのいずれかで宣言されていない場合には、コンパイラが変数のデータタイプを判断しようとします。フォームで使用される変数のデータタイプは、多くの場合、コンパイラで判断するのは困難です。このため、開発者がこれらのコマンドによってフォームで使用される変数を宣言することが特に重要です。
Note: 時間を節約するために、コンパイラウインドウにあるオプションを使用し、(コンパイラメソッドと呼ばれる) 変数定義メソッドの生成や更新を行うことができます。このオプションは、データベース内で使用されるすべての変数のタイプ指定を行う変数定義メソッドを自動作成します。
配列は変数で、コンパイルについては標準変数と同じ規則に従わなければなりません。配列の宣言命令は配列テーマ内にまとめられています。
コンパイルされるコードの一般的な記述ルール
・同じ名前を2つ以上のメソッドまたは変数に付けてはなりません。また、メソッドに変数と同じ名前をつけることはできません。
・バージョン1の4Dで使用されていた変数の間接参照はできません。パーセント記号(%)を使って間接的に変数を参照する文字型間接参照も、中カッコ({...})を用いる数値型間接参照も実行することはできません。中カッコ({...})は定義された配列の要素を指定する場合にのみ使用されます。しかし、引数に対する間接参照は使用できます。
・変数や配列のデータタイプは変更できません。
・1次元配列を2次元配列に、また2次元配列を1次元配列に変更することはできません。
・文字(列)変数の長さや、文字列配列の要素の長さは変えられません。
・コンパイラにより変数のタイプ定義は行われますが、フォーム上の変数のように、データタイプが明確でない場合は、コンパイラ命令を使用して変数のデータタイプを指定するべきです。
・ 変数を明示的にタイプ宣言するもう1つの理由は、コードの最適化です。このことは、特にカウンタとして使用される変数に対して当てはまります。最大限の能力を得るために、可能な限り倍長整数型の変数を使用してください。
・変数をクリアする(ヌルに初期化する) には、変数名を用いてCLEAR VARIABLEコマンドを使用します。CLEAR VARIABLEコマンド内で変数の名前を表わす文字列を使用してはいけません。
・Undefined関数は、常にFalseを返します。変数は常に定義されています。
・通常、倍長整数変数および整数変数の数値演算は、デフォルトの数値タイプ(実数)の演算よりもはるかに高速に実行されます。
これらの規則については、下記の節を参照してください:
・コンパイラ指示子の使用は、いつ、どこでコンパイラ命令を記述するかについて説明しています。
・型設定ガイドは、4Dデータベースをコンパイルする際に起こりうるコンフリクトについて説明しています。
・シンタックスの詳細は、いくつかの4Dコマンドに関する追加情報を提供します。
・最適化のヒントは、コンパイルモードで起動したアプリケーションをスピードアップするためのヒントを提供します。
例題
1. 以下の例は、コンパイラ用の基本的な変数宣言です:
C_BLOB(vxMyBlob) ` プロセス変数vxMyBlobはBLOB型の変数とし宣言されます C_BOOLEAN(<>OnWindows) ` インタープロセス変数<>OnWindowsはブール型の変数とし宣言されます C_DATE($vdCurDate) ` ローカル変数$vdCurDateは日付型の変数とし宣言されます。 C_GRAPH(vg1;vg2;vg3) ` 3つのプロセス変数vg1, vg2 そし vg3はグラフ型とし宣言されます。
2. 以下の例は、プロジェクトメソッドOneMethodAmongOthersにて、3つの引数を宣言しています:
` OneMethodAmongOthers プロジェクトメソッド
` OneMethodAmongOthers ( Real ; Integer { ; Long } )
` OneMethodAmongOthers ( Amount ; Percentage { ; Ratio } )
C_REAL($1) ` 1番目の引数は実数
C_INTEGER($2) ` 2番目の引数は整数
C_LONGINT($3) ` 3番目の引数は倍長整数
` ...
3. 以下のプロジェクトメソッドCapitalizeは、文字列の引数を受けとり、文字列の結果を返します:
` Capitalize プロジェクトメソッド ` Capitalize ( String ) -> String ` Capitalize ( Source string ) -> Capitalized string C_STRING(255;$0;$1) $0:=Uppercase(Substring($1;1;1))+Lowercase(Substring($1;2))
4. 以下のプロジェクトメソッドSEND PACKETSは、引数として時間と、可変の数のテキスト引数を受け取ります:
` SEND PACKETS プロジェクトメソッド
` SEND PACKETS ( Time ; Text { ; Text2... ; TextN } )
` SEND PACKETS ( docRef ; Data { ; Data2... ; DataN } )
C_TIME ($1)
C_TEXT (${2})
C_LONGINT ($vlPacket)
For ($vlPacket;2;Count parameters)
SEND PACKET ($1;${$vlPacket})
End for
5. プロジェクトメソッドCOMPILER_Param_Predeclare28は、コンパイル用に他のプロジェクトメソッドのシンタックスを事前に宣言しています:
` COMPILER_Param_Predeclare28 プロジェクトメソッド
C_REAL(OneMethodAmongOthers;$1) ` OneMethodAmongOthers ( Real ; Integer { ; Long } )
C_INTEGER(OneMethodAmongOthers;$2) ` ...
C_LONGINT(OneMethodAmongOthers;$3) ` ...
C_STRING(Capitalize;255;$0;$1) ` Capitalize ( String ) -> String
C_TIME(SEND PACKETS;$1) ` SEND PACKETS ( Time ; Text { ; Text2... ; TextN } )
C_TEXT(SEND PACKETS;${2}) ` ...
参照
C_BLOB, C_BOOLEAN, C_DATE, C_GRAPH, C_INTEGER, C_LONGINT, C_PICTURE, C_POINTER, C_REAL, C_STRING, C_TEXT, C_TIME, IDLE.