Slide 1

Slide 1 text

Building a "Ruby-like Language" Compiler in Ruby RubyでつくるRubyみたいな言語のコンパイラ Fukuoka RubyistKaigi 04 2024.09.07 @htkymtks 1

Slide 2

Slide 2 text

🐦 自己紹介 はたけやまたかし 株式会社永和システムマネジメント Twitter(現X): @htkymtks 2

Slide 3

Slide 3 text

ドラゴンブック読書会から来ました From the Dragon Book reading group 3

Slide 4

Slide 4 text

🏁 趣味 低レイヤプログラミング 自作CPU 自作RISC-Vシミュレータ MinCamlコンパイラの移植 4

Slide 5

Slide 5 text

🐪 MinCaml → 💎TinyRuby 趣味のMinCamlコンパイラの移植を行なっているうちに、1からコ ンパイラを作りたくなる そこで TinyRuby ですよ!!! 5

Slide 6

Slide 6 text

今日話すこと TinyRubyの紹介 コンパイラ作成Tips コンパイラはじめの一歩 6

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

TinyRuby のビルドと実行 こんな感じにビルドする # コンパイルしてアセンブリを出力 $ ruby tinyrubyc.rb sample.rb > sample.s # アセンブリをアセンブルして実行ファイルを作成 $ gcc sample.s libtinyruby.c # 実行 $ ./a.out 55 8

Slide 9

Slide 9 text

TinyRuby のパーサー TinyRubyのパーサーはMinRubyのパーサーをその まま利用 MinRuby 書籍「RubyでつくるRuby」に登場するRubyの サブセット MinRuby との差異 データ型は整数型のみ ArrayとHashをサポートしない 関数の引数は6つまで TinyRubyはMinRubyのサブセット 9

Slide 10

Slide 10 text

TinyRubyコンパイラのターゲット環境 CPU x86-64 OS Linux 開発環境 MacやWindowsの人はDocker上のLinux環境などで開発してね 10

Slide 11

Slide 11 text

コンパイラ作成のTips 1. Cコンパイラが出力するアセンブリコードを活用 2. レジスタとABIを知る 3. 小さなステップで進める 11

Slide 12

Slide 12 text

Cコンパイラが出力するアセンブリ コードを活用 アセンブリの書き方に悩んだら、Cコンパイラが出力するアセンブリ を確認する 2つの確認方法 (1) Compiler Explorer (2) GCCの -S オプション 12

Slide 13

Slide 13 text

️ Compiler Explorer ( https://godbolt.org/ ) 様々な言語・様々なCPUのアセンブリ出力を確認できる神サイト 0:00 / 0:24 13

Slide 14

Slide 14 text

GCCの -S オプション GCC の -S オプションで、Cからアセンブリを出力できる // test.c int return_100() { return 100; } $ gcc -S -masm=intel test.c 14

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

️ Compiler Explorer と GCC の使い分け Compiler Explorer が出力したアセンブリは、出力オプションやプラ ットフォームの違いで、そのままでは動かないことがある 出力したアセンブリをそのままビルドにかけたい場合 → GCC それ以外 → Compiler Explorer 16

Slide 17

Slide 17 text

レジスタとABIを知る コンパイラが出力するアセンブリを理解するためには、対象となる CPUの「レジスタ構成」と「ABI」を知る必要がある 17

Slide 18

Slide 18 text

汎用レジスタ一覧 x86-64 の 16 本の 64 ビット汎用レジスタ レジスタ名 用途 レジスタ名 用途 RAX 関数の戻り値など R8 関数の第五引数など RBX R9 関数の第六引数など RCX 関数の第四引数など R10 一時データ置き場 RDX 関数の第三引数など R11 一時データ置き場 RSI 関数の第二引数など R12 RDI 関数の第一引数など R13 RBP ベースポインタ R14 RSP スタックポインタ R15 18

Slide 19

Slide 19 text

x86-64 のABI (Application Binary Interface) アセンブリ言語レベルでの関数の呼び出し規約などのこと 19

Slide 20

Slide 20 text

(x86-64 での) 関数の引数の渡し方 最初の6つの引数は、RDI, RSI, RDX, RCX, R8, R9 レジスタに渡す 7つ目以降の引数は、スタックに積む (x86-64 での) 関数の戻り値の返し方 戻り値は、RAX レジスタに返す 20

Slide 21

Slide 21 text

ABI の詳細資料 x86-64 の ABI の詳細については、以下のドキュメントなどを参照 System V Application Binary Interface AMD64 Supplement https://refspecs.linuxbase.org/elf/x86-64-abi-0.99.pdf 21

Slide 22

Slide 22 text

小さなステップで進める 小さなステップで機能を追加していく 整数リテラル 四則演算 プリント関数呼び出し 複数ステートメント 変数の代入と参照 比較演算 条件分岐 関数呼び出し 関数定義 22

Slide 23

Slide 23 text

🚦テスト駆動開発 (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

Slide 24

Slide 24 text

🐾 小さなステップで進めることのメリット コンパイラに必要な知識を段階的に習得できる 適度な粒度でテストを書きやすい → テスト駆動開発が行いやすい 24

Slide 25

Slide 25 text

🚗 テスト駆動開発(TDD)のメリット 目の前の問題にだけ集中できる テスト実施が容易 フィードバックを即時に得られる 短いサイクルで達成感を得られるため、モチベーションを維持しや すい 25

Slide 26

Slide 26 text

📖 参考資料 低レイヤを知りたい人のためのCコンパイラ作成入門 https://www.sigbus.info/compilerbook An Incremental Approach to Compiler Construction http://scheme2006.cs.uchicago.edu/11-ghuloum.pdf 26

Slide 27

Slide 27 text

🚀 コンパイラはじめの一歩 これまで紹介したTipsを使って、整数を評価してリターンコードとし て返すだけのコンパイラを作成します 0:00 / 3:11 27

Slide 28

Slide 28 text

続きはこちら https://scrapbox.io/htkymtks/TinyRubyコンパイラ 28

Slide 29

Slide 29 text

まとめ TinyRuby の紹介 コンパイラ作成のTipsの紹介 Cコンパイラが出力するアセンブリコードの活用 レジスタとABIを知る 小さなステップで進める コンパイラ作ってみたくなった? コンパイラを通して低レイヤの世界にふれてみよう! 29

Slide 30

Slide 30 text

提供 株式会社 永和システムマネジメント 30