Next: , Previous: , Up: Forth Tutorial   [Contents][Index]


3.28 Interpretation and Compilation Semantics and Immediacy

ワードがコンパイルされる時と、 通訳(interpret)される時では異なる振る舞いをします。 たとえば、 + について考えてみましょう:

1 2 + .
: foo + ;

これらの 2 つの振る舞いは、 コンパイル機能(compilation semantics)とインタプリタ機能(interpretation semantics)として知られています。 通常のワード(例: +)の場合、 コンパイル機能は、 現在定義中のワード(上記の例では foo)にインタプリタ機能を追加します。 つまり、 後で foo が実行されると、 + のインタプリタ機能(interpretation semantics)(つまり、2 つの数値の加算)が実行されます。

ただし、 if のような制御フロー・ワードなど、 デフォルト以外のコンパイル機能を持つワードが存在します。 immediate を使用すると、 最後に定義されたワードのコンパイル機能をインタプリタ機能と等しくなるように変更できます:

: [FOO] ( -- )
 5 . ; immediate

[FOO]
: bar ( -- )
  [FOO] ;
bar
see bar

デフォルト以外のコンパイル機能をもつワードだと知らしめる 2 つの慣習は、 名前を括弧で囲む(より頻繁に使用される)ことと、 名前をすべて大文字で記述する(あまり使用されない)ことです。

if などの一部のワードについては、 インタプリタ機能を使用するのは通常間違いであるため、 それらを compile-only としてマークし、 インタプリタ機能を使用すると警告が表示されます。

: flip ( -- )
 6 . ; compile-only \ but not immediate
flip

: flop ( -- )
 flip ;
flop

この例では、 最初に flip のインタプリタ機能を使用します(警告が表示されます)。 flip の 2 番目の使用では、 コンパイル機能を使用します(警告は表示されません)。 この例では、 compile-only が実行時(run-time)ではなくテキスト・インタプリタ時に評価される属性であることもわかります。

テキスト・インタプリタには 2 つの状態があります。 インタプリタ・モード(interpret)は、 遭遇したワードのインタプリタ機能(interpretation semantics)を実行します。 コンパイル・モードでは、 これらのワードのコンパイル機能(compilation semantics)が実行されます。

特に、 : はコンパイル状態に切り替え、 ; はインタプリタ状態に戻します。 これらには、 状態を切り替えるだけの効果である ] (コンパイル状態に切り替える) と [ (インタプリタ状態に切り替える) が含まれています。

: xxx ( -- )
  [ 5 . ]
;

xxx
see xxx

これらの角括弧(brackets)は、 上記の命名慣習の源でもあります。

こちらも参照ください: Interpretation and Compilation Semantics