4D v14.3コンパイラ指示子の使用 |
|||||||||||||||||||||||||||
|
4D v14.3
コンパイラ指示子の使用
|
ブール |
固定長文字列 |
日付 |
整数 |
倍長整数 |
グラフ |
時間 |
ピクチャ |
数値 (または実数) |
ポインタ |
テキスト |
BLOB |
オブジェクト |
配列には12の型があります:
ブール配列 |
文字列配列 |
日付配列 |
整数配列 |
倍長整数配列 |
ピクチャ配列 |
実数配列 |
時間配列 |
オブジェクト配列 |
ポインタ配列 |
BLOB配列 |
テキスト配列 |
注:
- 4D v14以降、"オブジェクト"という型が使用できるようになりました。
- 4D v11より、文字タイプの変数とテキストタイプの変数に違いはなくなりました。今後はテキストタイプの利用が推奨されます。
インタプリタモードでは、変数は2つ以上のデータタイプを持つことが可能です。これは、コードをコンパイルするのではなく解釈する ためです。4Dはそれぞれのステートメントを別々に解釈し、そのコンテキストを理解します。しかしコンパイルモードの場合は状況が異なります。インタプリ タが一行ずつ実行処理するのに対して、コンパイルの際はデータベース全体を処理します。
コンパイラの処理方法は以下のとおりです:
同 じ変数名で異なる2つのデータ型が見つかった場合、どちらか1つが優先して採用されることはありません。オブジェクトの型を設定してメモリアドレスを割り 当てるために、コンパイラはオブジェクトについての名前やデータ型などを正確に認識する必要があります。コンパイラはデータ型からそのサイズを判断しま す。コンパイルされたデータベースごとにマップが作られ、各変数の名前(もしくは識別子)、場所(もしくはメモリアドレス)、変数が占める容量(データタ イプによってわかるもの)を記録します。このマップをシンボルテーブルと呼びます。環境設定のオプションでコンパイル時にこのテーブルをファイル形式で作 成するかどうかを選ぶことができます。
このマップは、コンパイラメソッドの自動生成にも使用されます。
コンパイルで変数型を調べたりまた型定義を行ったりする場合は、簡単にコンパイラコマンドの記述場所を決めることができます。作業方法に応じて以下のいずれかの方法を選んでください:
コンパイラ指示子は以下の場合、有用です:
またコンパイラコマンドを使用するとコンパイル時間を短縮できます。
コンパイラで変数型を決定できないこともあります。このような場合、コンパイラからはエラーメッセージが出力されます。
コンパイラでデータ型を決定できない場合は、主に3つの原因があります。データ型が複数ある場合、コンパイラの推測した型があいまいな場合、そして型を判断する情報がない場合です。
データ型が複数の場合
データベース中、異なるステートメントで変数の型が変更されていると、コンパイラはエラーを生成します。
コンパイラは最初に見つけた変数を選択し、そのデータ型を同じ名前の変数の次のオカレンスに適用します。しかしその変数の型が異なるとエラーになります。
例題:
メソッドA,
Variable:=True
メソッドB,
Variable:="The moon is green"
メソッドAがメソッドBよりも先にコンパイルされると、コンパイラはステートメントVariable:="The moon is green"でデータ型が変更されていると判断します。コンパイラは型の変更が行われていることを通知し、エラーを生成します。ほとんどの場合、2番目の変数のオカレンスの名前を変更することで、問題を解決できます。
コンパイラが決定した型が曖昧な場合
コンパイラが、オブジェクトの型が正しい方ではないと推定することがあります。この場合、コンパイラ指示子を使用して、変数の型を明示的に指定する必要があります。
以下はアクティブオブジェクト用のデフォルト値を使用した例です。
フォーム内で、プロパティリストのデータソーステーマ内にあるデフォルト 値用の編集ボタンを使用して、コンボボックス、ポップアップメニュー、タブコントロール、ドロップダウンリスト、メニュー/ドロップダウンリスト、および スクロールエリアのデフォルト値を割り当てることができます(詳細は4D Design Referenceを参照)。デフォルト値は、オブジェクト名と同じ名前の配列に自動でロードされます。
オブジェクトをメソッド内で使用しない場合、コンパイラはその配列を曖昧さなくテキスト配列と推測できます。
しかし初期化を行わなければならない場合、次のようにコーディングされることがあります:
Case of
:(Form event=On Load)
MyPopUp:=2
...
End case
この場合、曖昧さが出現します。メソッドを解析する際、コンパイラはオブジェクトMyPopUpを実数型と推定します。この場合、フォームメソッドまたはコンパイラメソッドで、配列を明示的に宣言する必要があります:
Case of
:(Form event=On Load)
ARRAY TEXT(MyPopUp;2)
MyPopUp:=2
...
End case
型を判断する決め手がない場合
宣言なしに変数が使用されていて、前後関係からデータ型を決定できないような状況です。この場合、コンパイラにとっての決め手はコンパイラ指示子しかありません。
こうした状況は、主に次の4つのコンテキストにおいて起こります:
ポインタ
ポインタは、自分自身以外のデータ型を返すことができません。
次のような場合:
Var1:=5.2(1)
Pointer:=->Var1(2)
Var2:=Pointer->(3)
(2) でPointerによりポイントされている変数の型が定義されているにもかかわらず、Var2の型を知ることはできません。コンパイル中、コンパイラはポ インタを認識できますが、ポインタが指す変数の型を知る方法はありません。結果、Var2に型を推定できません。このような場合、コンパイラ指示子が必要 です: C_REAL(Var2).
複数シンタックスコマンド
Year of関数に割り当てられた変数を使用する際、この関数の動作に基づき、変数の型は日付しかありえません。しかしことは常にそのように単純とは限りません。たとえば:
GET FIELD PROPERTIES コマンドは2つのシンタックスを受け入れます:
GET FIELD PROPERTIES(tableNo;fieldNo;type;length;index)
GET FIELD PROPERTIES(fieldPointer;type;length;index)
複数シンタックスコマンドを使用する際、コンパイラは選択されたシンタックスや引数を推測できません。データベースのどこかでその使用に基づく型付けが行われていない限り、コンパイラ指示子を使用して変数を型付けしなければなりません。
異なるデータ型のオプション引数を受け入れるコマンド
異なるデータ型の複数のオプション引数を受け入れるコマンドを使用する場合、コンパイラはどのオプション引数が使用されたか知ることができません。例えば:
GET LIST ITEM コマンドは2つのオプション引数を受け入れます; 1番目は倍長整数で2番目はブールです。
コマンドは以下のいずれかの方法で使用されます:
GET LIST ITEM(list;itemPos;itemRef;itemText;sublist;expanded)
または:
GET LIST ITEM(list;itemPos;itemRef;itemText;expanded)
データベースのどこかでその使用に基づく型付けが行われていない限り、コンパイラ指示子を使用して変数を型付けしなければなりません。
URLで呼ばれるメソッド
URLから呼ばれる必要のある4Dメソッドを書くときで、メソッドで$1を使用しないときでも、以下のように明示的に$1をテキスト変数として宣言しなければなりません:
C_TEXT($1)
実際コンパイラは4DがURLから呼ばれるかどうか判断できません。
データベースで使用する変数がすべて明示的に定義されていれば、コンパイラで型定義を調べる必要はありません。この場合、オプションを設定してメソッドの翻訳フェーズだけを行うように指定できます。この操作により、コンパイル時間を半分以下に短縮できます。
コンパイラコマンドを使用することで、メソッドの処理速度を上げることができます。この件についての詳細はの 節を参照してください。簡単な例として、カウンタとして使用するローカル変数をインクリメントする必要があるとします。倍長整数として宣言すると、コンパ イルしたデータベースの効率が良くなります。例えばWindowsの場合、実数データがメモリを8バイト使用するのに対し、倍長整数にすると、4バイトし か使用しません。8バイトのカウンタをインクリメントする場合は当然、4バイトの場合より時間がかかります。
コンパイラ指示子は、コンパイラに変数の型付けをまかせるかどうかによって以下2通りに処理方法が異なります。
コンパイラは変数の判別基準を守り、以下の方法で型を設定します。
2つの可能性があります。
V1:=True
V2:="This is a sample phrase"
V3:=V1 `V3はV1と同じ型
V4:=2*V2 `V4はV2と同じ型
Number:=4
C_BOOLEAN(Var)
コンパイラに型定義をチェックさせたくない場合、コンパイラ指示子を識別できるようなコードをコンパイラに与える必要があります。
これを行う方法は以下です:
プロセス変数、インタープロセス変数についてのコンパイラ指示子および引数を、名前の先頭がキーワードCompilerで始まる1個あるいは複数個のメソッドに記述します。デフォルトで、コンパイラに5種類のコンパイラメソッドを自動生成させ、変数、配列、メソッド引数ごとに命令をまとめることができます(詳細はDesign Referenceマニュアルを参照)。
Note: 引数定義のためのシンタックスは次のとおりです:
Directive (methodName;parameter). このシンタックスをインタプリタモードで実行することはできません。
特別な引数
Note: コンパイラは引数$0を初期化しません。したがって、On Drag Overフォームイベントを使用したら、直ちに"$0"を初期化しなければなりません。例えば:
C_LONGINT($0)
If(Form event=On Drag Over)
$0:=0
...
If($DataType=Is picture)
$0:=-1
End if
...
End if
コンパイラ指示子によって、曖昧なデータ型は除外されます。特定の厳密さは要求されますが、コンパイラが全ての不一致を受け入れないというわけではありません。
例えば整数と定義した変数に実数値を代入すると、コンパイラはこれを型の不一致と見なさず、コンパイラ指示子に応じた値を代入します。以下のように記述した場合:
C_INTEGER(vInteger)
vInteger:=2.5
コンパイラはこれを型の矛盾としては扱わず、したがってコンパイルは可能です。そして代わりに数値の小数部分を切り上げます(2.5ではなくて3になります)。
プロダクト: 4D
テーマ: コンパイラ
エラーメッセージ
シンタックスの詳細
型指定ガイド
最適化のヒント
ランゲージリファレンス ( 4D v14 R2)
ランゲージリファレンス ( 4D v14 R3)
ランゲージリファレンス ( 4D v14.3)
ランゲージリファレンス ( 4D v14 R4)
Inherited from : コンパイラ指示子の使用 ( 4D v11 SQL Release 6)