1 minute read

Go 言語で Monkey 言語のインタプリタをつくった

『Go 言語でつくるインタプリタ』という本がある。Go言語で標準パッケージ以外を利用せずにインタプリタを作ることを目標にした本だ。これを読み終え、実装もしおえた。

515hikaru/monkey-go: Go言語で作るインタプリタを実際に作るリポジトリ

発売してすぐに買ったから家には6月からあったと思うけど、全部終えるのに結局3ヶ月以上かかった。といっても買ってから3時間くらいで1章を読んで、2章を本腰を入れて読み始めたのは一週間前のことだから、実質実装する時間を含めて読んだのは24時間1くらいだと思う。

技術書を最初から最後まで2読んだのはいつ以来だろうか。わからないけど、たぶん1年は前のことじゃないかと思う。

感想

TDD

あまり前面に押し出していないが、この本は全行程をTDD(テスト駆動開発)で行っている。ものづくりの際にTDDがいかに有効かということを実体験できたのがいい誤算だった。

テストを先に書く、というのは自分が ユーザーの視点に立って 欲しいものを決める、ということであり、あとでそれを実現する実装を書くということを実体験すると、ユーザーの期待通りのもの(つまりわたしが欲していたもの)が得られる。頭ではわかっていたが、やはり実体験すると違う。

作者は「テストがどのように失敗するか」も本のなかで示してくれているので、実際に実行したエラーが自分の環境で起きたものとテストコードが間違っていることがわかったりする。

ほとんどのコードを示してくれているので、実装で困ることはないと思う。Go言語の文法の説明は基本的にないのでもしかしたら『スターティングGo言語』くらいは眺めておいたほうがいいかも。あと普通に書き写しているとLintツールに怒られることがあるようなコードではある。

Go言語の開発体験

わたしは Go 言語では競技プログラミングの簡単な問題を解く、以外の使い方をほとんどしたことがなかったので、なにかひとつのものを Go 言語で作ったのは初めてだ。

最初は成功しているか失敗しているかわからない処理については幾度も幾度も if foo, ok := ...; ok {} と書いていたのとか非常に違和感3があったが、そのうち慣れた。ただ、正直構文解析のテストコードを書いているときは飽きた。!ok のときに何度も似たようなエラーメッセージを t.Errorf("...") と書いたので。ただ、これは本の通りにやったからであって、定数でフォーマット文字列をあらかじめ用意しておくとかしておけば多少は緩和されたのかもしれない。

ただ先述のように Go 言語の強みとかには特に触れられていない(たとえば並行処理は本書の中で出てこない)ので、Go言語だからこういう機能開発が楽にできる、みたいな体験はなかった。もちろん、Monkey言語で実装したいデータ型が Go 言語には既にあるから楽、という側面はあったが、それは単にデータ型が定義されているというだけの話だ。

動く原理の探求することの楽しさ

インタプリタがどのように動作するのか、言語処理系はソースコード(それはつまりなんらかの規則に則った文字列)をどのように “解釈” するのかを自分がソースコードを書いて理解するというのが楽しかった。今までプログラミング言語はアプリオリに与えられているもので、自分はユーザーでしかいられないという感覚があった4

しかし、自分で作ることで単に与えられたものではなく誰かが作ったものであること、そして「自分にも作れるものであること」(なぜなら実際に作ったからだ)が実感できた今となっては、そういう疑念は払拭された。

その動作原理を一応理解している今、わたしは let foo = 12;let が気に入らないと思ったら foo let = 43;let という変数を定義させることもできるのだ。しないけど。

ものづくりの楽しさ

やはりものを作るのは楽しい。眼の前で動くものならなおさらだ。

久々に仕事以外でものづくりができた。かなり満足だ。

まとめ

  • Go言語を学びたい人にはあまりおすすめではない
  • Go言語を少しかじったことある人でインタプリタや言語処理系が「なぜ動くか」に興味がある人には非常におすすめ
  • 「なぜ」を知りたい人におすすめ
  • (主眼ではないけど)TDDも実体験できる

  1. 仕事してからはどうしてもせいぜい1時間くらいしか時間が使えないので、休日を2日、平日を5日に+αで、8+8+1*5+3で24時間 [return]
  2. 付録のマクロシステムは実装する気になれなくて飛ばしたけど) [return]
  3. 特有のイディオムに見慣れていなかったというのもあると思う。 [return]
  4. 情報系の人がコンパイラを作る講義があって、みたいな話を聞くたびに羨ましいなと思ったものだ。 [return]