Writing An Interpreter In Go その0
コンパイラの勉強がしたくなったので、Thorsten Ballの"Writing An Interpreter In Go"を読むことにした。オライリーから「Go言語でつくるインタプリタ」として日本語版の書籍も出ているが、著者のサイトから続編にあたる"Writing A Compiler In Go"とセットで買うとちょっと安くなるのでいい機会だと思って英語版を入手。Interpreterを読み終わったらCompilerも読む予定。
なぜコンパイラか
足掛け10年ほどコードを書いているが、自分の書いたコードがどうやってバイナリになって実行されているのかの知識が欠落しているという自覚があったため。学生の頃に近しい内容の講義を取ったような記憶もあるが、試験終了と共にさっぱり忘れてしまった。
最初は、Rui Ueyama氏のWeb本(低レイヤを知りたい人のための Cコンパイラ作成入門)とGitHubを参考にCコンパイラを書いていた。ただ、最近C言語書いてなくてコーディング速度が上がらないし、メモリを手動確保する関係で油断するとSEGVするしでだんだんつらくなってきて、結局四則演算ができたところで断念した。最後までやりきれば相当力がつくと思うが…
後輩氏とラーメン屋に向かう車中で冬休みの宿題が欲しいという話になり、ここを見ながらCのコンパイラを書いてみようということになった https://t.co/GaKHqDE3nU
— あみだ (@_nibral) 2018年12月28日
C言語でコンパイラ写経するのつらくなってきた、油断するとすぐSegmentation faultする
— あみだ (@_nibral) 2019年1月4日
写経した9ccで四則演算と括弧の処理ができるところまで到達した。「a=3; b=4; c=8; return c * (a + b);」 という文字列を渡すと56を出力するバイナリができる。https://t.co/AdekyI1olL
— あみだ (@_nibral) 2019年1月4日
どんな本なのか
Writing A Compiler In Go | Thorsten Ball https://t.co/JghZ1G0r3p C言語のコンパイラをC言語で書くのはいまいちモチベ上がらないから、オリジナルの言語をGolangで書く本を買った
— あみだ (@_nibral) 2019年1月9日
Monkeyという架空の言語で書かれたソースコードを解析し、実行するインタプリタを作成する。架空の言語といっても、変数宣言や制御構文などプログラミング言語として一通りの機能は揃っている模様。
// Bind values to names with let-statements let version = 1; let name = "Monkey programming language"; let myArray = [1, 2, 3, 4, 5]; let coolBooleanLiteral = true; // Use expressions to produce values let awesomeValue = (10 / 2) * 5 + 30; let arrayWithValues = [1 + 1, 2 * 2, 3]; // Define a `fibonacci` function let fibonacci = fn(x) { if (x == 0) { 0 // Monkey supports implicit returning of values } else { if (x == 1) { return 1; // ... and explicit return statements } else { fibonacci(x - 1) + fibonacci(x - 2); // Recursion! Yay! } } }; https://interpreterbook.com/#the-monkey-programming-language より
モチベーション維持のために、その日取り組んだ内容のメモを書くことにする。書いたコードはGitHubに置く。