Go言語でつくるインタプリタを写経した

『Go言語でつくるインタプリタ』の第4章までの写経が終わったので感じたことなどをメモする。

www.oreilly.co.jp

モチベーション

2023年に入って何か新しい言語を勉強しようと思い立ち、RustとGoで悩んでGoを選択した。 CLIやツールを作ろうとしたときに第一候補になるような言語を身に着けたかった、というのが大きい。

......昨年まではHaskellを勉強していて、そのハードっぷりに自分にはまだ早かったという諦観があり、(比較的)かんたんそうなGoに救いを求めた、とも言える。

まずは文法を覚える、ということで『初めてのGo言語』を買って写経しながら読んだ。

www.oreilly.co.jp

これはとてもいい本だった。Goの文法が少ないという点も相まって、1冊にGoの仕様がギュッと詰まっている。読んでいて『Kotlin in Action』を思い出すなどした.....第2版出るのかな。

Why 『Go言語でつくるインタプリタ』?

『初めてのGo言語』を一周したあとで何をすべきか考えた。自分は「作りながら覚える」ということにストレスを感じるタイプなので、あと1,2冊は本を読んでおきたいが、何を読もう。

『Go言語でつくるインタプリタ』は(たぶん)2020年ころに買って、とりあえず読むだけ読んで満足して本棚に安置していた。(この本のすごいところは読むだけでも楽しいというところ)

そういえばこの本はGoだな、ということで2月末から写経を開始した。

感想とか

読むだけで面白い本なので、当然ながら写経しながら読むとより面白い。 この本はGo言語を使って「Monkey」言語のインタプリタを実装していく、という内容になっている。 第4章まで進めるとMonkeyは配列やハッシュ(JavaでいうMap)、高階関数までをも扱えるプログラミング言語になる。

写経することによって、字句解析をして、抽象構文木(AST)を作って、評価する、という一連の流れを「体験」することができる。

全体としては高度な内容を扱っていると思うのだが、ステップ・バイ・ステップでかなり詳細に解説してくれるので分かった気になれるし、実際に写経で手を動かすことで理解も深まる。

字句解析の時点では正直あまり楽しいものではないのだが、ASTの構築や評価で面白さが跳ね上がる。とくに評価については、たった数行を追加するだけで期待通りの挙動が手に入ることが多く、不思議さもあった(言い換えると実装を理解するのが少し大変だった)。

得たもの

まずはGoの基礎的な文法に対する「慣れ」を得ることができた。『初めてのGo言語』の直後では考え考えコードを書く感じだったが、いまではstructを作るとか、関数・メソッドを書くことに対するコストがかなり下がったと感じている。

関数・メソッドのキーワード、KotlinではfunGoではfuncだけれど、そこの混乱もなくなった。

あとはテストの書き方もなんとなく理解できた。 GoではテスティングフレームワークもGoに含まれているので、依存を追加することなくテストが書ける。

例に漏れずテストでもGoらしく(ライブラリを使わなければ)オブジェクトの比較なんかは自力で実装する必要があるので、テストの写経は大変だった。『Go言語でつくるインタプリタ』ではテストをかなり手厚く書きながら開発を進めていく。これ自体は良いことだとは思うけれど。

上述した字句解析、抽象構文木、評価という知識・概念についても学べたが、100%理解できたとは言えず、かつ完全に覚えているわけではないので、かなり穴が空いた状態だと思う。

が、こういうのはたぶん「経験した」というのが大事だと思うので、これはこれで良いのだと考えている。

次にやること

やることというかやっているのは『Go言語プログラミングエッセンス』の読み進め。

gihyo.jp

まだ3章までしか読んでないけれど、とにかく読みやすいと感じる。Goらしい文法に対して「どうしてそうなっているか」のコメントが個人的にはとてもありがたい。

この本を読み進めながら、Slack APIを叩くCLIか何か作ろうかな。