Slide 1

Slide 1 text

自作コンパイラやっていきの巻 2019/08/21 piece of cake x マクアケ 合同 beer bash

Slide 2

Slide 2 text

convto jisibari Twitter: @convto Github: convto 2

Slide 3

Slide 3 text

おもむろにDEMO

Slide 4

Slide 4 text

関数定義までうごく

Slide 5

Slide 5 text

関数定義までうごく

Slide 6

Slide 6 text

もくじ - どうしてCコンパイラ? - コンパイラってどういうプログラム? - 生の文字は無理!トークンにしちゃうよ編 - トークンを構文木にしちゃうよ編 - 構文木からアセンブリ生成すっぞオラ編 - まとめ

Slide 7

Slide 7 text

もくじ - どうしてCコンパイラ? - コンパイラってどういうプログラム? - 生の文字は無理!トークンにしちゃうよ編 - トークンを構文木にしちゃうよ編 - 構文木からアセンブリ生成すっぞオラ編 - まとめ

Slide 8

Slide 8 text

これが気になってたか ら

Slide 9

Slide 9 text

https://www.sigbus .info/compilerbook

Slide 10

Slide 10 text

お盆にノリで着手した - レイヤの低い部分に興味があった - ブラックボックス感を減らしたかった - ドメイン特化のソフトウェアだから実装が面白いか もとおもった

Slide 11

Slide 11 text

乗るしかない、 このビックウェーブに

Slide 12

Slide 12 text

もくじ - どうしてCコンパイラ? - コンパイラってどういうプログラム? - 生の文字は無理!トークンにしちゃうよ編 - トークンを構文木にしちゃうよ編 - 構文木からアセンブリ生成すっぞオラ編 - まとめ

Slide 13

Slide 13 text

コードを実行可能(またはそれに近い)形式に変換

Slide 14

Slide 14 text

コンパイラの仕事 - 文字を解析する - 解析した文字の関係性を整理する - 整理された情報からアセンブリ、機械語、特定ラ ンタイム向けバイトコードなどを吐く

Slide 15

Slide 15 text

もくじ - どうしてCコンパイラ? - コンパイラってどういうプログラム? - 生の文字は無理!トークンにしちゃうよ編 - トークンを構文木にしちゃうよ編 - 構文木からアセンブリ生成すっぞオラ編 - まとめ

Slide 16

Slide 16 text

イメージはこんな感じです

Slide 17

Slide 17 text

トークナイズ - 生の文字列を意味のある粒度で区切る。空白文 字スキップとかもする - メタ情報を付与する(予約語、識別子、終端、etc) - 関係性の整理はせず、使いやすくするだけ

Slide 18

Slide 18 text

トークナイズ - 生の文字列を意味のある粒度で区切る。空白文 字スキップとかもする - メタ情報を付与する(予約語、識別子、終端、etc) - 関係性の整理はせず、使いやすくするだけ 料理でいうと下ごしらえ

Slide 19

Slide 19 text

もくじ - どうしてCコンパイラ? - コンパイラってどういうプログラム? - 生の文字は無理!トークンにしちゃうよ編 - トークンを構文木にしちゃうよ編 - 構文木からアセンブリ生成すっぞオラ編 - まとめ

Slide 20

Slide 20 text

イメージはこんな感じです + foo = 1 2

Slide 21

Slide 21 text

抽象構文木(AST)にパース - トークンをBNFに則って再帰下降法でパース - 木構造にして関係性の情報をあたえる - それぞれのノードにメタ情報を付与(IF文ノード、 関数定義ノード、など)

Slide 22

Slide 22 text

BNF?(!bmf) - Backus-Naur form の略 - 文脈自由文法の記法の一つ - C の定義はここ https://github.com/BNFC/bnfc/blob/master/example s/C/C.cf - ノリは `再帰的な正規表現` みたいな感じ

Slide 23

Slide 23 text

再帰下降法? - パースしたい構文を上から順に再帰的に降って いって末端から値を確定させていく - BNF どうりに書くだけでパースできて魔法っぽい

Slide 24

Slide 24 text

ブラック・マジシャン

Slide 25

Slide 25 text

もくじ - どうしてCコンパイラ? - コンパイラってどういうプログラム? - 生の文字は無理!トークンにしちゃうよ編 - トークンを構文木にしちゃうよ編 - 構文木からアセンブリ生成すっぞオラ編 - まとめ

Slide 26

Slide 26 text

イメージはこんな感じです + foo = 1 2

Slide 27

Slide 27 text

ASTからアセンブリ生成 - ASTの種類などの情報からアセンブリ生成 - 再帰的にASTをたどってコード生成

Slide 28

Slide 28 text

= foo + 1 2 構文木から生成

Slide 29

Slide 29 text

もくじ - どうしてCコンパイラ? - コンパイラってどういうプログラム? - 生の文字は無理!トークンにしちゃうよ編 - トークンを構文木にしちゃうよ編 - 構文木からアセンブリ生成すっぞオラ編 - まとめ

Slide 30

Slide 30 text

まとめ(1/2) - 構文解析についての知見が増えた、いまなら JSONパーサーとか作れそう - Cとアセンブリ触ったことなかったので新鮮で面白 かった - コンパイラ一般の仕事のイメージが何となくつい た

Slide 31

Slide 31 text

まとめ(2/2) - 黒・魔・導 を一つ覚えた(半分冗談、不思議な感 じはするけど全然黒くないです) - 全体的に興味ある人はこれを読んでください!! めっちゃおすすめです!!!! https://www.sigbus.info/compilerbook#index12

Slide 32

Slide 32 text

- プレゼンテーションテーマは SlidesCarnival の ヨークプレゼンテーションテンプレー ト を利用しています クレジット表記

Slide 33

Slide 33 text

ご清聴 ありがとうございました