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
Cコンパイラ自作はじめてみた
Search
mikiken
September 17, 2022
Programming
0
260
Cコンパイラ自作はじめてみた
セキュリティ・キャンプ全国大会2022アフターイベント LT発表
mikiken
September 17, 2022
Tweet
Share
More Decks by mikiken
See All by mikiken
ライフゲームの製作
mikiken
0
230
簡単な4bitCPUの作成
mikiken
0
1.3k
Webブラウザでページが表示されるまで
mikiken
0
78
seccamp2022 成果発表
mikiken
0
44
Other Decks in Programming
See All in Programming
new(1.26) ← これすき / kamakura.go #8
utgwkk
0
1.6k
今、アーキテクトとして 品質保証にどう関わるか
nealle
0
200
Rubyと楽しいをつくる / Creating joy with Ruby
chobishiba
0
200
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
210
AIとペアプロして処理時間を97%削減した話 #pyconshizu
kashewnuts
1
200
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
230
encoding/json/v2のUnmarshalはこう変わった:内部実装で見る設計改善
kurakura0916
0
310
TipKitTips
ktcryomm
0
150
守る「だけ」の優しいEMを抜けて、 事業とチームを両方見る視点を身につけた話
maroon8021
3
290
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
390
15年目のiOSアプリを1から作り直す技術
teakun
1
600
LangChain4jとは一味違うLangChain4j-CDI
kazumura
1
150
Featured
See All Featured
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
190
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
280
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.4k
Producing Creativity
orderedlist
PRO
348
40k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
0
2.4k
How to train your dragon (web standard)
notwaldorf
97
6.5k
Agile that works and the tools we love
rasmusluckow
331
21k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
150
Fireside Chat
paigeccino
42
3.8k
How Software Deployment tools have changed in the past 20 years
geshan
0
32k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
210
Transcript
セキュリティ・キャンプ全国大会2022アフターイベント
• 神戸大学 工学部 電気電子工学科 2年生 • セキュリティキャンプ全国大会 2022 L3 Cコンパイラゼミ
参加 • 多少プログラミングを触ったことはあったが、 本格的にやったことはなかった mikiken @mikikeen
• 去年、大学の授業でほぼ初めてC言語に触れた • セキュキャン応募時点(5月)では、ポインタがあまり理解できて いなかった()
• C(のサブセット)言語のコンパイラを作った • 現在も作っている
• 変数・1次元配列・関数定義までは実装済 • まだchar型がない https://github.com/mikiken/9cc
C言語のプログラム アセンブラ 機械語のプログラム コンパイル アセンブル・リンク
• • • • 中間コード生成 (やってない) • 最適化 (やってない) •
C言語のプログラム アセンブラ コンパイル
入力プログラムを意味のあるトークンに分ける
字句解析したトークンをもとに構文木を構築する
• 構文上正しいが間違っているプログラムを弾く は構文上正しいが、どうみてもおかしい • 型の情報を付与したり • キャストもここで行ったり
ここまでで生成した構文木を、再帰的に辿って アセンブラを出力する
None
• if・else・while・forといった制御構文はラベルとジャンプを 用いて実現されている
• if・else・while・forといった制御構文はラベルとジャンプを 用いて実現されている • ifやwhileをネストするとバグる
• ラベルのカウントにグローバル変数を用いていた • 関数が再帰的に呼ばれた際に、label_countがインクリメント され、ラベルに一貫した値を使えていなかった
• ここで初めてコンパイラに型を導入する必要が生じる • Compiler bookの解説が割とサラッとしていたので 実装方針が中々分からなかった • Discordでみなさんに教えてもらい、なんとか突破
他にも色々あるが、割愛
• Compiler bookを読了する • グローバル変数 • char型 • 文字列リテラル •
構造体 ︙
• フィボナッチ数列のn項目の値を求めるプログラムぐらいなら 意外と簡単にコンパイルできることが分かった。 • セキュキャン期間中、デバッグに手間取っていたところ、 深夜(というか翌朝)まで多くの方に手伝ってもらった。 ありがとうございました。
None