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
240
Cコンパイラ自作はじめてみた
セキュリティ・キャンプ全国大会2022アフターイベント LT発表
mikiken
September 17, 2022
Tweet
Share
More Decks by mikiken
See All by mikiken
ライフゲームの製作
mikiken
0
190
簡単な4bitCPUの作成
mikiken
0
1k
Webブラウザでページが表示されるまで
mikiken
0
67
seccamp2022 成果発表
mikiken
0
35
Other Decks in Programming
See All in Programming
CIを整備してメンテナンスを生成AIに任せる
hazumirr
0
370
AI Ramen Fight
yusukebe
0
120
Vibe coding コードレビュー
kinopeee
0
340
Understanding Kotlin Multiplatform
l2hyunwoo
0
240
新しいモバイルアプリ勉強会(仮)について
uetyo
1
230
商品比較サービス「マイベスト」における パーソナライズレコメンドの第一歩
ucchiii43
0
230
コーディングエージェント概観(2025/07)
itsuki_t88
0
460
MySQL9でベクトルカラム登場!PHP×AWSでのAI/類似検索はこう変わる
suguruooki
1
260
中級グラフィックス入門~効率的なメッシュレット描画~
projectasura
3
2k
Gemini CLIの"強み"を知る! Gemini CLIとClaude Codeを比較してみた!
kotahisafuru
2
660
NEWT Backend Evolution
xpromx
1
170
プロダクトという一杯を作る - プロダクトチームが味の責任を持つまでの煮込み奮闘記
hiliteeternal
0
300
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
83
9.1k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Why Our Code Smells
bkeepers
PRO
337
57k
GraphQLとの向き合い方2022年版
quramy
49
14k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
182
54k
What's in a price? How to price your products and services
michaelherold
246
12k
Code Reviewing Like a Champion
maltzj
524
40k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
Unsuck your backbone
ammeep
671
58k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
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