Go でインタプリタを 書いてみよう

Fd1ded499f7831ddb01b0d23eb9b64c2?s=47 Kenshi Kamata
November 05, 2017

Go でインタプリタを 書いてみよう

Go Conference 2017 Autumn Lightning Talk

Fd1ded499f7831ddb01b0d23eb9b64c2?s=128

Kenshi Kamata

November 05, 2017
Tweet

Transcript

  1. Go でインタプリタを 書いてみよう Go Conference 2017 Autumn

  2. 自己紹介 • 鎌田 健史 • @knsh14 (twitter, GitHub) • KLab

    株式会社 ◦ Unity のエディタ拡張書いたり ◦ JavaScript でゲーム書いたり • 技術書典ではバイトしてました
  3. なにをしたのか • Writing An Interpreter In Go 読んだ ◦ https://interpreterbook.com/

    • 実際にインタプリタ作ってみた • 約1400行 でインタプリタを書こう! ◦ テストコード込だと2500行くらい
  4. DEMO let x = 0; let array = [0, 10,

    20, 30, 40]; array[1]; let fib = fn(x) { if(x == 0) { 0; } else { if (x == 1) { 1;} else { fib(x-1) + fib(x-2);}}}; let loop = fn(i, max, f) { if(i == max){return 0;} f(); loop(i +1, max, f);}; let p = fn() { puts(“hello world”);};
  5. なんでやってみたかのか • 人生で一度はオレオレ言語作ってみたい! • 昔 C でインタプリタを書いてみる本は辛くて挫折した • Go で良さそうな本出たらしいので試すぞ!

  6. 言語の仕様 • Integer, Boolean, String, Function • Array, Hash •

    if 文が使える • Lexer、Parser を yacc などの既存の ツールを使わずに実装する
  7. かかった期間 • 大体1ヶ月くらい • 早い人だと1週間くらいあればできる(らしい?) • 遅い人でも1〜2ヶ月あればできる

  8. ちょい難しかったところ • やっぱり Parser の仕組みは難しい • Pratt Parser と呼ばれる種類のパーサー •

    日本語だと演算子順位法とかでググるとわかりやす い
  9. なにが学べたのか • 自作言語楽しい! • Parser の章で(少しだけ) AST の気持ちになれた • Go

    のプラクティスとは真逆のことをすることもある
  10. AST の気持ちになれる • Parser の章では最終的にASTを構築する • その昔 AST を使ってごにょごにょするツールを作っ たけど当時はASTなんて理解せずに扱ってた

    • 今書いたらもう少しいい感じに書けると思う
  11. Go のプラクティスに従わない • なるべくすぐにエラーを返す / Error 型も同時に返す をやらない事がある • Monkey

    コードだとこの辺 • 実は go/parser でも似たような仕組みになってる • https://golang.org/src/go/parser/parser.go “p.error” で検索かけると引っかかる
  12. Go のプラクティスに従わない • 処理を止めたくない • 一旦最後まで読んでから間違っているところを吐き出 したほうがユーザに優しい • エラーリストにどんどん append

    しているので、ハンド リングする必要がない
  13. 最後に • REPL を起動してコード書いてみるとめっちゃ達成感 がある ◦ ゲーム作るのとはまた違う感覚 • 普段あまり洋書を読まない方にもおすすめ ◦

    英語がそんなに難しくない ◦ 最悪読み飛ばしてもあとで手を動かして理解でき る
  14. ぜひあなたも インタプリタ書いてみよう!