Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

$COMPILE

ソース・コードをコンパイルし、実行可能なオブジェクト・コードを生成します。

Synopsis

$COMPILE(source,language,errors,object)

$COMPILE(source,language,errors,,,,rname)

パラメータ

source コンパイルするソース・コードを格納する配列変数。
language ソース・コードのプログラミング言語を指定する整数フラグ。
errors コンパイル時に発生するエラーを受け取るローカル変数。この変数は、報告されたエラーごとに 1 つの要素を持つリスト構造です。各エラーは、それ自体がエラーの位置とタイプを指定するリスト構造になっています (以下を参照)。
object オプション — コンパイルされたオブジェクト・コードを保持するために使用される配列。
rname オプション — (2 番目の構文形式のみ) コンパイルされたオブジェクト・コードを ^rOBJ グローバルに格納するために使用されるルーチン名を指定する文字列。

説明

$COMPILE は、ソース・コードをコンパイルし、オブジェクト・コード (ルーチンの実行可能な形式) を生成します。$COMPILE は、コンパイル・エラーを報告します。これを使って、実際にオブジェクト・コードを生成せずに、ソース・コードにコンパイル・エラーがあるかどうかを確認できます。コンパイルの前に、ObjectScript マクロ・プリプロセッサなどのプリプロセッサでソース・コード内のマクロを処理する必要があります。

Note:

Caché には、ソース・コードをコンパイルするための強力なツールがいくつか用意されており、スタジオはその 1 つです。一般にソース・コードのコンパイルは、この $COMPILE 関数ではなく、これらのツールを使用して実行されます。

$COMPILE には、次の 2 つの構文形式があります。

  • $COMPILE の 1 つ目の構文形式では、オブジェクト・コードが object 配列に返されます。まず、object 変数が削除されます。コンパイル後、object 配列がコンパイルされたオブジェクト・コードのサイズに設定されます。

    object 配列には、^rOBJ グローバルの場合と同じ形式でオブジェクト・コードが格納されます。^rOBJ 内のオブジェクト・コードは、MERGE ^rOBJ(rname)=object(1) コマンドによって新しいオブジェクト・コードに置換できます。ただし、MERGE コマンドは複数のノードを設定するときにアトミックでないため、この操作と同時に別のプロセスが同じルーチンをロードしている場合は、予測できない結果が発生する可能性があります。

    object パラメータを省略すると、ソース・コードのコンパイルとエラー・チェックが実行されますが、オブジェクト・コードは作成されません。

  • $COMPILE の 2 つ目の構文形式では、オブジェクト・コードが ^rOBJ(rname) に直接返されます。$COMPILE 操作では、新しいオブジェクト・コードが完全に格納されるまで他のプロセスがルーチンのオブジェクト・コードをロードしないように、内部で ^rOBJ(rname) がロックされます。

    一般に、この構文形式では object 引数は省略されます。object パラメータを指定すると、その object 変数は削除されますが、設定されません。省略された (プレースホルダのコンマで表される) 他の引数は、内部用のため、指定しないでください。

$COMPILE は、次のようにステータス・コードを返します。0 = エラーが検出されず、オブジェクト・コードが作成されました。1 = エラーが検出され、オブジェクト・コードが作成された場合。-1 = エラーが検出され、オブジェクト・コードが作成されなかった場合。

ObjectScript コンパイラは、エラーが検出された時点で、その行が実行されたときにエラーを返すオブジェクト・コードを作成します。Basic コンパイラは、エラーが検出されたときにオブジェクト・コードを生成しません。

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

パラメータ

source

コンパイルするソース・コードを格納する配列。ソースの形式は、ObjectScript の INT ルーチン、Caché Basic の BAS ルーチン、Caché MVBasic の MVI ルーチンのいずれかです。配列要素 source(0) にはソース・コードの行数を格納し、source(n) にはソース・コードの行番号 n を格納します。ソース行には 1 ~ n の連番を省略なしで付ける必要があります。source パラメータには、添え字なしのローカル変数名か、場合によっては添え字付きのグローバル名を指定できます。

source(0) が未定義の場合、システムは、%SYSTEM.Process.Undefined()Opens in a new tab メソッドの設定にかかわらず、<UNDEFINED> エラーを生成します。

source(0) 値がソース・コードの行数より大きい場合や、連続するソース・コード行が見つからない場合、システムは <UNDEFINED> エラーを生成した後に、見つからないソース・コード行の名前を表示します。この動作は、%SYSTEM.Process.Undefined()Opens in a new tab メソッドを設定して変更できます。以下の例では、これらの種類のエラーを示します。

  SET src(0)=4,src(1)="TestA ",src(2)=" WRITE 123",src(3)=" WRITE 456,!"
  SET stat=$COMPILE(src,0,errs,TestA)    /* generates <UNDEFINED> *src(4) */
  SET src(0)=4,src(1)="TestA ",src(3)=" WRITE 123",src(4)=" WRITE 456,!"
  SET stat=$COMPILE(src,0,errs,TestA)    /* generates <UNDEFINED> *src(2) */
  SET src(0)=3,src(1)="TestA ",src(3)=" WRITE 123",src(4)=" WRITE 456,!"
  SET stat=$COMPILE(src,0,errs,TestA)    /* generates <UNDEFINED> *src(2) */

language

コンパイルするソースのタイプを指定する言語モード。一般的な値は以下のとおりです。

  • 0 = ObjectScript

  • 9 = Caché Basic

  • 11 = Caché MVBasic

他の値を使用すると、従来の ObjectScript モードが指定されます。使用する場合は、事前にインターシステムズのサポート窓口にお問い合わせください。

エラー

コンパイラが検出したエラーが設定される添え字なしのローカル変数。既存の値は削除されます。エラーが検出されなかった場合は、空の文字列 ("") がこの変数に設定されます。エラーが検出された場合は、エラーごとに 1 つの要素を持つ $LIST 構造が errors 変数に設定されます。各エラーは、それ自体が $LISTBUILD(line,offset,errnum,text) という形式の $LIST 構造です。各要素の内容は以下のとおりです。

  • line = エラーが検出された行番号

  • offset = ソース行でのエラーのオフセット

  • errnum = エラーのタイプを示すエラー番号

  • text = エラーを説明するテキスト

Basic コンパイラでは、さらに 2 つの要素 (エラーの位置を示すテキストとソース行自体) がこのリストに追加されます。

object

コンパイラのオブジェクト・コード出力を受け取る配列。object パラメータは、添え字なしのローカル変数名か、場合によっては添え字付きのグローバル名です。object 配列の内容は、上記のとおりです。

rname

オブジェクト・コードを添え字付きの ^rOBJ グローバルのどこに保存する必要があるかを指定するルーチン名。$COMPILE は、新しいオブジェクト・コードを保存する前に、^rOBJ(rname) の既存の内容を削除します。

コンパイルの中断

実行中のコンパイルは、Ctrl-C を発行するか、または ^RESJOB ユーティリティを呼び出すことで中断できます。このようなコンパイルの中断は、すべての language モードでサポートされています。

次の例では、$COMPILE の 1 つ目の形式を使用して、4 行の ObjectScript プログラムをコンパイルしています。

SourceCode
  SET src(0)=4
  SET src(1)="TestA "
  SET src(2)=" WRITE ""Hello "" "
  SET src(3)=" WRITE ""World"",!"
  SET src(4)=" QUIT"
CompileSource
  SET stat=$COMPILE(src,0,errs,TestA)
  IF stat=0 {WRITE "Compile successful" }
  ELSE {WRITE "status=",stat,!
        WRITE "number of compile errors=",$LISTLENGTH(errs) }

次の例では、$COMPILE の 2 つ目の形式を使用して、同じ 4 行の ObjectScript プログラムをコンパイルしています。

SourceCode
  SET src(0)=4
  SET src(1)="TestB "
  SET src(2)=" WRITE ""Hello "" "
  SET src(3)=" WRITE ""World"",!"
  SET src(4)=" QUIT"
CompileSource
  SET stat=$COMPILE(src,0,errs,,,,"TestB")
  IF stat=0 {WRITE "Compile successful",!
             DO ^TestB }
  ELSE {WRITE "status=",stat,!
        WRITE "number of compile errors=",$LISTLENGTH(errs) }

次の例では、7 行の ObjectScript プログラムに対してコンパイル・エラー・チェックを実行しています。この $COMPILE は、エラーの有無を検査するだけであり、正常なコンパイルによって生成されたオブジェクト・コードを受け取るための変数は提供しません。この例では、ソース・コードのすべての行にエラーが含まれていますが、$COMPILE は 1、3、5、6、および 7 行目のコンパイル時エラーのみを返し、0 による除算エラー (2 行目) や未定義変数エラー (4 行目) などの実行時エラーは返しません。

SourceCode
  SET src(0)=7
  SET src(1)="?TestC "
  SET src(2)=" SET a=2/0"
  SET src(3)=" SET b=3+#2"
  SET src(4)=" SET c=xxx"
  SET src(5)=" SET? d=5"
  SET src(6)=" SET 123=""abc"""
  SET src(7)=" SETT f=7"
CompileSource
  SET stat=$COMPILE(src,0,errs)
  IF stat {WRITE $LISTLENGTH(errs)," Compile Errors ",!
    FOR i=1:1:$LISTLENGTH(errs) {
      WRITE !,i,": " 
      SET errn=$LIST(errs,i)
      FOR j=1:1:$LISTLENGTH(errn) {
        WRITE $LIST(errn,j)," "
        }
    }
  }
  ELSE {WRITE "Compile successful",!
        WRITE "but no object code generated" }

関連項目

FeedbackOpens in a new tab