メインコンテンツまでスキップ
バージョン: v20 R4 BETA

コンパイル

プロジェクトはコンパイルすることができます。 コンパイルとは、すべてのメソッドをマシン言語に翻訳することです。 プロジェクトをコンパイルすると、コードの整合性を調べたり、実行速度を向上させることができます。さらに、コード全体を難読化することにより保護することも可能です。 4D でプロジェクト開発をおこない、それをスタンドアロンアプリケーションとして配布するまでの間の手順として、コンパイルは不可欠です。

コンパイル

コンパイル処理はすべて 4Dアプリケーションにより自動的でおこなわれます。

macOS上でコンパイルするには、Xcode をインストールする必要があります。 このことについての詳細は Apple Silicon用コンパイラー を参照ください。

  1. コンパイラーウィンドウを表示するには、デザイン メニューの コンパイラー... を選択するか、またはツールバーにある コンパイラー ボタンをクリックします。

また、デザイン メニューの コンパイル開始... を選択すると、コンパイル処理を直接開始できます。

  1. コンパイル ボタンをクリックすると、現在の コンパイル設定 に基づいてコンパイル処理を開始します。

エラーが検出されなければ、実際のコンパイル処理が開始します。コンパイル処理が完了すると、"コンパイルに成功しました" というメッセージがウィンドウの下部に表示されます:

コンパイルが終了次第、アプリケーションをコンパイル済みモードで実行し、実行速度がどれだけ向上したのか確認することができます。

エラーが検出されると処理が中止され、"コンパイルに失敗しました" というメッセージが表示されます。 ウィンドウの情報エリアに、問題となるメソッド名と行番号が階層リスト形式で表示されます:

関係するメソッドを直接 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 という名前で作成されます。

コンパイルパス

コンパイラーによって実施されるコード解析の実行周期数を設定するために使用します。これは、コンパイルの所要時間に影響します。

  • すべて定義させる: コード内の変数や引数の型をコンパイラーに推論させたい場合は、このオプションをチェックします。 このオプションは、コンパイルを可能にするために必要なすべてのステップをコンパイラーに実行させるため、コンパイルの時間が増加します。
  • ローカル変数のみ自動定義させる: プロセスおよびインタープロセス変数、そしてプロトタイプ宣言されていないメソッド引数の型を決定する処理はおこなわれません。 このオプションを選択する場合、すべてのプロセス変数とインタープロセス変数は開発者自身が宣言するか、コンパイラーメソッドを自動生成する機能を使用しなければなりません。
  • 自動変数定義は行わない: ローカル、プロセス、インタープロセス変数および、プロトタイプ宣言されていないメソッド引数の型を決定する処理はおこなわれません。 このオプションを選択する場合、すべての変数およびメソッド引数が明示的に宣言されていなければなりません。
tip

あらかじめ 型宣言を生成する ボタンを使用すると、"ローカル変数のみ自動定義させる" および "自動変数定義は行わない" のオプションを選択してコンパイルすることができます。

コンパイル対象CPU

履歴
バージョン内容
v19追加

この設定で、4Dプロジェクトをネイティブコンパイルする対象となるプロセッサー・ファミリーを選択します。 4D のコンパイラーは 2つのプロセッサー・ファミリーに向けてネイティブコードをビルドできます:

  • Intel/AMD プロセッサー (すべてのマシン)
  • Apple Silicon プロセッサー

対象CPUの選択肢は 2つ提示されます。 結果は、4D を実行しているマシンのプロセッサーに依存します。

オプションWindows Intel/AMDmacOS IntelmacOS 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+ 以降は範囲チェックが再び有効になります

コンパイラーについて

4D には 2種類のコンパイラーがあります:

  • "クラシック" コンパイラーは Intel/AMDプロセッサー向けのネイティブコードをコンパイルします
  • "Apple Silicon用コンパイラー" は Apple Silicon プロセッサー向けのネイティブコードをコンパイルします

クラシックコンパイラーは Windows および macOS のどちらでも使用できますが、Apple SIlicon用コンパイラーは macOS マシンでのみ使用できます:

Windows用コンパイルIntel Mac用コンパイルSilicon Mac用コンパイル
WindowsOOX
Intel MacOOO
Silicon MacOOO

どちらのコンパイラーも 4D に統合されています。 コンパイル対象CPU オプションの設定に応じて、適切なコンパイラーが自動的に選択されます。

クラシックコンパイラー

マシンの OS に関わらず、クラシックコンパイラーは Intel/AMDプロセッサー向けのネイティブコンパイルコードを生成します。 特別な設定は必要ありません。

結果のコンパイルコードはプロジェクトの DerivedData フォルダーに保存されます。

Apple Silicon用コンパイラー

Apple Silicon用コンパイラーは Apple M1 などの Apple Silicon プロセッサー向けのネイティブコンパイルコードを生成します。

結果のコンパイルコードはプロジェクトの Libraries フォルダーに保存されます。

要件

  • macOS マシン: Apple Silicon用コンパイラーは Apple のマシン上でのみ実行可能です。
  • 4D プロジェクトアーキテクチャー: Apple Silicon用コンパイラーは プロジェクトアーキテクチャー を使った 4D開発でのみ利用できます。
  • Xcode または Developer Tools: コンパイルの 2つ目のステップ において、プロジェクトを C++ コードからコンパイルするために、Apple Silicon用コンパイラーはオープンソース macOS コンパイラー Clang を呼び出します。 Clang は Apple ネイティブライブラリを必要とします。これらは Xcode または Developer Tools パッケージより提供されています。
    • Xcode や Developer Tools をマシン上でインストールされた状態で すでに持っている場合、それらのバージョンが 4D の要件と合っていることを確認します。
    • マシンにインストールされた状態でこれらのツールを 持っていない場合、Apple Developer の Webサイトからいずれかをダウンロードする必要があります。

インストール手順が簡単なため Xcode のインストールを推奨しています。 よりコンパクトな Developer Tools をインストールしても問題ありませんが、こちらはインストール手順がやや複雑です。

いずれにせよ、要件が満たされていない場合には、4D の Apple Silicon用コンパイラーが警告を発します。

インクリメンタルコンパイラー

Apple Silicon用コンパイラーはインクリメンタルコンパイラーです:

  • 初めてのコンパイルにおいては、すべての 4Dメソッド がコンパイルされます。 これには時間がかかる可能性がありますが、 一度きりです。
  • 以降のコンパイルにおいては、新規または編集されたメソッド のみが処理され、コンパイル時間を大幅に短縮します。