https://www.amazon.co.jp/Writing-Interpreter-English-Thorsten-Ball-ebook/dp/B01N2T1VD2
タイトル通り、インタープリターをGoで作ろうというものである。
最近ちょっとGo言語に興味がありやっている。
Web業界ではもはや割とメジャーな言語になっている言語で、ちょっとだけJsonを返すWebAPIくらいはつくったことがあるが、他の人が書いたコードを見様見真似でいじっているだけでそれほどできるわけではない。もっとも、Go言語のコンセプトとしてそこまで難しい言語ではないので、表層だけ理解して使うのはできそうだ。
以前からプログラミング言語はどのように文を理解しているのかは漠然とした興味があった。しかし、私立文系学部卒なのでネットで読める解説などは正直内容を重く感じていた。この本は割と平易に書かれているように思える。英語もわかりやすい。
まず、文章をプログラミング言語が理解するために、Lexarというものをつかって文の要素をtokenに変換する。日本語で言うと字句解析器というらしい。たとえば以下のような表現は
let five = 5;
LET : "let"
IDENT : "five"
ASSIGN : "="
INT :"5"
SEMICOLON: ";"
EOF: ""
というように分解される。
そしてこのように解析され分類された字句から意味を読み取るためにParser(日本語で言うと構文解析器)を通し抽象構文木に変換する。
構文解析も、いくつかの方式があり本書ではPratt Parserというものを採用している。
というような感じで解説とともにソースコードが提示されプログラミング言語が完成していく。
本書を読むと意外とプログラミング言語って作れそうだなと思うが、現実のプログラミング言語はこれ以上に複雑な理論を使っているのだろうなと思った。
最近はこれを写経してGoとインタープリターの勉強の両方をやっている。最も、インタープリターかけても僕の仕事の領域とはそれほど関係ないのだが。
さて、本書を僕は原著の英語で読んだが、このような未知分野の勉強を母語でやらないのはなんか理解能力にだいぶ差が出る気もする。英語だと読む速度もとても落ちるので悩みどころである。最近はトルーマン・カポーティーの冷血を読んでいる。文学は難しいのでいつ読み終われるだろうか...