自作コンパイラで関数定義、呼び出しが動くところまでやったので勉強会で話したよ
参考リンク: - https://www.sigbus.info/compilerbook - https://github.com/BNFC/bnfc/blob/master/examples/C/C.cf
自作コンパイラやっていきの巻2019/08/21 piece of cake x マクアケ 合同 beer bash
View Slide
convtojisibariTwitter: @convtoGithub: convto2
おもむろにDEMO
関数定義までうごく
もくじ- どうしてCコンパイラ?- コンパイラってどういうプログラム?- 生の文字は無理!トークンにしちゃうよ編- トークンを構文木にしちゃうよ編- 構文木からアセンブリ生成すっぞオラ編- まとめ
これが気になってたから
https://www.sigbus.info/compilerbook
お盆にノリで着手した- レイヤの低い部分に興味があった- ブラックボックス感を減らしたかった- ドメイン特化のソフトウェアだから実装が面白いかもとおもった
乗るしかない、このビックウェーブに
コードを実行可能(またはそれに近い)形式に変換
コンパイラの仕事- 文字を解析する- 解析した文字の関係性を整理する- 整理された情報からアセンブリ、機械語、特定ランタイム向けバイトコードなどを吐く
イメージはこんな感じです
トークナイズ- 生の文字列を意味のある粒度で区切る。空白文字スキップとかもする- メタ情報を付与する(予約語、識別子、終端、etc)- 関係性の整理はせず、使いやすくするだけ
トークナイズ- 生の文字列を意味のある粒度で区切る。空白文字スキップとかもする- メタ情報を付与する(予約語、識別子、終端、etc)- 関係性の整理はせず、使いやすくするだけ料理でいうと下ごしらえ
イメージはこんな感じです+foo=1 2
抽象構文木(AST)にパース- トークンをBNFに則って再帰下降法でパース- 木構造にして関係性の情報をあたえる- それぞれのノードにメタ情報を付与(IF文ノード、関数定義ノード、など)
BNF?(!bmf)- Backus-Naur form の略- 文脈自由文法の記法の一つ- C の定義はここhttps://github.com/BNFC/bnfc/blob/master/examples/C/C.cf- ノリは `再帰的な正規表現` みたいな感じ
再帰下降法?- パースしたい構文を上から順に再帰的に降っていって末端から値を確定させていく- BNF どうりに書くだけでパースできて魔法っぽい
ブラック・マジシャン
ASTからアセンブリ生成- ASTの種類などの情報からアセンブリ生成- 再帰的にASTをたどってコード生成
=foo+12構文木から生成
まとめ(1/2)- 構文解析についての知見が増えた、いまならJSONパーサーとか作れそう- Cとアセンブリ触ったことなかったので新鮮で面白かった- コンパイラ一般の仕事のイメージが何となくついた
まとめ(2/2)- 黒・魔・導 を一つ覚えた(半分冗談、不思議な感じはするけど全然黒くないです)- 全体的に興味ある人はこれを読んでください!!めっちゃおすすめです!!!!https://www.sigbus.info/compilerbook#index12
- プレゼンテーションテーマは SlidesCarnival の ヨークプレゼンテーションテンプレート を利用していますクレジット表記
ご清聴ありがとうございました