Next: , Previous: , Up: Engine   [Contents][Index]


15.2 Threading

GNU C の「ラベルとしての値」の拡張機能(gcc-2.0 以降で有効;see Labels as Values in GNU C Manual)により、 &&label と書くことにより、 label のアドレスを取得できるようになります。 このアドレスは、 goto *address のようなステートメントで使用できます。 つまり、 goto *&&xgoto x と同じです。

この機能を使用すると、間接スレッド化された NEXT は以下のようになります:

cfa = *ip++;
ca = *cfa;
goto *ca;

上記の言葉に馴染みのない人のために説明すると、 ip は Forth 命令ポインタです。 cfa (コード・フィールド・アドレス) は標準 Forth の実行トークンに対応するもので次に実行されるワードのコード・フィールドを指します。 そこからフェッチされた ca (コード・アドレス)は、 プリミティブやコロン定義ハンドラー(docol)などの実行可能コードを指します。

直接スレッド化はさらに簡単です:

ca = *ip++;
goto *ca;

もちろん、 我々は、 NEXTNEXT1 (cfa を取得した後の NEXT の部分) というマクロに、 全体をきちんとパッケージ化しています。