Builderscon 2019 の発表資料です。 ライブコーディングでフルスクラッチでコンパイラを書くというのをやりました。
コンパイラのソースコードはこちらです https://github.com/DQNEO/HowToWriteACompiler
コンパイラをつくってみよう@DQNEO (ドキュネオ)builderscon 2019.8
View Slide
コンパイラ書いてみたいと思ったことありますか?
本日のゴール● 「コンパイラやってみよう!」と思ってもらうこと
はじめに● 今日はライブコーディングをします● フルスクラッチでコンパイラ作ります● 失敗したらごめんなさい○ (成功したら拍手お願いします)
はじめに● 文字が見づらい場合は教えてください○ 特に後部座席の方● タイポ/エンバグしてたら教えてください
はじめに● 手が震えてたらそれは仕様です
今日つくるコンパイラ
今日つくるコンパイラは履歴つきで公開していますhttps://github.com/DQNEO/HowToWriteACompiler
今日つくるコンパイラ(環境)● ターゲット環境:○ Linux○ x86-64: 一般的なPCのCPU (Intel, AMD)○ アセンブリ(GNU Assembler)を吐く
今日つくるコンパイラ(仕様)● 足し算引き算をコンパイルできる● 結果の数値でexit○ 例 ‘ 30 + 12 ‘ → 42 でexit● ソースコードを標準入力から受け取る● アセンブリを標準出力に吐く
ゴール30 + 12 .global mainmain:movq $30, %raxmovq $12, %rcxaddq %rcx, %raxretソース言語 ターゲット言語足し算は実行時に行う
使用する言語● Go言語で書く○ slice, map, for-rangeなどが便利○ 標準ライブラリが便利● 何言語で書いてもよいです
つくってみよう!!
素のアセンブリを書いて実行STEP 0
CPU内にある超高速な一時記憶装置CPU← レジスタレジスタ出典: http://ftp.procmail.org/~sskulrat/Courses/2006F-170/lectures/chap14/part1.html
自作スクリプトの説明
Goプログラムからアセンブリを吐くSTEP 1
標準入力からソースコードを受け取るSTEP 2
現状確認ソースコードアセンブリほぼ仕事してない
ソースコードを「解釈」するとは
3つの視点全てはByte列全てはトークン列全ては構造
I say I write a compilerこの英文をどう解釈するか?
I say I write a compiler“I” “ “ “s”0x49, 0x20, 0x73...ByteReaderさん
I say I write a compiler“I”, “say”, “I” ...Tokenizerさん(字句解析)
I say I write a compilersayI write a compiler文文Parserさん(構文解析)I主語 動詞
-12ソースコード
ByteReaderさんByteが3個並んでいる0x2d 0x31 0x32- 1 2-12
Tokenizerさん- 12演算子トークン 数値トークントークンが2個並んでいる-12
Parserさん単項演算子 数値リテラル式式の中に式がある12-単項式-12
それぞれのフェーズの成果物ソースコードバイト列トークン列 文法構造(式・文)バイト列トークン列
コード生成さん文法構造(式・文)文法構造をアセンブリに変換アセンブリ
Unix パイプのように連携ソースコードアセンブリ
Token分割するSTEP 3
現状確認ソースコードトークン列
Parse (構文解析)するSTEP 4
数値リテラル式STEP 542int literal expression
現状確認ソースコードアセンブリ
単項式 (Unary Expression)STEP 61-operandoperatorunary expression
二項式 (Binary Expression)STEP 730+leftoperatorbinary expression12right
この勢いで1万行書けば、コンパイラ自身をコンパイルできる!
自己紹介@DQNEO ドキュネオ● アメリカ版メルカリを開発しています● 趣味でGoコンパイラ自作https://github.com/DQNEO/minigo
minigoの最初の7コミットを丁寧に再現したのが今日の内容ですhttps://github.com/DQNEO/HowToWriteACompiler
コンパイラを書けると何がいいのか● プログラミング言語が動く仕組みがわかる● 既存のコンパイラが読めるようになる● コンピュータの動きがチョットわかる
コンパイラづくり最大の壁● 「はじめ方がわからない」→ これを解決したかった
まずつくってみよう● 学ぶ → つくる ではなく● つくりながら学ぶ を提唱したい○ 私はそうやって学んだ (8ccの写経・移植)○ 今なら chibicc がオススメ
よくある誤解● C言語で書く必要がある→ 何言語のコンパイラを何言語で書いてもOK● 特殊な拡張・ライブラリが必要→ 不要● コンピュータ・サイエンスの知識がいる→ なくても始められる
参考資料: Cコンパイラhttps://github.com/rui314/8cchttps://github.com/rui314/chibiccSipSpecial thanks to rui さん
まとめ● コンパイラの学び方● 字句解析、構文解析の初歩● フルスクラッチからコンパイラを書きました
コンパイラはいいぞ
ご清聴ありがとうございました