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
270
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cコンパイラ自作はじめてみた
セキュリティ・キャンプ全国大会2022アフターイベント LT発表
mikiken
September 17, 2022
More Decks by mikiken
See All by mikiken
ライフゲームの製作
mikiken
0
250
簡単な4bitCPUの作成
mikiken
0
1.4k
Webブラウザでページが表示されるまで
mikiken
0
84
seccamp2022 成果発表
mikiken
0
52
Other Decks in Programming
See All in Programming
共通化で考えるべきは、実装より公開する型だった
codeegg
0
220
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
250
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
220
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
320
フィードバックで育てるAI開発
kotaminato
1
110
Creating Composable Callables in Contemporary C++
rollbear
0
210
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
170
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
130
えっ!!コードを読まずに開発を!?
hananouchi
0
200
Performance Engineering for Everyone
elenatanasoiu
0
270
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
130
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
Featured
See All Featured
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
600
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Product Roadmaps are Hard
iamctodd
55
12k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
The untapped power of vector embeddings
frankvandijk
2
1.8k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
500
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
410
30 Presentation Tips
portentint
PRO
1
350
We Have a Design System, Now What?
morganepeng
55
8.2k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
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