自由帳

@_nibral の技術ブログ

Writing An Interpreter In Go その0

コンパイラの勉強がしたくなったので、Thorsten Ballの"Writing An Interpreter In Go"を読むことにした。オライリーから「Go言語でつくるインタプリタ」として日本語版の書籍も出ているが、著者のサイトから続編にあたる"Writing A Compiler In Go"とセットで買うとちょっと安くなるのでいい機会だと思って英語版を入手。Interpreterを読み終わったらCompilerも読む予定。

interpreterbook.com

www.oreilly.co.jp

なぜコンパイラ

足掛け10年ほどコードを書いているが、自分の書いたコードがどうやってバイナリになって実行されているのかの知識が欠落しているという自覚があったため。学生の頃に近しい内容の講義を取ったような記憶もあるが、試験終了と共にさっぱり忘れてしまった。

最初は、Rui Ueyama氏のWeb本(低レイヤを知りたい人のための Cコンパイラ作成入門)とGitHubを参考にCコンパイラを書いていた。ただ、最近C言語書いてなくてコーディング速度が上がらないし、メモリを手動確保する関係で油断するとSEGVするしでだんだんつらくなってきて、結局四則演算ができたところで断念した。最後までやりきれば相当力がつくと思うが…

どんな本なのか

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に置く。

github.com