Goで始める言語処理系実装入門

 Goで始める言語処理系実装入門

【とらのあな主催】オタクが最新技術を追うライトニングトークイベント9回目 in渋谷で発表した資料です。

Transcript

  1. Goで始める 言語処理系実装入門 ΦλΫ͕࠷৽ٕज़Λ௥͏ϥΠτχϯάτʔΫΠϕϯτ גࣜձࣾދͷ݀ ։ൃࣨ ্ా ণ׮

  2. 2 上田昌寛 (Masahiro Ueda) • 2017年5月虎の穴入社 • 前職Androidアプリ, 組み込みも少し •

    KEEPER,とらのあなクラフトの運用/開発 • たまにVTuber見てます • 最近好きなアニメ まちカドまぞく
  3. 今回話すこと 1. はじめに 2. Schemeッポイ処理系 3. Schemeとは 4. インタプリタの基本的な流れ 5.

    Goで実装 6. まとめ 3
  4. はじめに 「Go言語でつくるインタプリタ」という本を読 んでみた。 4 https://www.amazon.co.jp/dp/4873118220 処理系の実装に興味が湧く

  5. はじめに せっかくなので、 「自分でも作ってみたい!!」 5 比較的簡単なものからチャレンジ

  6. Schemeッポイ処理系 6 • Scheme(スキーム)は言語仕様がシンプル! • S式とよばれる構文で、他の言語の比べて解析がや さしいのも特徴(※S式については後述) • 言語処理系をはじめて実装する入門言語としてもよ く取り上げられる

  7. Schemeとは(S式とは) 7 • S式とは Lisp系の言語で採用されている構文。 以下のような再帰データ構造になっている。 例) 入力:(+ 5 (*

    7 4)) 出力:33 + 5 * 7 4 car部 cdr部 セル 「+」や「*」はシンボルと呼ばれる。S式のSはSymbolの頭文字
  8. Schemeとは(特徴) 8 例)算数 or 他の言語 5 + 7 * 4

    計算する順序を全体の式から推測す る必要がある。 (5 + 7) * 4 ? 5 + (7 * 4) ? 式の評価の優先順位がつけやすい 例)Schemeの場合 (+ 5 (* 7 4)) そもそも括弧で分けてあるので、優 先順位がわかりやすい
  9. インタプリタの基本的な流れ 9 字句解析 構文解析 評価 結果出力 (+ 5 (* 7

    4)) ( + 5 4 ) ) 7 * (
  10. インタプリタの基本的な流れ 10 字句解析 構文解析 評価 結果出力 ( + 5 4

    ) ) 7 * ( + 5 * 7 4
  11. インタプリタの基本的な流れ 11 字句解析 構文解析 評価 結果出力 + 5 28 +

    5 * 7 4 33
  12. インタプリタの基本的な流れ 12 字句解析 構文解析 評価 結果出力 33

  13. Goで実装(字句解析) 13 S式の基本構成となる ワードを分解する シンボルとなる各文字列を 分解する。 ⇛ 数値、文字、演算子

  14. Goで実装(構文解析) 14 Cellの構造体を作る Car部に入るデータの構造体 数値(整数のみ), 文字列

  15. Goで実装(構文解析) 15 Parseメソッドは再帰呼び出しされる トークン毎に合致したデータ生 成、ツリー構造を作る

  16. Goで実装(評価) 16 car部が命令(+演算子など) cdrの中に更に評価すべきリストが あれば先に評価する

  17. Goで実装(評価) 17 car部の数値を足し合わせていく cdrに次の要素(Cell)があれば移動 する リストの終端に到達したら処理を終了

  18. 実演 18

  19. まとめ • 処理系の考え方や流れを説明 • Schemeだと構文解析しやすい (ただし括弧だらけが嫌いな人には向かないかも?) • S式のリストをGoのスライスのほうが楽そう • (今後)Lambda式の実装やローカル変数の実装

    19