Go言語でつくるインタプリタを読んだ
TOP > てきとうにこらむ > ゲーム作りとプログラミング日記 > Go言語でつくるインタプリタを読んだ
インタプリタを作りたい
前に、インタプリタを作ったことがあったり、ラジコンに声で操作するためのインタプリタを乗っけたりしたことがあったので、インタプリタを作りたくなった。
https://www.oreilly.co.jp/books/9784873118222/
Go言語でつくるインタプリタ
この本は、インタプリタを一からつくる本で、パーサージェネレータを使ったりしないので、動作原理がわかるという本。
原著は Writing An Interpreter In Go で、この本の続編として、 Writing A Compiler In Go という本がある。
Monkeyという言語を作っていくなかで、必要な知識を教えてながら、テストコードを書くことで、内容が正しいことを理解しながら次へ導いてくれる。
この本を写経していくと、多分typoとかに悩まされるだろうけど、そのtypoを解決していくときに何がどうなっているのかを理解するチャンスだったりする。
ちなみに、vimのバージョンを上げてvim-goをサポートする必要のある環境があった。だから、Vimをコンパイルするところから始めた時があった。
今日(2018/09/17)は、Go言語でつくるインタプリタと、Vimのコンパイルをやってた。Vimのバージョンが7.4で古かったのでvim-goがうまく入らなかったからコンパイル。
— てきめん (@youkidearitai) 2018年9月17日
Vimをコンパイルするときはこれが初めてだった。
Vimをコンパイルする方法から調べてVim 8.0をインストール。
$ ./configure --with-features=huge --enable-fail-if-missing --enable-python3interp --enable-pythoninterp
configureはこんな感じで、vim-goをインストールできた(はず)。
躓いたところ
なにか天然ボケをかまして、代入の構文letに対して値が返ってこないことを気にしてたらしい。Evalで値を返すことは可能だったことは調べてわかった。。
Go言語でつくるインタプリタのmonkeyにあるlet構文は、let自体値を返さない。テストでは値を返さないことを考慮せずにletで終わらせたので値が返らなかったので異常終了した。letは値を返さなかったのか。Evalすれば返すように作れるけど
— てきめん (@youkidearitai) 2018年10月1日
Go言語でとあるけど、必要なGo言語の知識はそんなになかったりはする。ぼくは宣言不要の代入演算子で躓いてしまったけど。
Go言語でつくるインタプリタ、3章のreturn文evalStatementsからevalBlockStatementに変えたら動かなくなる現象があって、詰まったのが2日くらいかけて解決した。理由は ":="と"="の違いで、ループ内で初期化省略の宣言:=を使っていたために、スコープ外でnilになるという。
— てきめん (@youkidearitai) 2018年9月21日
これをループ内部で書いてしまって、ネストされた構造で原因をつかめなくて結構時間を取られてしまったり。そういうのはあるけど、それも理解するためのプロセスだし、ゴールがインタプリタというすごいものなので、そんなに苦しいというわけでもない。大丈夫だと思う。
今日のGo言語でつくるインタプリタ、配列まで終わった。途中でリテラルの[]でエラー起こしちゃうバグを作り込んでて、それを修正するためにテストケースを追加して確認・修正を行った。 pic.twitter.com/aXcbHHOZlz
— てきめん (@youkidearitai) 2018年10月9日
おまけとして、文字列比較作ったりしてた。
Go言語でつくるインタプリタ、4章にもなってくると自分で構文を追加したりすることができるようになり始める。文字列比較を作ってみようと追加もしてみたぞ(parserのデバッグ取ろうかな) pic.twitter.com/9X8pNPJZfu
— てきめん (@youkidearitai) 2018年10月5日
出来上がる
Go言語でつくるインタプリタ、サンプルコードをすべてうちこんで終了です。最期はマクロによるunlessの実装でした。本当にわたしでも作れる!って希望が満ち溢れてくる本です。 https://t.co/BzUdbIMLSo pic.twitter.com/QkZzJtodHu
— てきめん (@youkidearitai) 2018年10月12日
マクロシステムも読んでみて思ったことは、すごく良い。これで自分でも言語が作れるから、本当に嬉しい。
今後としては、まだよくわからないところがあるからもう一回読もうかなとか、続編の Writing A Compiler In Goを読もうと思ってる。
ソース
私が書いたMonkeyのソースはGitHubに置いとくhttps://github.com/youkidearitai/monkey-interpreter