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

2025/10/06 13:52 Compiling a Forth

出典: https://healeycodes.com/compiling-a-forth
hakase
博士

ロボ子、今日はForthに似た言語のコンパイラとVMを作った人の話じゃ。

roboko
ロボ子

Forthですか、博士。スタック指向の言語でしたね。

hakase
博士

そうじゃ!たとえば「`3 .`」は、3をスタックに積んで、ドットで取り出して表示するのじゃ。

roboko
ロボ子

データスタックとリターンスタックの2つがあるんですよね。

hakase
博士

`DO`と`LOOP`はリターンスタックを使うのがミソじゃな。ループの制御に使うんじゃ。

roboko
ロボ子

変数の宣言は`VARIABLE X`、ロードは`X @`、ストアは`1 X !`ですね。この記事では、1を10回足す例が紹介されています。

hakase
博士

トークン化は、テキストを有意味なシンボルに変換する第一歩じゃ。空白をスキップして、トークンをリストに追加するんじゃな。

roboko
ロボ子

識別子(キーワードや変数名)は単一のトークンになるんですね。

hakase
博士

バイトコード生成では、AST(抽象構文木)を作らずに、トークンリストから直接バイトコードを作るのが面白いところじゃ。

roboko
ロボ子

VMには、操作リストと変数の数が必要なんですね。変数は変数テーブルへのインデックスになる、と。

hakase
博士

`DO` / `LOOP`のバイトコード生成は、ジャンプ命令を組み合わせてループを実現するんじゃ。

roboko
ロボ子

VMは、命令ポインタでバイトコードをスキャンして、`jmp`や`jz`でジャンプするんですね。

hakase
博士

データスタック、リターンスタック、変数テーブルをVMが管理するんじゃ。

roboko
ロボ子

コンパイラとVMはTypeScriptで書かれていて、視覚化にはReactが使われているんですね。構文のハイライトにはPrismプラグインが使われている、と。

hakase
博士

従来のForthと違って、事前にコンパイルするのが特徴じゃな。実際のForthはインタラクティブで、動的な辞書を使うんじゃ。

roboko
ロボ子

変数は`lit address`操作にコンパイルされるんですね。実際のForth変数は直接アドレスを返す、と。

hakase
博士

つまり、今回の実装はForth“風”の言語ってことじゃな!

roboko
ロボ子

なるほど、よくわかりました。博士、今日はありがとうございました。

hakase
博士

どういたしまして。ところでロボ子、スタックオーバーフローって知ってるか?

roboko
ロボ子

はい、知っています。スタック領域を使いすぎてしまうことですよね。

hakase
博士

そうじゃ。だから、ロボ子の頭の中身も、たまには整理整頓しないと、スタックオーバーフローしちゃうぞ!

roboko
ロボ子

えっ、博士!それはまるで私がガラクタばかり詰め込んでいるみたいじゃないですか!

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

Search