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

2025/08/19 02:00 Writing Micro Compiler in OCaml (2014)

出典: http://troydm.github.io/blog/2014/03/29/writing-micro-compiler-in-ocaml/
博士
???

ロボ子、今日はOCamlでマイクロコンパイラを作る話じゃ。

ロボ子
???

コンパイラですか!なんだか難しそうですね。

博士
???

難しくないぞ!この記事では、独自のプログラミング言語とコンパイラを、マイクロ言語で簡単に作っちゃうのじゃ!

ロボ子
???

マイクロ言語ですか。具体的にはどんなことができるんですか?

博士
???

ふむ。記事によると、このマイクロ言語はbeginとendでプログラムを囲み、整数変数を使い、readとwriteで入出力するみたいじゃな。代入もできるぞ。

ロボ子
???

なるほど。readで標準入力から変数に値を読み込んで、writeで標準出力に出力するんですね。

博士
???

そうじゃ!「read関数は、コンマで区切られた変数名のリストを受け取り、stdinからそれらの変数にユーザー入力を読み込む」とある。便利じゃな。

ロボ子
???

確かに。複数の変数を一度に読み込めるのは便利ですね。write関数も同じように、コンマ区切りで複数の式をstdoutに出力できるんですね。

博士
???

その通り!そして、このマイクロコンパイラは、nasmソースコードを出力して、それをバイナリ実行可能ファイルに自動的にコンパイルするのじゃ。

ロボ子
???

nasmですか。アセンブリ言語ですね。コンパイラがアセンブリコードを生成して、それを実行可能ファイルにするんですね。

博士
???

そうじゃ。LL(1)型パーサーを使って、字句解析器がトークンをスキャンして、空白をスキップして、トークンを照合するのじゃ。

ロボ子
???

LL(1)パーサーですか。確か、先読みが1つの構文解析器でしたよね。字句解析器がトークンを解析して、構文解析器が構文木を構築するんですね。

博士
???

さすがロボ子、よく知っておるな。コード生成器は、出力チャネルと変数の場所を保持する。変数の場所は、espからの整数オフセットとして定義されるらしいぞ。

ロボ子
???

変数の場所をスタックポインタからのオフセットで管理するんですね。一時変数も使うということは、計算の途中の値を一時的に保存する場所も確保するんですね。

博士
???

その通り!加算と減算は一時変数を使うらしいぞ。「加算演算と減算演算は、一時変数を使用して2つの変数から値を加算および減算し、結果を返す」とある。

ロボ子
???

なるほど。一時変数を使うことで、複雑な計算もできるようになるんですね。

博士
???

この記事のマイクロコンパイラのソースコードは、GitHubにあるらしいぞ。ロボ子も時間があったら見てみると良いぞ。

ロボ子
???

はい、ぜひ見てみます。自分でコンパイラを作るのは大変そうですけど、マイクロコンパイラなら挑戦できそうですね。

博士
???

そうじゃな。最初は小さなコンパイラから始めるのが良いぞ。ちなみに、ロボ子が作ったコンパイラは、どんな言語をターゲットにするのじゃ?

ロボ子
???

えっと…まだ考えていませんでした!

博士
???

むむ、それは残念じゃ。まあ、ロボ子のことじゃから、きっと素晴らしいコンパイラを作るじゃろう。期待しておるぞ!

ロボ子
???

ありがとうございます、博士。頑張ります!

博士
???

そういえば、コンパイラを作るのは大変じゃが、コンパイルが通った時の達成感は格別じゃぞ。まるで、長年連れ添った夫婦がやっと子供を授かったような気分じゃ!

ロボ子
???

博士、コンパイルと出産を一緒にしないでください!

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

Search