Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 ● 鎌田 健史 ● @knsh14 (twitter, GitHub) ● KLab 株式会社 ○ Unity のエディタ拡張書いたり ○ JavaScript でゲーム書いたり ● 技術書典ではバイトしてました

Slide 3

Slide 3 text

なにをしたのか ● Writing An Interpreter In Go 読んだ ○ https://interpreterbook.com/ ● 実際にインタプリタ作ってみた ● 約1400行 でインタプリタを書こう! ○ テストコード込だと2500行くらい

Slide 4

Slide 4 text

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”);};

Slide 5

Slide 5 text

なんでやってみたかのか ● 人生で一度はオレオレ言語作ってみたい! ● 昔 C でインタプリタを書いてみる本は辛くて挫折した ● Go で良さそうな本出たらしいので試すぞ!

Slide 6

Slide 6 text

言語の仕様 ● Integer, Boolean, String, Function ● Array, Hash ● if 文が使える ● Lexer、Parser を yacc などの既存の ツールを使わずに実装する

Slide 7

Slide 7 text

かかった期間 ● 大体1ヶ月くらい ● 早い人だと1週間くらいあればできる(らしい?) ● 遅い人でも1〜2ヶ月あればできる

Slide 8

Slide 8 text

ちょい難しかったところ ● やっぱり Parser の仕組みは難しい ● Pratt Parser と呼ばれる種類のパーサー ● 日本語だと演算子順位法とかでググるとわかりやす い

Slide 9

Slide 9 text

なにが学べたのか ● 自作言語楽しい! ● Parser の章で(少しだけ) AST の気持ちになれた ● Go のプラクティスとは真逆のことをすることもある

Slide 10

Slide 10 text

AST の気持ちになれる ● Parser の章では最終的にASTを構築する ● その昔 AST を使ってごにょごにょするツールを作っ たけど当時はASTなんて理解せずに扱ってた ● 今書いたらもう少しいい感じに書けると思う

Slide 11

Slide 11 text

Go のプラクティスに従わない ● なるべくすぐにエラーを返す / Error 型も同時に返す をやらない事がある ● Monkey コードだとこの辺 ● 実は go/parser でも似たような仕組みになってる ● https://golang.org/src/go/parser/parser.go “p.error” で検索かけると引っかかる

Slide 12

Slide 12 text

Go のプラクティスに従わない ● 処理を止めたくない ● 一旦最後まで読んでから間違っているところを吐き出 したほうがユーザに優しい ● エラーリストにどんどん append しているので、ハンド リングする必要がない

Slide 13

Slide 13 text

最後に ● REPL を起動してコード書いてみるとめっちゃ達成感 がある ○ ゲーム作るのとはまた違う感覚 ● 普段あまり洋書を読まない方にもおすすめ ○ 英語がそんなに難しくない ○ 最悪読み飛ばしてもあとで手を動かして理解でき る

Slide 14

Slide 14 text

ぜひあなたも インタプリタ書いてみよう!