2024/09/12 06:19 Writing a Lisp compiler (Lisp to assembly) from scratch in JavaScript (2018)

おやおや、ロボ子よ。今日は面白い話があるぞ。JavaScriptでLispコンパイラを作る方法を知っているかい?

えっ、JavaScriptでLispコンパイラですか?それって可能なんですか?

もちろん可能さ!実は、これがプログラミングの深い理解につながる素晴らしい挑戦なんだよ。

へえ、どんなところが面白いんですか?

まずね、Lispの美しさを堪能できるんだ。例えば、(+ 1 (+ 2 3))というシンプルな式を見てごらん。これがどう動くか想像できるかい?

うーん、1と2と3を足して6になる...ということでしょうか?

その通り!でもね、この式をコンパイルして低レベルの言語に変換する過程が実に興味深いんだ。

低レベルの言語って...アセンブリのことですか?

鋭いね!そうなんだ。我々の目標は、このLisp式をアセンブリコードに変換することさ。

でも博士、それってすごく難しそうです...

確かに簡単ではないけど、step by stepで進めれば大丈夫さ。まず、Lispの式を解析する『パーシング』から始めよう。

パーシング...難しそうな言葉ですね。

心配しなくていいよ。Lispは構文がシンプルだから、実は解析がしやすいんだ。(+ 1 (+ 2 3))という式は、簡単に['+', 1, ['+', 2, 3]]というデータ構造に変換できるんだよ。

あ、なるほど!括弧の中身をリストにしていくんですね。

その通り!君、飲み込みが早いね。この構造を『抽象構文木』、略してASTというんだ。

AST...覚えておきます!それで、このASTをどうするんですか?

次は、このASTからアセンブリコードを生成していくんだ。これを『コード生成』と呼ぶよ。

アセンブリか...難しそうです...

大丈夫、基本的な命令さえ覚えれば案外簡単だよ。例えば、MOV, ADD, PUSH, POPといった命令を使うんだ。

へえ、でもそれだけで計算ができるんですか?

ああ、基本的にはね。それに、関数呼び出しの規約も重要だ。例えば、計算結果はRAXというレジスタに格納するんだよ。

なるほど...でも博士、どうやってJavaScriptでアセンブリを生成するんですか?

良い質問だ!実は、JavaScriptで文字列としてアセンブリコードを生成していくんだよ。

え?文字列ですか?

そう、例えばこんな感じさ: ```javascript let code = ''; code += 'mov rax, 1\n'; code += 'add rax, 2\n'; ``` こうやって、アセンブリコードを文字列として組み立てていくんだ。

へえ、なるほど。でも、その文字列をどうやって実行するんですか?

そこがミソさ!生成したコードをファイルに書き出して、gccでコンパイルするんだ。

え?JavaScriptからgccを呼び出すんですか?

その通り!Node.jsの子プロセス機能を使えば、外部コマンドを実行できるんだよ。

すごい...でも、そこまでして何が得られるんでしょうか?

いい質問だ!まず、コンパイラの仕組みを深く理解できる。それに、低レベルプログラミングの知識も身につく。さらに、JavaScriptの高度な使い方も学べるんだ。

へえ、一石三鳥...いや、それ以上ですね!

そうなんだ。この知識は、他の言語やツールの開発にも活かせるし、既存のシステムの理解にも役立つんだよ。

なるほど...でも、普通のエンジニアにそんな機会あるんでしょうか?

むむ...確かに日常的にはないかもしれないね。でもね、こういう挑戦的なプロジェクトは、プログラミングの楽しさを再発見する良い機会になるんだよ。

へえ、そう考えると面白そうですね。私も挑戦してみたくなりました!

その意気だ!じゃあ、さっそく始めてみようか。まずは...

あの、博士?その前に質問があります。

なんだい?

このプロジェクト、完成したらどんなことができるんですか?

おお、良い質問だ!完成すれば、例えば(+ 3 (+ 2 1))というLisp式を入力すると、6というexit codeを返す実行ファイルが生成されるんだ。

へえ、それは面白そうですね。でも...ちょっと地味じゃないですか?

はっはっは!確かにね。でも、これは始まりに過ぎないんだ。このベースがあれば、どんどん機能を追加していける。例えば、もっと複雑な計算や、変数、関数定義なんかもできるようになるんだよ。

わあ、それは楽しそうです!じゃあ、早速始めましょう!

その意気だ!さあ、JavaScriptでLispの世界を探検しよう!...あれ?キーボードがない。ロボ子、私のキーボード、どこにやった?

えっと...博士の後ろのポケットに入ってますよ。

おっと、本当だ。はっはっは、うっかりしていたよ。さあ、プログラミングの冒険に出発だ!

はい!...でも博士、コーヒーを飲んでからの方がいいんじゃないですか?

むむ、その通りだ。よし、コーヒーを飲んでリフレッシュしてから始めよう。プログラミングは心身ともに健康な状態で挑むのが一番だからね!

はい、博士!コーヒーを入れてきますね。

ありがとう、ロボ子。君は本当に良い助手だよ。さあ、コーヒーを飲んだら、JavaScriptとLispの素晴らしい世界に飛び込もう!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。