Previous: , Up: Carnal words   [Contents][Index]


6.30.3 Threading Words

ここで使用される用語は、 間接スレッド Forth システム(indirect threaded Forth systems)に由来しています。 間接スレッド Forth システムでは、 ワードの XT はワードの CFA (コード・フィールド・アドレス) によって表されます。 CFA は、 コード・アドレスを含むセルを指します。 コード・アドレスとは、 ワードを呼び出す実行時のアクションを実行するマシン・コードのアドレスです(たとえば、 dovar: ルーチンは、 ワード(変数)の本体のアドレスをスタックにプッシュします)。

以下のワード群は、 Gforth のコード・フィールドやコード・アドレスやその他のスレッド機能へのアクセスを提供します。 これにより、直接スレッドと間接スレッドの違いは、 多かれ少なかれ抽象化されます。

Gforth 0.7 までは、 ワードの種類を知るのに、 コード・アドレス(さらに、 does> で定義されたワードの場合は、 >does-code によって返されるアドレス)で十分でした。 ただし、 Gforth-1.0 以降、 少なくとも、 compile,name>compile のようなワードの振る舞いや実装は、 Header methods で説明されているように独立して決定できます。

以下のワード達は、 コード・フィールドを作成し、 そして、 同時にヘッダー・メソッドを初期化します:

hmcopy, ( xt –  ) gforth-experimental “hmcopy-comma”

ヘッダーの構築中に、 コード・フィールドを割り当て、 コード・フィールドとヘッダー・メソッドを設定するためのプロトタイプとして xt を使用します。

docol, ( ) gforth-1.0 “docol,”

コロン定義のコード・アドレスを書き込む。

docon, ( ) gforth-1.0 “docon,”

CONSTANT のコード・アドレスを書き込む。

dovar, ( ) gforth-1.0 “dovar,”

CREATE されたワードのコード・アドレスを書き込む。

douser, ( ) gforth-1.0 “douser,”

USER 変数のコード・アドレスを書き込む。

dodefer, ( ) gforth-1.0 “dodefer,”

defer されたワードのコード・アドレスを書き込む。

dofield, ( ) gforth-1.0 “dofield,”

field のコード・アドレスを書き込む。

dovalue, ( ) gforth-1.0 “dovalue,”

CONSTANT のコード・アドレスを書き込む。

doabicode, ( ) gforth-1.0 “doabicode,”

ABI-CODE 定義のコード・アドレスを書き込む。

does> で定義されたワードの場合、 hmcopy, を使用してください。

または、 create-from のような高レベルのワードを使用します(see Creating from a prototype)。

以下のワード群はヘッダー・メソッドが導入される前に設計されたものであるため、 Gforth でさまざまなワード・タイプを処理する最良の(推奨される)方法ではありません。

間接スレッド Forth では、 ' name @ を使用して name のコード・アドレスを取得できます。 Gforth では、 スレッド化方式とは関係なく、 ' name >code-address で取得できます。

threading-method ( – n ) gforth-0.2 “threading-method”

エンジンが直接スレッドの場合は 0。 注意: これはイメージの存続期間中(lifetime)に変更される可能性があることに注意してください。

>code-address ( xt – c_addr  ) gforth-0.2 “>code-address”

c-addr は、 ワード xt のコード・アドレスです。

code-address! ( c_addr xt –  ) gforth-obsolete “code-address!”

コード・アドレス c-addr のコード・フィールドを xt に変更します。

さまざまな定義ワードによって生成されるコード・アドレスは、 以下のワード群によって生成されます:

docol: ( – addr  ) gforth-0.2 “docol:”

コロン定義のコード・アドレスを書き込む。

docon: ( – addr  ) gforth-0.2 “docon:”

CONSTANT のコード・アドレスを書き込む。

dovar: ( – addr  ) gforth-0.2 “dovar:”

CREATE されたワードのコード・アドレスを書き込む。

douser: ( – addr  ) gforth-0.2 “douser:”

USER 変数のコード・アドレスを書き込む。

dodefer: ( – addr  ) gforth-0.2 “dodefer:”

defer されたワードのコード・アドレスを書き込む。

dofield: ( – addr  ) gforth-0.2 “dofield:”

field のコード・アドレスを書き込む。

dovalue: ( – addr  ) gforth-0.7 “dovalue:”

CONSTANT のコード・アドレスを書き込む。

dodoes: ( – addr  ) gforth-0.6 “dodoes:”

DOES> で定義されたワードのコード・アドレス。

doabicode: ( – addr  ) gforth-1.0 “doabicode:”

ABI-CODE 定義のコード・アドレスを書き込む。

set-does> で定義されたワード X の場合、 コード・アドレスは dodoes: を指し、 そして、 ヘッダー・メソッドの >hmextra フィールドには、 X の本体(body)アドレスをプッシュした後に呼び出されるワードの xt が含まれます。

ワードが DOES> で定義されたワードであるかどうか、 そしてそのワードが execute する Forth コードを知りたい場合は、>does-code で以下のことがわかります:

>does-code ( xt1 – xt2  ) gforth-0.2 “>does-code”

xt1set-does> で定義されたワードの子の実行トークンである場合、 xt2set-does> に渡される xt 、 つまり xt1 実行時に実行されるワードの xt です(ただし、 最初に xt1 の本体(body)アドレスがプッシュされます)。 xt1set-does> で定義されたワードに属していない場合、 xt2 は 0 です。

結果の xt2set-does> (推奨) とともに使用して、 もっとも最新のワードを変更するか以下を使用して変更できます

does-code! ( xt2 xt1 –  ) gforth-0.2 “does-code!”

xt1xt2 set-does> で定義されたワードに変更します。

任意のワードを変更するためには…

以下の 2 つのワードは、 >code-address>does-codecode-address!does-code! を一般化します:

>definer ( xt – definer  ) gforth-0.2 “>definer”

definer (definer;定義者)は、 xt の定義方法を示す一意の識別子です。 異なる does> コードで定義されたワードには、 異なる definer が存在します。 definer は比較や definer! で使用できます。

definer! ( definer xt –  ) gforth-obsolete “definer!”

xt で表されるワードは、 その振る舞いを definer に関連付けられた振る舞いに変更します。

Code-address!does-code!definer! は、 opt-compile, メソッドをそのワード型用のやや汎用的なコンパイラーに更新します(特に、 プリミティブに対しては、 プリミティブ固有の peephole-compile, (peephole-compile;のぞき穴最適化コンパイル)ではなく、 遅い general-compile, (一般コンパイル)メソッドが使用されます)。


Previous: Header methods, Up: Carnal words   [Contents][Index]