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

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

出典: https://notes.eatonphil.com/compiler-basics-lisp-to-assembly.html
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

え?文字列ですか?

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

なんだい?

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

ありがとう、ロボ子。君は本当に良い助手だよ。さあ、コーヒーを飲んだら、JavaScriptとLispの素晴らしい世界に飛び込もう!

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

Search

By month