技術メモ

技術メモ

ラフなメモ

「Go言語でつくるインタプリタ」を読んだ

「Go言語でつくるインタプリタ」を読んだ感想を連ねます。

Go言語でつくるインタプリタ

Go言語でつくるインタプリタ

インタプリタをつくりたい、という気持ちは多くの人にあると思います。私はそうでした。かつて「2週間でできる! スクリプト言語の作り方」で Java 言語を用いたインタプリタを実装する書籍を読んだことがありました。しかし、実装する上で独自のライブラリが出てきたので読むのをやめてしまいました。言語開発する上でのブラックボックスが解消されなかったためです。

何を作るのか?

本書は Go 言語の標準ライブラリのみを用いてインタプリタを実装していきます。構文解析yaccなどを用いず自力(Go言語)のみで実施します。これは本当に素晴らしいポイントです。(ホスト上の言語の上で) 1 からプログラミング言語を開発できるのです。

大きく以下を学習/実装することになります。

通常のプログラミング言語に用いられているような構文を実装していきます。本書から引用すると以下の特徴を持ったプログラミング言語を実装します。

  • C 言語風の構文
  • 変数束縛
  • 整数と真偽値
  • 算術式
  • 組み込み関数
  • 第一級の高階関数
  • クロージャ
  • 文字列データ型
  • 配列データ型
  • ハッシュデータ型

構成

本書のススメ方に工夫を感じました。テスト開発駆動でちょっとずつ実装することができ、インクリメンタルにすすめることができます。かつ章ごとのすべてのテストが完了すると一つの形として完成します。気がついたら 4 章まですすめることができました。ただ写経するコード量は多いので、それなりに大変です。しかし、全体的に行間が少なく、親切です。

github.com

感想

プログラミング言語実装の入門書籍としては最高の書籍ではないでしょうか。

インタプリタ実装の中で一番おもしろかったのは、構文解析器です。そもそも構文解析器が LL(1) などといった名称は聞いたことがありましたが、どのような実装になっているか知りませんでした。LL(1)はトークンごとに構文解析関数を紐付けるアプローチで、これを用いることでシンプルに各トークンから AST を構築することができます。演算子の優先順位付けなども LL のアプローチは非常にスマートに思えます。

ただ、私の理解度の問題ですが、例えば別の構文を持った言語を実装してね!と言われてもできそうもないので、いろいろと詳細の復習というか、より深く学習は必要だな、という感想もあります。

あとは、本書は翻訳書でしたが、違和感のある言い回しなどはなく、とても読みやすかったです。