Skip to main content

クラスのコンパイルと配置

クラスのコンパイルは、IDE (他の箇所で説明) でも、ここで説明するようにプログラムによっても実行できます。ここでは、コンパイラの動作の詳細も説明します。最後に、コンパイルされたクラスを配置モードに入れる方法についても説明します。

プログラムによるコンパイル

プログラムによってクラスをコンパイルするには、%SYSTEM.OBJOpens in a new tab クラスの Compile() メソッドを使用します。

 Do $System.OBJ.Compile("MyApp.MyClass")

%SYSTEM.OBJOpens in a new tab クラスには、複数のクラスのコンパイルに使用できる追加のメソッドがあります。

クラス・コンパイラの基本

InterSystems IRIS® データ・プラットフォームのクラス定義は、使用する前にコンパイルする必要があります。

クラス・コンパイラは、Java など他のプログラミング言語で使用できるコンパイラとは、2 つの点で大きく異なります。第 1 に、コンパイルの結果は、ファイル・システムではなく、共有リポジトリ (データベース) に保存されます。第 2 に、コンパイラは永続クラスに対するサポートを提供します。

特に、クラス・コンパイラは以下のことを行います。

  1. 依存関係のリストを生成します。最初にコンパイルされる必要があるクラスのリストです。使用されているコンパイル・オプションによっては、最後のコンパイル以降に変更された依存関係もコンパイルされます。

  2. 継承を決定します。いずれのメソッド、プロパティ、および他のクラス・メンバが、スーパークラスから継承されるかを決定します。この継承情報を、後で参照するためにクラス・ディクショナリに保存します。

  3. 永続クラスとシリアル・クラスでは、データベース内のオブジェクトを保存するのに必要なストレージ構造を決定し、クラスの SQL 表現に必要な実行時情報を作成します。

  4. クラスで定義 (または継承) されているすべてのメソッド・ジェネレータを実行します。

  5. クラスに対する実行時コードを含む、1 つまたは複数のルーチンを生成します。クラス・コンパイラは、言語 (ObjectScript と Basic) に応じてメソッドをグループ化し、別個のルーチンを生成します。各ルーチンには、その言語のメソッドが含まれます。

  6. 生成されたすべてのルーチンを実行可能なコードにコンパイルします。

  7. クラス記述子を作成します。これは、(ルーチンとして保存された) 特別なデータ構造で、クラスのサポートに必要な実行時のすべてのディスパッチ情報 (プロパティの名前、メソッドの位置など) を含みます。

クラス・コンパイラに関する留意事項

コンパイルの順序

クラスのコンパイル時、コンパイルしているクラスに依存関係に関する情報が含まれている場合は、システムにより、その他のクラスもリコンパイルされます。例えば、システムは、クラスに含まれるすべてのサブクラスをコンパイルします。場合によっては、クラスのコンパイル順序を制御することが必要になります。そのためには、SystemDependsOn、および CompileAfter キーワードを使用します。詳細は、"クラス定義リファレンス" を参照してください。

特定のクラスをコンパイルするときに、コンパイラによってリコンパイルされることになるクラスを調べるには、$SYSTEM.OBJ.GetDependencies() メソッドを使用します。以下に例を示します。

TESTNAMESPACE>d $system.OBJ.GetDependencies("Sample.Address",.included)
 
TESTNAMESPACE>zw included
included("Sample.Address")=""
included("Sample.Customer")=""
included("Sample.Employee")=""
included("Sample.Person")=""
included("Sample.Vendor")=""

このメソッドのシグニチャは、以下のとおりです。

classmethod GetDependencies(ByRef class As %String, 
                            Output included As %String,
                            qspec As %String) as %Status

以下はその説明です。

  • class は、1 つのクラス名 (この例の場合)、クラス名のコンマ区切りリスト、またはクラス名の多次元配列になります。(多次元配列の場合、この引数は必ず参照で渡してください。)ワイルドカードを含めることもできます。

  • included は、class がコンパイルされるときに、コンパイルされることになるクラスの名前の多次元配列です。

  • qspec は、コンパイラのフラグと修飾子の文字列です。これを省略すると、このメソッドは、現在のコンパイラのフラグと修飾子を使用します。

ビットマップ・インデックスを含むクラスのコンパイル

ビットマップ・インデックスを含むクラスをコンパイルする場合、そのクラスに対するビットマップ・エクステント・インデックスが定義されていないと、クラス・コンパイラはビットマップ・エクステント・インデックスを生成します。プロダクション・システムのクラスにビットマップ・インデックスを追加するときには特別な注意が必要です。詳細は、"ビットマップ・エクステント・インデックスの生成" を参照してください。

メモリにクラスの既存のインスタンスが存在する場合のコンパイル

コンパイル対象のクラスのインスタンスが開いているときにコンパイラを呼び出しても、エラーは発行されません。既に開いているインスタンスでは、その既存のコードが引き続き使用されます。コンパイル後に開いた別のインスタンスでは、新しくコンパイルしたコードが使用されます

クラスを配置モードに入れる方法

いくつかの独自のクラスを顧客に送信する前に配置モードに入れることができます。この処理によって、ソース・コードが表示されなくなります。

クラス定義に、顧客には見せたくないメソッド定義が含まれている場合は、そのクラスをコンパイルしてから、$SYSTEM.OBJ.MakeClassDeployed() を使用します。以下に例を示します。

 do $system.OBJ.MakeClassDeployed("MyApp.MyClass")

代替手段については、"顧客のデータベースへのコンパイル済みコードの追加" を参照してください。

配置モードについて

クラスが配置モードになると、そのクラスのメソッド定義とトリガ定義は削除されます。(クラスがデータ型クラスである場合、クエリ・キャッシュによって実行時にメソッド定義が必要になる可能性があるために、メソッド定義が保持されることに注意してください。)

配置モードのクラスは、エクスポートやコンパイルができません。ただし、そのクラスのサブクラスのコンパイルは可能です (配置モードになっていない場合)。

クラスの配置を元に戻す手段はありません。ただし、前もって定義をディスクに保存しておくと、ファイルからその定義をインポートし、クラスを置き換えることができます。(これは、独自のクラスのいずれかを誤って不完全に配置モードにしてしまった場合に役立ちます。)

関連項目

FeedbackOpens in a new tab