Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ユーザが構文を自由に変更できるプログラミング言語
Search
Akama Hitoshi
March 30, 2016
Programming
7.7k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ユーザが構文を自由に変更できるプログラミング言語
第5期サイボウズ・ラボユース成果報告会
言語処理系ゼミ
Akama Hitoshi
March 30, 2016
More Decks by Akama Hitoshi
See All by Akama Hitoshi
20年ものの巨大レガシープロダクトを PHP 8.0にアップデートした際の対策と得られた知見
akamah
7
6.8k
プラレールで作る論理回路
akamah
0
3.2k
Other Decks in Programming
See All in Programming
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
170
Foundry Localでエージェント開発
seosoft
0
130
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
330
PyO3 で既存 Python 評価器を Rust core 化する ー wasm-bindgen でブラウザにも配るための設計
kdash
1
370
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
420
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
810
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
830
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
初めての模倣学習とVLA
natsutan
0
470
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
500
承認済みなのに差戻しできてしまうバグ、型で潰せます
shinchit
0
140
이 함수, 실패하면 어떻게 되나요? null부터 Rich Errors까지, Kotlin 에러 처리 15년
haeti2
0
130
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
400
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
560
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
510
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
390
Typedesign – Prime Four
hannesfritz
42
3.2k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Music & Morning Musume
bryan
47
7.4k
GraphQLとの向き合い方2022年版
quramy
50
15k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Technical Leadership for Architectural Decision Making
baasie
3
550
Transcript
ユーザが構文を自由に変更できる プログラミング言語 第5期サイボウズラボ・ユース成果報告会 言語処理系ゼミ 2016/03/30 東京工業大学 理学部 情報科学科 赤間 仁志
目的 • 構文を自由に変更できるプログラミング言語を作れないか? • ユーザが新しい構文を導入するメリット: ◦ 簡潔な見た目 ◦ 少ない記述量で望んだ処理を行う •
書いてる途中にどんどん構文が変わっていく言語 ◦ 面白そう ◦ 個人的な興味 2
構文を変更できるとうれしい例 in C • 固定回数のループ文 • forループ特有の条件部分を書かなくてよい for (int i
= 0; i < 10; i++) { printf(“Hello, %d\n”, i); } times(i, 10) { printf(“Hello, %d\n”, i); } Before After 3 #define times(i, n) \ for (int i; i < (n); i++)
構文を変更できる言語の要件 1. 処理系を変更することで構文を変更するのはダメ ◦ ユーザの手によって構文が変更できること 2. 構文を追加することも,削除することもできること ◦ 不要になった構文もユーザの手で削除できる 3.
構文を定義する構文も作成できること ◦ 構文の定義方法もユーザが作成可能 4 画像素材:http://www.irasutoya.com/
プログラミング言語Garbanzo(仮) ver. 2 • 動的型つけ • インタプリタ方式 ◦ いくつかの命令を搭載 •
組み込みの構文は最小限 ◦ ほぼ構文木をそのまま ◦ どんどん構文を拡張可能 5 {“@”: “print”, {“@”: “append”, “left”: “Hello”, “right”: ”World” } } 画像素材:http://www.irasutoya.com/
一般的なインタプリタ 構文解析器 評価器 AST ソース コード 結果 “(3 + 4)
* 6” * 3 4 6 + 42 6
Garbanzoでの構文解析 • 実行にともない,構文解析ルールを書き換える ◦ 文を1つずつ読み込んで実行 • 構文解析器そのものがGarbanzoのプログラム ◦ Garbanzoの評価器の上で動作 •
構文解析ルールはファーストクラスの値 ◦ プログラム内で操作できる 7 プログラム 構文を変更する 宣言・命令 新しい構文で 記述したプログラム 7
実行の流れ 構文解析器 評価器 AST ソース コード 結果 構文解析 実行 ルールの
追加・削除 8
構文の定義 • 組込の構文は,構文木をそのまま書くので,なんでもできる • けど長ったらしい 9 {"@": "set", "object": {"@":
"get", "object": {"@": "get", "object": {"@": "get", "object": {"@": "get", "object": {"@": "getenv" }, "key": "/" }, "key": "parser" }, "key": "sentence" }, "key": "children" }, "key": "newline", "value": {"@": "quote", "value": {"@": "scope", "body": {"0": {"@": "terminal", "string": "\n" } } } } }
自動生成 • 構文の定義をバージョン1のコードで自動生成 ◦ 共通のランタイム • バージョン1(自作言語)でバージョン2(自作言語)の開発 ◦ デバッガなし ◦
リファレンスなし ◦ 質問する相手なし • 生成された構文をGarbanzoの初期構文とする ◦ 標準ライブラリ的な構文 10
自動生成 • 構文の定義をバージョン1のコードで自動生成 ◦ 共通のランタイム • バージョン1(自作言語)でバージョン2(自作言語)の開発 ◦ デバッガなし ◦
リファレンスなし ◦ 質問する相手なし • 生成された構文をGarbanzoの初期構文とする ◦ 標準ライブラリ的な構文 11 ヤバい
初期構文を用いる例 fib = fun(n) if n < 2 n; else
../fib(n - 1) + ../fib(n - 2); end end; /print(fib(7)); 12 ここで利用している構文: • 数値リテラル • 代入 • 匿名関数 • if〜else文 • 加算・減算 • 関数呼び出し • etc.
構文の拡張例(カッコ) paren = block %/tokenize(/terminal("(")); inner = %/parser/expression; %/tokenize(/terminal(")")); inner;
end; /parser/expression/children/paren = paren; 13 ここで利用している構文: • block ~ end • 代入 • 関数呼び出し • etc.
構文を拡張する構文 • 構文の拡張はまだ煩雑 • 構文を拡張する構文を作成 • Schemeのマクロのような,パターンマッチ式での構文 • 構文ルールの優先度(prec)も指定 let:prec
pattern1 pattern2 … patternN := template; • 初期構文を用いて約60行で実装 14
構文を拡張する構文の使用例 • 優先順位をまとめるためのカッコ let:0 “(“ inner:1000 “)” := inner; 例:
(4 + 5) • 添え字つきのアクセス let:15 store:14 “[“ key:1000 “]” := /get(store, key); 例: hoge[“key”] 15
課題 • 構文解析ルールの曖昧さへの対処 ◦ ルールが合成可能な構文解析の方式が必要 • Rubyでプロトタイプを実装したため,極めて低速 ◦ のちのち他の言語で処理系を書き直す •
構文解析エラーのわかりやすさの向上 16 画像素材:http://www.irasutoya.com/
ラボユースでの活動 • プログラミング言語処理系の開発 ◦ プロトタイプ作成による試行錯誤 • 情報処理学会 第57回プログラミング・シンポジウムに参加 ◦ 論文を執筆
◦ 勉強になる 17
まとめ • 構文を拡張可能なプログラミング言語Garbanzo(仮)を紹介 • 構文解析ルールをユーザが動的に追加することで構文を変更 • 構文を定義する構文も作成可能 ◦ 構文の拡張をくり返すことができる •
プログラミング・シンポジウムで発表 ◦ 開発以外でもラボユースの活動を行う ※適当につけた名前なので,カッコいい名前を募集中です GitHub: https://github.com/akamah/garbanzo 18
補足のスライド 19
データ型 • 文字列,数値,真偽値 • 関数 • データストア ◦ 順序をもったハッシュテーブル ◦
構文木の構成などに利用 20
細かな実行の流れ 1. 特別な構文解析ルール sentence に従って入力から読み取る 2. その結果を評価器に入力(eval)する ◦ この時,読み込んだプログラムが構文解析ルールを変更することがある 3.
入力が空になるまで1から2をくり返す 21
構文解析の実際 • 構文解析ルール = Garbanzoのプログラム片 • evalされると,構文解析を実行する • 構文解析専用の命令を評価器に搭載 ◦
terminal: 指定された文字列を読み取る ◦ choice: 与えられた構文解析ルールを順に試す ◦ etc. 22
構文解析器の変更 • いくつかの構文解析ルール(= Garbanzoのプログラム)が既に存在 • これら既に存在したルールの構文木を直接変更 23
Ver. 1による自動生成の例 integer = '/parser/integer = '{ digit = [@:
"quote", value: [@: "oneof", string: "0123456789"]] a = [@: "sub", left: [@: "tocode", string: %digit], right: [@: "tocode", string: "0"]] rest = [@: "many", parser: digit] ten = [@: "sub", left: [@: "tocode", string: "K"], right: [@: "tocode", string: "A"]] "generate"; /foreach([store: rest, func: ^{ n = [@: "sub", left: [@: "tocode", string: value], right: [@: "tocode", string: "0"]] ../a = ../a * ../ten + n }]); a; } 24