$30 off During Our Annual Pro Sale. View Details »

自作コンパイラやっていきの巻💪💪/making my own compiler!

convto
August 21, 2019

自作コンパイラやっていきの巻💪💪/making my own compiler!

自作コンパイラで関数定義、呼び出しが動くところまでやったので勉強会で話したよ

参考リンク:
- https://www.sigbus.info/compilerbook
- https://github.com/BNFC/bnfc/blob/master/examples/C/C.cf

convto

August 21, 2019
Tweet

More Decks by convto

Other Decks in Programming

Transcript

  1. 自作コンパイラやっていきの巻

    2019/08/21 piece of cake x マクアケ 合同 beer bash

    View Slide

  2. convto
    jisibari
    Twitter: @convto
    Github: convto
    2

    View Slide

  3. おもむろにDEMO

    View Slide

  4. 関数定義までうごく

    View Slide

  5. 関数定義までうごく

    View Slide

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

    View Slide

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

    View Slide

  8. これが気になってたか

    View Slide

  9. https://www.sigbus
    .info/compilerbook

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  24. ブラック・マジシャン

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide