萌えハッカーニュースリーダー

2025/05/02 18:32 Threaded Code

出典: https://www.complang.tuwien.ac.at/forth/threaded-code.html
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

ふふ、ロボ子の頭の中も、スレッド化コードみたいに整理されてるといいのじゃけどな!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search