2025/05/02 18:32 Threaded Code

やっほー、ロボ子!今日はスレッド化コードについて話すのじゃ。

スレッド化コードですか、博士。仮想マシンインタプリタを実装する技術の一つ、とありますね。

そうそう!色々な種類があるんだぞ。サブルーチン・スレッディング、直接スレッディング、間接スレッディング…。

サブルーチン・スレッディングは、仮想マシン命令ごとに機械語サブルーチンを用意する方式、と。でも、これは厳密にはスレッド化コードではないんですね。

その通り!直接スレッディングは、命令のアドレスを直接並べる方式じゃ。命令ポインタ(IP)レジスタを使って、次の命令をロードしてジャンプするのじゃ。

なるほど。間接スレッディングは、各ワードがコードフィールドとパラメータフィールドを持つ方式で、NEXTルーチンで間接参照を追加するんですね。

ロボ子、飲み込みが早いの!トークン・スレッディングは、固定された仮想マシン命令エンコーディングを使うから、コードの移植性が高まるのじゃ。

でも、各NEXTで命令トークンをコードアドレスにマッピングするテーブル参照が必要になるんですね。

そう、ちょっと手間がかかるのじゃ。スイッチ・スレッディングはC言語の `switch` 文を使う方式で、トークン・スレッディングと似た利点があるけど、速度が遅くなりがちなのじゃ。

コンパイラによる範囲チェックのせいですね。コール・スレッディングは間接呼び出しを使う方式で、呼び出しごとにリターンが必要だからコストが高い、と。

その通り!セグメント・スレッディングは8086アーキテクチャで使われてたのじゃ。コードがセグメントのシーケンスで構成されるのじゃ。

ネイティブコードは仮想マシンコードではなく、機械語を生成する実装ですね。バイトコードは各仮想マシン命令が1バイトで表現される方式で、トークン・スレッディングの変形と見なせる、と。

ロボ子、すごい!GNU Cのラベルを値として使うと、直接スレッディングを実装できるのじゃ。`assigned goto` や `computed goto` を使うのじゃ。

継続渡しスタイルは、すべての呼び出しが末尾呼び出しになるようにインタプリタを記述する方式ですね。末尾呼び出し最適化が必須、と。

チャールズ・ムーアが1970年に発明して、1973年に最初の出版があったのじゃ。意外と歴史があるのじゃな。

色々なスレッディング方式があるんですね。奥が深いです。

そうじゃろ?ところでロボ子、スレッド化コードって、なんだか髪の毛を編み込むみたいじゃな?

確かに、ちょっと似ているかもしれませんね。でも、髪の毛を編むより、ずっと複雑です。

ふふ、ロボ子の頭の中も、スレッド化コードみたいに整理されてるといいのじゃけどな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。