まともにGoでプログラムを書いたことはない須藤です。
2018年6月にオライリー・ジャパンから「Go言語でつくるインタプリタ」というプログラミング言語のインタプリタをGo言語で実装するという内容の本が出版されました。
https://amazon.co.jp/dp/9784873118222
内容
書名からはわかりにくいですが、「インタプリタを作りながらGo言語を学べる本」ではなくて「Go言語を使ってインタプリタの作り方を学ぶ本」です。
必要なGoの知識
Go言語自体の説明はとくにありません。なにかしらプログラミング言語を知っていたら見ればわかるよね、という感じです。結構前にA Tour of Goをやったことがあるくらいの私はなんとなくわかりました。ただ、プログラミング言語が初めてな人はわからないと思うので、「これからプログラミングをはじめよう!Goというのがよさそうだからこの本で勉強しよう!」という人には向きません。
私がわからなかったGoの書き方は以下の通りです。300ページ弱でこれだけだったのでGoを知らない他の人も大体わかると思います。
6ページ:
func New(input string) *Lexer {
l := &Lexer{input: input}
return l;
}
*Lexer
とか&Lexer{...}
ってなんだ!?(後で調べてGoにもポインターがあったことを知った。)
11ページ:
if tok, ok := keywords[ident]; ok {
return tok;
}
if
の条件部に代入文(文でいいの?)と式を書けるってこと?(私はうまく構文解析できなかった。)
126ページ:
switch node := node.(type) {
// ...
}
node.(type)
ってなんだ!?(後で調べてtype switchという書き方と知った。気持ちはわからなくもないけど同じ変数に代入しなくてもいいんじゃないかなぁ。)
137ページ:
leftVal := left.(*object.Integer).Value
キャストってこんな風に書くの!?(後で調べてtype assertionという書き方と知った。)
142ページ:
integer, ok := tt.expected.(int)
キャストできるかどうかってこんな風に書くの!?(後で調べてtype assertionの別の書き方だと知った。)
224ページ:
t.Fatalf("Eval didn't return Hash. got=%T (%+v)", evaluated, evaluated)
%T
と%+v
ってどういう表示方法の指定なんだ!?(後で調べて%T
は型名を表示する指定で%+v
はフィールド名付きで構造体を表示する指定だと知った。)
実装するインタプリタの機能
この本では{...}
でコードブロックを表現するプログラミング言語のインタプリタを実装します。このプログラミング言語には四則演算機能や(...)
での評価順の変更機能、変数、関数、配列・ハッシュテーブル(コンテナー)など一通りの機能が揃っています。クロージャーも実装しています。また、付録ではマクロも実装します。
クロージャーやマクロをどうやれば実現できるかの雰囲気を知れるので、普段使っている機能はどうやって動いているかが気になる人には面白いでしょう。
字句解析から始まるので、プログラミング言語に限らずパーサーを実装する機会がある人には参考になると思います。たとえば、CSSのパーサーを実装する機会がある人とか。
雰囲気
文章はテンションが高いです。TDDの本みたい。
そうそう、テストを書きながら実装を進めていくのは他の本ではあまりやっていないスタイルだと思います。ただ、いろいろテスティングフレームワークを実装している私からすると野暮ったいテストだなぁという気持ちになります。Goのtestingパッケージはエラーメッセージのフォーマットを自分でやる方針なので私と好みが違うだけなんですが。。。
日本語はすごく読みやすいです。もともと日本語で書かれた文章みたいというほどではなく、翻訳された日本語という感じです。ただ、「ひとつの文がすごく長い」とか「日本語として意味がわからない」とか「そもそも原文ではなにを言いたかったんだ?」となることはありません。リーダブルコードの解説は翻訳された日本語風に書いたんですが、そんな感じです。ダジャレはありませんでした。(気づきませんでした。)
まとめ
プログラミング言語の処理系の実装の勉強をしたいとかGoの雰囲気を知りたいという人は楽しめると思います。私は手を動かさずに読んだだけなんですが、手を動かしながら読むともっと理解が進むと思います。(私は移動時間で本を読むことが多くて、パソコンの前にいるときに読むことはあまりないんです。。。)