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
RubyでつくるRubyみたいな言語のコンパイラ
Search
Takashi Hatakeyama
September 07, 2024
0
150
RubyでつくるRubyみたいな言語のコンパイラ
コンパイラ初学者が、Rubyみたいな言語のコンパイラをRubyで作る話です。
Takashi Hatakeyama
September 07, 2024
Tweet
Share
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
2.9k
What's in a price? How to price your products and services
michaelherold
244
12k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Building Applications with DynamoDB
mza
94
6.3k
The Language of Interfaces
destraynor
156
24k
GitHub's CSS Performance
jonrohan
1030
460k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
40
2k
The Cult of Friendly URLs
andyhume
78
6.3k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
A Tale of Four Properties
chriscoyier
158
23k
Gamification - CAS2011
davidbonilla
80
5.2k
Transcript
Building a "Ruby-like Language" Compiler in Ruby RubyでつくるRubyみたいな言語のコンパイラ Fukuoka RubyistKaigi
04 2024.09.07 @htkymtks 1
🐦 自己紹介 はたけやまたかし 株式会社永和システムマネジメント Twitter(現X): @htkymtks 2
ドラゴンブック読書会から来ました From the Dragon Book reading group 3
🏁 趣味 低レイヤプログラミング 自作CPU 自作RISC-Vシミュレータ MinCamlコンパイラの移植 4
🐪 MinCaml → 💎TinyRuby 趣味のMinCamlコンパイラの移植を行なっているうちに、1からコ ンパイラを作りたくなる そこで TinyRuby ですよ!!! 5
今日話すこと TinyRubyの紹介 コンパイラ作成Tips コンパイラはじめの一歩 6
TinyRuby の紹介 こんな感じのRubyみたいなプログラミング言語 # # sample.rb # def fib(n) if
n < 2 n else fib(n-1) + fib(n-2) end end # 10番目のフィボナッチ数を計算 p fib(10) 7
TinyRuby のビルドと実行 こんな感じにビルドする # コンパイルしてアセンブリを出力 $ ruby tinyrubyc.rb sample.rb >
sample.s # アセンブリをアセンブルして実行ファイルを作成 $ gcc sample.s libtinyruby.c # 実行 $ ./a.out 55 8
TinyRuby のパーサー TinyRubyのパーサーはMinRubyのパーサーをその まま利用 MinRuby 書籍「RubyでつくるRuby」に登場するRubyの サブセット MinRuby との差異 データ型は整数型のみ
ArrayとHashをサポートしない 関数の引数は6つまで TinyRubyはMinRubyのサブセット 9
TinyRubyコンパイラのターゲット環境 CPU x86-64 OS Linux 開発環境 MacやWindowsの人はDocker上のLinux環境などで開発してね 10
コンパイラ作成のTips 1. Cコンパイラが出力するアセンブリコードを活用 2. レジスタとABIを知る 3. 小さなステップで進める 11
Cコンパイラが出力するアセンブリ コードを活用 アセンブリの書き方に悩んだら、Cコンパイラが出力するアセンブリ を確認する 2つの確認方法 (1) Compiler Explorer (2) GCCの
-S オプション 12
️ Compiler Explorer ( https://godbolt.org/ ) 様々な言語・様々なCPUのアセンブリ出力を確認できる神サイト 0:00 / 0:24
13
GCCの -S オプション GCC の -S オプションで、Cからアセンブリを出力できる // test.c int
return_100() { return 100; } $ gcc -S -masm=intel test.c 14
GCCの -S オプション 出力されたアセンブリコード $ gcc -S -masm=intel test.c $
cat test.s .intel_syntax noprefix .text .globl return_100 .type return_100, @function return_100: push rbp mov rbp, rsp mov eax, 100 pop rbp ret 15
️ Compiler Explorer と GCC の使い分け Compiler Explorer が出力したアセンブリは、出力オプションやプラ ットフォームの違いで、そのままでは動かないことがある
出力したアセンブリをそのままビルドにかけたい場合 → GCC それ以外 → Compiler Explorer 16
レジスタとABIを知る コンパイラが出力するアセンブリを理解するためには、対象となる CPUの「レジスタ構成」と「ABI」を知る必要がある 17
汎用レジスタ一覧 x86-64 の 16 本の 64 ビット汎用レジスタ レジスタ名 用途 レジスタ名
用途 RAX 関数の戻り値など R8 関数の第五引数など RBX R9 関数の第六引数など RCX 関数の第四引数など R10 一時データ置き場 RDX 関数の第三引数など R11 一時データ置き場 RSI 関数の第二引数など R12 RDI 関数の第一引数など R13 RBP ベースポインタ R14 RSP スタックポインタ R15 18
x86-64 のABI (Application Binary Interface) アセンブリ言語レベルでの関数の呼び出し規約などのこと 19
(x86-64 での) 関数の引数の渡し方 最初の6つの引数は、RDI, RSI, RDX, RCX, R8, R9 レジスタに渡す
7つ目以降の引数は、スタックに積む (x86-64 での) 関数の戻り値の返し方 戻り値は、RAX レジスタに返す 20
ABI の詳細資料 x86-64 の ABI の詳細については、以下のドキュメントなどを参照 System V Application Binary
Interface AMD64 Supplement https://refspecs.linuxbase.org/elf/x86-64-abi-0.99.pdf 21
小さなステップで進める 小さなステップで機能を追加していく 整数リテラル 四則演算 プリント関数呼び出し 複数ステートメント 変数の代入と参照 比較演算 条件分岐 関数呼び出し
関数定義 22
🚦テスト駆動開発 (TDD) シェルスクリプトでテストを書いて、1機能ずつ実装していく # 整数リテラル assert 4649 'p 4649' #
四則演算 assert 20 'p 10 + 20 - 30 * 4 / 12' assert 60 'p 10 + 20 + 30' assert 40 'p 30 + 20 - 10' assert 200 'p 10 * 20' assert 33 'p 99 / 3' # 複文 assert 4649 '1 + 1; p 4649' # 変数 assert 10 'a = 10; p a' assert 30 'a = 10; b = 20; p a + b' 23
🐾 小さなステップで進めることのメリット コンパイラに必要な知識を段階的に習得できる 適度な粒度でテストを書きやすい → テスト駆動開発が行いやすい 24
🚗 テスト駆動開発(TDD)のメリット 目の前の問題にだけ集中できる テスト実施が容易 フィードバックを即時に得られる 短いサイクルで達成感を得られるため、モチベーションを維持しや すい 25
📖 参考資料 低レイヤを知りたい人のためのCコンパイラ作成入門 https://www.sigbus.info/compilerbook An Incremental Approach to Compiler Construction
http://scheme2006.cs.uchicago.edu/11-ghuloum.pdf 26
🚀 コンパイラはじめの一歩 これまで紹介したTipsを使って、整数を評価してリターンコードとし て返すだけのコンパイラを作成します 0:00 / 3:11 27
続きはこちら https://scrapbox.io/htkymtks/TinyRubyコンパイラ 28
まとめ TinyRuby の紹介 コンパイラ作成のTipsの紹介 Cコンパイラが出力するアセンブリコードの活用 レジスタとABIを知る 小さなステップで進める コンパイラ作ってみたくなった? コンパイラを通して低レイヤの世界にふれてみよう! 29
提供 株式会社 永和システムマネジメント 30