Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

プログラミング言語を作る

495 views

Published on

合同勉強会 in 大都会岡山 -2018 Winter- にて、LISP系のインタプリタ型言語を作った話をしました。

Published in: Technology
  • Be the first to comment

  • Be the first to like this

プログラミング言語を作る

  1. 1. プログラミング言語を作る 合同勉強会in 大都会岡山 -2018 Winter-
  2. 2. 自己紹介 ● 小西 雅也 ● 株式会社クレオフーガ ○ インフラ & Webアプリケーション開発 ● @orepublic ● 勉強会 ○ Okayama.rb ○ 岡山システムプログラミング勉強会 ● 趣味 ○ OSの再インストール
  3. 3. 今日話すこと ● LISP系のプログラミング言語を作りました ● LISPとは ● 作るまで ○ 字句解析 ○ 構文解析(構文木構築) ○ 実行 目的 プログラミング言語自作にとりかかれるように
  4. 4. なんで作るのか ● プログラミング言語作れるってかっこいい ● 自分で作れると知って以来、いつか作ってみたかった ● いつかが一生来ない気がしてきたので、着手した
  5. 5. プログラミング言語作りました
  6. 6. プログラミング言語作りました ● mrubyでLISPライクな言語を実装 ● mrispと言います ● インタプリタ型の言語です
  7. 7. LISPとは ● リスト構造、木構造の式でプログラムを記述する(S式) ○ (* 3 (+ 2 5)) ○ ((fn* [a b] (- a b)) 100 50) ● リストの先頭が関数もしくは演算子 ● 続くリストが引数 ○ 引数も、さらにリスト構造になることもある ● 構文のルールが少ない
  8. 8. プログラミング言語を作るまで ● 字句解析 ○ 入力の文字列をトークンに分解する ● 構文解析 ○ トークンの並びから、抽象構文木を作る ● 実行 ○ 抽象構文木を解釈して、実行していく
  9. 9. 字句解析 ● 入力文字列から言語の構文要素の最小単位に分解する ● 最小単位 ○ プログラミング言語の意味上、それ以上分解できない塊 ○ トークンと呼ぶ ○ 例) ■ ( + 1 3 ) → “(“ , “+” , “1” , “3” , “)” ■ (def! a 6) → “(“ , “def!” , “a” , “6” , “)” ○ スペース(空白)はトークンの区切りとしての意味はあるが、字句解析の段階で取り除かれる
  10. 10. 構文解析 ● トークンの並びを、ルールに従って解析して、構文木を作る ● 例) 入力 if a==1 then print ‘aは1’ else print ‘aは1以外’ end ルール [a-z]* → 式 [0-9]* → 式 式 == 式 → 式 ‘xxxx’ → 式 if 式 then 式 else 式 end  → if式 if 式 (a == 1) 式 (‘aは1’) 式 (‘aは1以外’)
  11. 11. 実行 ● 作成した構文木をたどって、実行していく if 式 (a == 1) 式 (‘aは1’) 式 (‘aは1以外’)
  12. 12. mrispの実装 ● make a lisp (mal) ○ https://github.com/kanaka/mal ● 実装方法を説明するドキュメント ● 74の言語で実装されているソースコード付き ○ ドキュメント読んで、ピンと来なくても自分が得意な言語の実装例が見える ○ 各ステップの動作検証するテストコード付き ● mrispは、いまのところstep5 までの機能を実装 ○ 四則演算 ○ 変数定義 ○ 無名関数 ○ if ○ 再帰 ○ print
  13. 13. mrispの実装(字句解析) ● 正規表現にて分解 ○ /[s,]*(~@|[[]{}()'`~^@]|"(?:.|[^"])*"|;.*|[^s[]{}('"`,;)]*)/ ○ マッチした文字列を、配列で取得 ○ この段階で不要な文字(空白)も取り除く ● 正規表現でうまくいかないパターンもある ○ 例) コメントのネスト ■ /* aaa /* bbb */ ccc*/ ○ mrispではコメントを扱っていない
  14. 14. mrispの実装(構文解析) ● LISPはS式で記述 ● S式は、構文木の形をしている ● 例) if ○ (if (= a 1) (prn ‘aは1’) (prn ‘aは1以外’)) ● mrisp では、S式をそのままrubyの配列に変換している ○ [:if, [:=, a, 1], [:prn, ‘aは1’], [:prn ‘aは1以外’]] ● ルールが少なく、構文木に変換しやすい if 式 (= a 1) 式 (‘aは1’) 式 (‘aは1以外’)
  15. 15. mrispの実装(実行) ● 配列を先頭から辿っていき、要素を見て実行(リストの先頭が演算子・関数) ● if, def!, let*, fn* などは予約後 ● [:if, [:=, a, 1], [:prn, ‘aは1’], [:prn ‘aは1以外’]] ● 例) 実装の一部
  16. 16. mrispの実装(実行) ● def! などの実行は、動的に連想配列に定義を追加 ● 例) (def! a 1) (def! b ( + 1 2)) env = { ‘a’: 1, ‘b’: 3, }
  17. 17. まとめ ● LISP系言語を作りました ● LISP系インタプリタは作るハードル低い(と思う) ○ make a lisp 以外にも、たくさん情報がある ● 字句解析 ● 構文解析 ● 実行
  18. 18. まとめ ● プログラミング言語を作ろう

×