コンパイル
プロジェクトはコンパイルすることができます。 コンパイルとは、すべてのメソッドをマシン言語に翻訳することです。 プロジェクトをコンパイルすると、コードの整合性を調べたり、実行速度を向上させることができます。さらに、コード全体を難読化することにより保護することも可能です。 4D でプロジェクト開発をおこない、それをスタンドアロンアプリケーションとして配布するまでの間の手順として、コンパイルは不可欠です。
コンパイル
コンパイル処理はすべて 4Dアプリケーションにより自動的でおこなわれます。
macOS上でコンパイルするには、
Xcode
をインストールする必要があります。 このことについての詳細は Apple Silicon用コンパイラー を参照ください。
-
コンパイラーウィンドウを表示するには、デザイン メニューの コンパイラー... を選択するか、またはツールバーにある コンパイラー ボタンをクリックします。
また、デザイン メニューの コンパイル開始... を選択すると、コンパイル処理を直接開始できます。
- コンパイル ボタンをクリックすると、現在の コンパイル設定 に基づいてコンパイル処理を開始します。
エラーが検出されなければ、実際のコンパイル処理が開始します。コンパイル処理が完了すると、"コンパイルに成功しました" というメッセージがウィンドウの下部に表示されます:
コンパイルが終了次第、アプリケーションをコンパイル済みモードで実行し、実行速度がどれだけ向上したのか確認することができます。
エラーが検出されると処理が中止され、"コンパイルに失敗しました" というメッセージが表示されます。 ウィンドウの情報エリアに、問題となるメソッド名と行番号が階層リスト形式で表示されます:
関係するメソッドを直接 4D のコードエディターで開くには、検出された各エラーをダブルクリックします。 エラーを含む行がハイライト表示され、エラーの種類がウィンドウのシンタックスエリアに表示されます。
メソッド メニューから 前のエラー / 次のエラー を選択すると、エラーが含まれる各行を移動することができます。
初めてのコンパイルで検出されるエラーの数に辟易するかもしれませんが、気にすることはありません。 ほどなく、これらのエラーが同じ原因によるものであることに気づくでしょう。たとえば、特定のプロジェクト規約に対する違反などです。 コンパイラーは、エラーの訂正に役立つよう 正確なエラー診断 を提供します。
コンパイルには、適切なライセンスが必要です。 ライセンスがない場合、コンパイルを実行することはで きません (ボタンが無効になります)。 その場合でも、シンタックスチェックと変数定義メソッドの生成はおこなうことができます。
コンパイル済み実行
プロジェクトがコンパイルされると、インタープリターモードとコンパイル済みモード を切り替えて実行できるようになります。この際、4Dアプリケーションを終了する必要はありません (インタープリターコードを削除している場合は除きます)。 切り替えには、実行 メニューの インタープリター再起動 や コンパイル済み再起動 コマンドを使用します。 プロジェクトを開くダイアログボックス でも、起動時にインタープリターモードとコンパイル済みモードから選択することができます。
モードを変更すると、4D は現在のモードを閉じ、新しいモードを開きます。 つまり、アプリケーションが閉じられ、再び開かれます。 モードを切り替えるたびに、4D は 2つのデータベースメソッド (定義されていれば) を次の順番に実行します: On Exit
-> On Startup
。
インタープリターモードでプロジェクトを編集したら、それをコンパイルコードに反映させるには再コンパイルしなければなりません。
コンパイラーウィンドウ
コンパイラーウィンドウでは、コンパイル ボタン の他にも、プロジェクト開発時に有用な機能が提供されています。
シンタックスチェック
シンタックスチェック ボタンは、シンタックスチェックフェーズの実行を開始します。 チェックが終了すると、検出されたエラーがすべて情報エリアに表示されます。 エラー行をダブルクリックすると、対応するメソッドを表示することができます。
シンタックスチェックは、ツールバーの コンパイラー ボタンに割り当てられた シンタックスチェック コマンドから実行することもできます。 アプリケーションをコンパイルするための適切なライセンスを持たない場合は、このオプションしか使用できません。
型宣言を生成する
型宣言を生成 ボタンは、型宣言をおこなう "コンパイラーメソッド" を作成 (または更新) します。 コンパイラーメソッドは、すべての変数 ・配列の型宣言 (プロセスおよびインタープロセス) と メソッドの引数定義 を集約したプロジェクトメソッドです。 これらのメソッドが存在する場合には、これらが直接コンパイラーによってコンパイル中に利用されるため、コンパイル速度が向上します。
これらのメソッドは、必ず Compiler_
で始まります。 コンパイラー設定 にて、5つのコンパイラーメソッドそれぞれに対してデフォルト名を設定することができます。 4D により生成、管理されるコンパイラーメソッドは自動的に "非表示" 属性が割り当てられます:
コンパイラーメソッドは、必要な (つまり、プロジェクト内に存在する項目の分) だけが作成されます。
情報エリアには、メソッドの作成・更新時に検出されたエラーが示されます。 エラー行をダブルクリックすると、対応するメソッドと行がコードエディター上に表示されます。
コンパイルコードを削除
コンパイルコードを削除 ボタンを使用すると、プロジェクトのコンパイル済みコードが削除されます。 ボタンをクリックすると、コンパイル時に生成されたコード がすべて削除されます。実行 メニューの コンパイル済み再起動 コマンドが無効になり、開始時の "開く: コンパイルモード済みデータベース" オプションはグレー表示されます。
警告を表示/隠す
警告は、コンパイラーがシンタックスチェックをおこなう際に生成するとメッセージです。 これらのメッセージの目的は、実行時エラーを引き起こす可能性のあるステートメントに注意を向けることです。 警告によりコンパイルが中断されることはあ りません。
状況や使用されるプログラミングスタイルによって、これらのメッセージの重要性は変化します。 警告を表示/隠す ボタンをクリックすることで、警告の表示・非表示を切り替えられます。
このオプションを有効にすると、ウィンドウには他のエラータイプの後に警告 (あれば) が表示されます。 実際の表示は次のとおりです:
警告をダブルクリックすると、対応するメソッドが開かれます。
コンパイル時に警告を無効にする
コンパイル時に特定の警告を選択的に無効にすることができます。これをおこなうには、4Dメソッドのコード内に次を挿入します:
//%W-<warning number>
無効化できるのは、番号の付いた警告に限られます。 警告番号は、コンパイルエラーリストの各メッセージの最後に示されています。 たとえば、次の警告を無効にしたいものとします:
1: 配列定義コマンド内にポ インタが存在します (518.5)
この場合、4D メソッド (できれば COMPILER_xxx
メソッド) に次のコメントを記述します:
//%W-518.5
コンパイラー設定
ストラクチャー設定ダイアログボックスの "コンパイラー" ページでは、プロジェクトのコンパイルに関連するパラメーターを設定できます。 コンパイラーウィンドウ の コンパイラー設定 ボタンをクリックすると、コンパイラーページを直接開くことができます。
コンパイルオプション
このエリアには、コンパイル処理中に使用される一般的なオプションがまとめられています。
Symbolファイルを生成
Symbolファイルを生成するのに使用します (Symbolファイル 参照)。 Symbolファイルは、プロジェクトの Logs フォルダー 内に ProjectName_symbols.txt
という名前で作成されます。
エラーファイルを生成
シンタックスチェック時にエラーファイルを生成するのに使用します (エラーファイル 参照)。 エラーファイルは、プロジェクトの Logs フォルダー 内に ProjectName_error.xml
という名前で作成されます。
コンパイルパス
コンパイラーによって実施されるコード解析の実行周期数を設定するために使用します。これは、コンパイルの所要時間に影響します。
- すべて定義させる: コンパイルのために実施できるステップをすべておこないます。
- ローカル変数のみ自動定義させる: プロセスおよびインタープロセス変数、そしてメソッド引数の型を決定する処理はおこなわれません。 このオプションを選択する場合、すべてのプロセス変数とインタープロセス変数は開発者自身が宣言するか、コンパイラーメソッドを自動生成する機能を使用しなければなりません。
- 自動変数定義は行わない: ローカル、プロセス、インタープロセス変数およびメソッド引数の型を決定する処理はおこなわれません。 このオプションを選択する場合、すべての変数およびメソッド引数が明示的に宣言されていなければなりません。
コンパイル対象CPU
履歴
リリース | 内容 |
---|---|
19 | 追加 |
この設定で、4Dプロジェクトをネイティブコンパイルする対象となるプロセッサー・ファミリーを選択します。 4D のコンパイラーは 2つのプロセッサー・ファミリーに向けてネイティブコードをビルドできます:
- Intel/AMD プロセッサー (すべてのマシン)
- Apple Silicon プロセッサー
対象CPUの選択肢は 2つ提示されます。 結果は、4D を実行しているマシンのプロセッサーに依存します。
オプション | Windows Intel/AMD | macOS Intel | macOS Silicon |
---|---|---|---|
全てのプロセッサ (Intel/AMD および Apple Silicon) | Intel/AMD 用コードのみ Windows上で Apple Silicon 用のコードは生成できません | Apple Silicon + Intel/AMD 用コード 2種類のコンパイルコードが生成されます | Apple Silicon + Intel/AMD 用コード 2種類のコンパイルコードが生成されます |
自分のプロセッサ (プロセッサー名) | Intel/AMD 用コード | Intel/AMD 用コード | Apple Silicon 用コード |
Apple Silicon 用にコンパイルするには、マシンに Clang アプリケーションをインストールする必要があります。 Clang は最新バージョンの Xcode に含まれています。 詳細については Apple Silicon用コンパイルの要件 を参照ください。
デフォルトの型指定
このエリアでは、曖昧なデータベースオブジェクトのデフォルト型を設定します。
- 数値: 実数または倍長整数に数値を型指定します。 プロジェクトにて型指定ディレクティブが書かれている場合、そちらが優先されます。 倍長整数を指定することでデータベースを最適化できます。
- ボタン: 実数または倍長整数にボタンを型指定します。 プロジェクトにて型指定ディレクティブが書かれている場合、そちらが優先されます。 この型指定はボタンのほか、チェックボックス、ピクチャーボタン、ボタングリッド、ラジオボタン、ピクチャーポップアップメニューおよびドロップダウンリストが対象となります。
コンパイラーメソッド...
このエリアでは、型宣言を生成 をクリックしたときにコンパイラーが自動生成するコンパイラーメソッドの名前を設定できます。
最大 5つのコンパイラーメソッドが生成されます。プロジェクトに対応する要素が存在する場合のみ、コンパイラーメソッドは作 成されます:
- 変数: プロセス変数定義を集約します。
- インタープロセス変数: インタープロセス変数定義を集約します。
- 配列: プロセス配列定義を集約します。
- インタープロセス配列: インタープロセス配列定義を集約します。
- メソッド: メソッドの引数を受け入れるローカル変数定義を集約します (例:
C_LONGINT(mymethod;$1)
)。 詳細についてはCompiler_Methods
メソッド を参照ください。
それぞれの対応するエリアで、作成されるメソッド名を編集できますが、これらには必ず Compiler_
という接頭辞が付きます。これは変更できません。 各メソッド名は、接頭辞を含めて 31文字以下でなければなりません。 また、メソッド名はユニークでなければならず、メソッドの命名規則 に準じたものでなければなりません。
コンパイルツール
Symbolファイル
コンパイラー設定の Symbolファイルを生成 オプションを選択してコンパイルすると、プロジェクトの Logs フォルダー 内に ProjectName_symbols.txt
という名称の Symbolファイルが作成されます。 このドキュメントはいくつかの部分に分かれています:
プロセスおよびインタープロセス変数のリスト
これら 2つのリストは、4つのカラムに分かれています:
- プロジェクト内で使用されているプロセス変数、インタープロセス変数、および配列の名前。 変数は ABC順に表示されます。
- 変数の型。 変数の型は、コンパイラー命令コマンドにより設定されるか、変数の使われ方に基づいてコンパイラーが判断します。 変数の型が特定できない場合、このカラムは空欄になります。
- 変数が配列の場合に、その次元数が表示されます。
- コンパイラーが変数の型を決定したコンテキストへの参照。 変数が複数のコンテキストで使用されている場合は、コンパイラーが変数の型を決定する際に使用したコンテキストが表示されます。
- 変数がデータベースメソッド内で検出された場合、(M)* に続けて 4D で定義されたデータベースメソッド名が表示されます。
- 変数がプロジェクトメソッド内で検出された場合、(M) に続けて 4D で定義されたメソッド名が表示されます。
- 変数がトリ ガー (テーブルメソッド) 内で検出された場合、(TM) に続けてテーブル名が表示されます。
- 変数がフォームメソッド内で検出された場合、テーブル名と (FM) に続けてフォーム名が表示されます。
- 変数がオブジェクトメソッド内で検出された場合、フォーム名、テーブル名、(OM) に続けてオブジェクトメソッド名が表示されます。
- 変数がフォーム上のオブジェクトであり、プロジェクトメソッド、フォームメソッド、オブジェクトメソッド、トリガーのいずれでも使用されていない場合は、(F) に続けてそのオブジェクトが使用されるフォーム名が表示されます。 各リストの最後には、プロセス変数とインタープロセス変数のサイズがバイト単位で表示されます。
コンパイル時に、コンパイラーは特定のプロセス変数が使用されているプロセスを判別できません。 プロセス変数には、プロセスごとに異なる値が格納されている可能性があります。 そのため、新規プロセスが開始されるたびに、すべてのプロセス変数が意図的に複製されます。したがって、メモリ上でこれらのプロセス変数が占める容量に注意することが推奨されます。 また、プロセス変数に使われる容量は、プロセスのスタックサイズとは関連しないことに留意が必要です。
ローカル変数のリスト
ローカル変数のリストは、データベースメソッド、プロジェクトメソッド、トリガー、 フォームメソッド、オブジェクトメソッドごとに、4D内と同じ順番で並べられています。
このリストは、3つのカラムに分かれています:
- メソッドで使用されるローカル変数のリスト
- 変数の型
- 変数が配列の場合に、その次元数
メソッドの全リスト
ファイルの最後には、データベースメソッドとプロジェクトメソッドの全リストが、それぞれ次の情報とともに納められます:
- 戻り値の型 (戻り値のあるプロシージャーまたは関数)
- パラメーターの型 (受け渡される引数および戻される値)
- コール数
- スレッドセーフまたはスレッドアンセーフ・プロパティ
この情報は、次の形式で示されます:
プロシージャーまたは関数 <メソッド名>(パラメーターの型):戻り値の型, コール数, スレッドセーフまたはスレッドアンセーフ
エラーファイル
コンパイラー設定の エラーファイルを生成 オプションを使用して、コンパイル時にエラーファイルを生成するかどうかを選択することができます エラーファイルは、プロジェクトの Logsフォルダー内に ProjectName_errors.txt
という名前で作成されます。
コンパイラーウインドウ からエラーに直接アクセスすることができますが、マシンからマシンへ送信できるエラーファイルがあると便利な場合があります。 エラーファイルは、その内容を自動的に解析しやすいように XMLフォーマットで生成されます。 これを利用して、エラー表示用に独自のインターフェースを作成することもできます。
エラーファイルの長さは、コンパイラーにより生成されるエラーと警告の数により変わります。
エラーファイルの構造は次のとおりです:
- ファイルの一番上にはエラーと警告のリストがあり 、メソッドごと、そして 4D で作成された順序で並べられます。
- 全般的なエラー セクションには、タイプ定義がおこなえないものと識別が不明確なものがすべて集められます。 これらのエラーと警告は、次の形式で表示されます:
- メソッドにおける行番号 (0 は全般的なエラー)
- warning属性は、検出された異常が警告であるのか (warning="true")、あるいはエラーであるのか (warning="false") を表わします
- エラーを解説する診断の表示
プロジェクトに全般的なエラーが存在しない場合、そのファイルには 全般的なエラー セクションがありません。
エラーファイルには、次の 3つのタイプのメッセージが含まれます:
-
特定の行に関連するエラー: これらのエラーは、コンテキスト (エラーが見つかった行) 内に説明とともに表示されます。 コンパイラーは、データ型やシンタックスに関する矛盾を含む式で見つけると、このタイプのエラーをレポートします。 コンパイラーウィンドウでは、検出された各エラーをダブルクリックすると、該当するメソッドが直接 4Dのコードエディターで開かれ、エラーを含む行が反転表示されます。
-
全般的なエラー: これらのエラーは、プロジェクトのコンパイルを不可能にします。 コンパイラーが全般的なエラーを生成するケースは、次の 2つです:
- プロセス変数のデータ型が決定できなかった。
- 異なる 2つのオブジェクトが同じ名称である。
全般的なエラーは特定のメソッドに関連していないため、このような名前 が付けられています。 最初のケースは、コンパイラーがプロジェクトのいずれの箇所でも、指定された型定義を実行できなかった場合です。 2番目のケースでは、いずれのオブジェクトに特定の名前を割り当てるべきかを決定できません。
- 警告: 警告はエラーではありません。 警告により、プロジェクトがコンパイルできなくなることはありません。これは、エラーになる可能性のあるコードを示すだけです。 コンパイラーウィンドウにおいて、警告はイタリック体で表示されます。 それぞれの警告をダブルクリックすると、該当するメソッドが直接 4Dのコードエディターで開かれ、その警告に関係する行が反転表示されます。
範囲チェック
4Dコンパイラーによって生成されたコードでは、配列要素へのアクセスや文字参照が実際に配列や文字列の範囲内でおこなわれているかが自動的に確認されます。 範囲外へのアクセスは、ランタイム実行エラーを誘発します。
コード内で間違いがないと思われる箇所に対して範囲チェックを適用したくないときもあります。 具体的には、かなりの回数繰り返されるループに関し、旧式のマシン上でコンパイル済みデータベースを実行すると、範囲チェックにより処理速度が著しく低下するおそれがあります。 関連するコードに誤りがなく、システムエラーを引き起こさないことが確実であれば、範囲チェックをローカル上で無効にすることができます 。
これをおこなうには、範囲チェックから外すコードを特殊なコメントである //%R-
と //%R+
で囲みます。 //%R-
コメントは範囲チェックを無効にし、//%R+
はそれを再び有効にします:
// %R- 範囲チェックを無効化
... // ここに範囲チェックから外すコードを記述します
// %R+ 以降は範囲チェックが再び有効になります