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
JOI夏季セミナー2018 発表資料
Search
shibh308
August 19, 2018
Programming
0
220
JOI夏季セミナー2018 発表資料
2018年JOI夏季セミナー 型システム班三人目の発表資料です
shibh308
August 19, 2018
Tweet
Share
More Decks by shibh308
See All by shibh308
競技プログラミングをしよう
shibh308
0
170
CombGig3 発表資料
shibh308
0
95
herbstluftwmのおはなし
shibh308
0
510
Other Decks in Programming
See All in Programming
try!Swift Tokyo 2024 参加報告 LT
akidon0000
1
220
TCAとKMPを用いた新規動画配信アプリ 「ABEMA Live」の設計
tomu28
1
120
FigmaとPHPで作る1ミリたりとも表示崩れしない最強の帳票印刷ソリューション
ttskch
43
19k
障害対応を起点としたもっといい開発と運用のサイクル作りのためにできること / Hatena Enginner Seminar #29
polamjag
0
240
VS Code をプロダクトにどう取り込むか
onomax
1
430
Tailwind CSSを本気でカスタマイズする方法
fsubal
14
5.3k
デフォルトにして至高、RubyMineの大好きな所
ruzia
0
440
Behind VS Code Extensions for JavaScript / TypeScript Linnting and Formatting
unvalley
5
990
二郎系ラーメンのコールで学ぶ AST 解析
memory1994
PRO
7
1.7k
大規模UIKitベースアプリへのTCAの段階的導入/gradual-adoption-of-tca-in-a-large-scale-uikit-based-app
takehilo
1
180
禅の心を手に入れよ
eltociear
1
120
2 週間で Twitter Bot を作ってみた
contour_gara
0
610
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
7
1k
How STYLIGHT went responsive
nonsquared
92
4.8k
Git: the NoSQL Database
bkeepers
PRO
422
63k
For a Future-Friendly Web
brad_frost
172
9k
Web Components: a chance to create the future
zenorocha
305
41k
Build your cross-platform service in a week with App Engine
jlugia
225
17k
Stop Working from a Prison Cell
hatefulcrawdad
266
19k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
34
8.9k
Debugging Ruby Performance
tmm1
70
11k
Building Better People: How to give real-time feedback that sticks.
wjessup
355
18k
How to name files
jennybc
65
93k
Robots, Beer and Maslow
schacon
PRO
155
7.9k
Transcript
言語を自作したかったおはなし JOI 夏季セミナー 型システム班 塚本 (@shibh308)
2 はじめに • このスライドでは静的型付けでラムダ計算を実装した話を書きます • 頭のいい感じの数学や理論っぽい事は ( 多分 )
やりません • 前二つの発表の内容を前提として説明してる部分があります • … 本の内容に対する理解が浅いので間違っている所があるかもしれません • 内容はあまり面白くないです ごめんなさい • この次の発表がこれの上位互換になっているので、それの前座になります
3 もくじ • 静的型付けについて • 言語自作をしよう! ・文法について ・構文解析について ・型検査について
・実行について ・実際の実装について • おまけ
4 静的型付けについて • 変数や関数の引数について事前に型を決めておく形式 • 型推論がされていても静的型付けになるらしい • 型検査は実行前に行われる C++
とか
5 静的型付けについて • 変数や関数の引数について事前に型を決めておく形式 • 型推論がされていても静的型付けになるらしい • 型検査は実行前に行われる →
実行時エラーが減って嬉しい! C++ とか
6 言語を自作しよう → 静的型付けの言語を自作したい やってみよう!!! 構文解析器 型検査器 構文解析器 実行するやつ
ソース 実行結果
7 言語全体の仕様について • 型付きでラムダ計算を実行できるようにする • 基本的な部分は型無しの場合とあまり変わらない • プリミティブな型として bool(B)
と nat(N) を扱えるようにする • タプルを実装して、それを引数にとった四則演算も組み込みで用意する • ラムダ抽象の記号は @ で、 @ 名前 : 引数の型 .( 処理 ) のように書く • $ 名前 ( 処理 ) でいい感じの宣言ができる $v(5) (@x:N.add (3, x)) v のように記述できる
8 実装について • C++17 でゴリゴリ書いていく (std::variant を使うため ) •
入出力の部分は実装が辛いのでそこは C++ に投げる • パースや型検査時のエラーは箇所や内容を表示させる せっかく静的に付けてるのでここはちゃんとやりたい
9 構文の仕様について • 基本的に型無しラムダと同じような形式になっている • let 束縛はラムダ抽象と同様に処理する • 関数適用やラムダ抽象などはそれ自体が一つのノードになる
• 括弧で囲まれている部分もそれ自身を単一ノードとして見る ( 適用の左結合、抽象の右側への拡大など )
10 構文解析について • std::string で受け取った文章を気合でパースする • 仕様に沿って構文木のノードを生成して、子を shared_ptr で持つ
• 問題が発生した場合は parseError を吐いて終了させる • 解析した結果は json 形式で出力して可視化できるようにした • すごい面倒 ツール使わずにやるものじゃないです
11 型検査について • 構文解析後に変数の型 (bool,int 等 ) が正しいかを DFS
で調べる • 検査時点で型が定まっていない場合も子を再帰的に見る • tuple の場合は tuple 内の型が全て正しいかを検査する • 型が正しくなかったらエラーを吐いて終了させる • これをするとランタイムエラーがすごい減る うれしい
12 実行について • なんとなく簡約をしてから評価をしたくなるので仮にそうする • まラムダ抽象に対する関数適用か let 束縛をするノードを探す •
その後、その名前とマッチしている部分を置き換える DFS をする • あとは関数適用を評価していけばそれで演算結果が取得できる (@x:T.expr) v を [x->v](expr) にする
13 実際の実装について • 構文木のノードはクラスとして実装する ・構文の形式 ( 抽象 ,
適用とか ) ・返り値の型 ( 型検査の時に用いる ) ・構文本体の内容 ・子ノードの shared_ptr の配列 とかを持つ事にする • “15” ならこれらの内容は { 値 ,nat,15,{}} とかになる
14 実際の実装について • 構文木の生成時には返り値が決まっていない時がある ( 適用など ) • その場合は型検査の時に子ノードから返り値の型を決定する
• 例 : “succ 1” ” は succ” ” と 1” を子に持つノード → 返り値の型がまだ決まっていない 型検査時に型を決定する succ は nat を引数にして nat を返す関数 →” succ 1” の返り値は nat になる
15 実際の実装について • 組み込みの関数 ( 四則演算など ) をいちいち特別処理するのは厳しい
→組み込み関数の設定を簡単にできるようにしよう! • 組み込み関数の定義に必要なパラメータをまとめる構造体を作った ・名前 ・引数の型 ・返り値の型 ← ・関数本体 型の取りうる値が複数ある std::function<hoge(fuga)>
16 実際の実装について • 組み込みの関数 ( 四則演算など ) をいちいち特別処理するのは厳しい
→組み込み関数の設定を簡単にできるようにしよう! • 組み込み関数の定義に必要なパラメータをまとめる構造体を作った ・名前 ・引数の型 ・返り値の型 ← ← ・関数本体 型の取りうる値が複数ある variant で殴ろう! std::function<hoge(fuga)>
17 関数の実装について • 組み込み関数を表す構造体Primitive は Primitive( 関数名 ,
引数の型 , 返り値の型 , 関数 ) で宣言できる • Primitive の第四引数には を指定する!!!!!! std::variant<std::function<void(std::variant<int,bool>&)>, std::function<void(std::vecto
18 作った言語で遊ぼう! • せっかく言語自作ができたので何か解いてみたい • 文字列や配列の入出力があるものは険しいので除外 • できる限り簡単でわかりやすい問題がよい
19 作った言語で遊ぼう! • せっかく言語自作ができたので何か解いてみたい • 文字列や配列の入出力があるものは険しいので除外 • できる限り簡単でわかりやすい問題がよい AtCoder
Beginner Contest 106 の A 問題なら解けそう!
20 ABC106-A Garden を解こう! (https://beta.atcoder.jp/contests/abc106/tasks/abc106_a) “mul (pred a, pred b)”
とかで解けそう ( 変数 a,b は C++ の標準入力から )
21 ABC106-A Garden を解こう!
22 ABC106-A Garden を解こう! C++17 が使えない → … 提出できなかった
23 オンラインジャッジでの C++17 対応 • この機会に各サイトで C++17 が使えるか調べた •
AtCoder: 不可 • AOJ: 不可 • Codeforces: 可 • CSA: 不可 • yukicoder: 可
24 提出してみた • yukicoder なら動く事が分かったので、 ( 他の問題を ) やってみる
• “add (div (b, a), tonat (any (mod (b, a))))" で解けそうなのがあった
25 提出してみた • yukicoder なら動く事が分かったので、 ( 他の問題を ) やってみる
• 提出して AC できた! (https://yukicoder.me/submissions/278956)
26 おわりに • 内容は薄いのに構文解析とかを含めて 1035 行かかりました 辛かった • 無駄な実装が大半を占めていてとても悲しかったです
• 土曜日の ABC を自作言語で解いた人がいるらしいです すごい!
おわり