ソフトウェアサイエンス特別講義C Ruby インタプリタの構成に見る 実際の

ソフトウェアサイエンス特別講義C
Ruby インタプリタの構成に見る
実際のシステムソフトウェア
笹田耕一
Heroku, Inc.
Ruby 処理系概要
Ruby処理系の構成
概要
• プログラムを読んで
• 実行
3
プログラムを読むところ
• コンパイラ
• パーサ(文字列→構文木(AST))
• トークン分割(文字列→トークン列)
• 構文解析(トークン列→構文木)
• 意味解析(1)
• コンパイラ(構文木→バイトコード)
• ラベル解決
• 意味解析(2)
Ruby 1.9 から
コンパイラ追加
4
実行するところ
• 評価器
• バイトコードを実行
• メソッドフレーム単位での実行
• 例外処理
• C レベルでのインターフェース
• オブジェクトを管理
• クラス・モジュール構造の管理
• メソッドの管理
• ガーベージコレクション(寿命の自動管理)
• 組込クラス・メソッド
5
ASTとRuby 1.8
Abstract Syntax Tree
Ruby Program
Parse
a=b+c
Ruby 1.8 はAST を単純
にたどるインタプリタ
a=
Method
Dispatch(:+)
b
c
6
YARVの全体像
Ruby プログラム
AOT コンパイラ
コンパイラ
C プログラム
YARV 命令列
JIT コンパイラ
C コンパイラ
機械語
VM(実行)
拡張ライブラリ
7
YARV – Stack Machine
Ruby Program
a=b+c
Compile
YARV Instructions
getlocal
getlocal
send
setlocal
b
c
+
a
a
b+c
b
c
c
b+c
b
YARV Stack
8
オブジェクトの管理
• メモリ管理
• OSから借りてくるメモリの管理
• オブジェクトの寿命管理
• ガーベージコレクション
9
Ruby処理系のファイル構成
• 最初に付いてくるもの
• バージョン管理システム(VCS)で管理
• 自動的に生成するもの
•
•
•
•
自動的に生成するものは原則、VCS で管理しない
configure 関連
パーサ関連
VM関連
10
Ruby処理系の作り方
• まずはソースコードをチェックアウト
• http://svn.ruby-lang.org/repos/ruby/trunk
• README ファイルを読んで、実際にビルドしてみよう
• 後で、どこで躓いたか教えてもらうので(この時間の課
題)メモしておいてください。
• 困ったらググるなり、笹田に聞くなりして下さい。
• ※ビルドには、ソースコード生成ツールを利用
• パーサ関連:yacc(bison)、lex
• VM関連:rubyを利用
11
ディレクトリ構成
• ./
• *.c, *.h: ソースコード本体(C言語)
• *.def: VM の命令定義(オリジナル言語(C+α))
• include/
• 一緒にインストールされるファイルが置いてある
• 1.9 から、インストールする *.h が制限 なぜか?
• enc/
• 文字列エンコーディング(文字コード)関連
• defs/, template/
• 自動生成で利用する定義ファイル、テンプレート
• bcc32, cygwin, …
• アーキテクチャ依存ファイル
• missing/
• OSなど環境によってあったりなかったりする関数の定義
12
ディレクトリ構成
• bin/, man/, lib
• インストールされる実行ファイル、man、ライブラリ
• ext/
• インストールされる標準添付ライブラリ(C)
• sample/, doc/
• サンプルスクリプトとドキュメント
• sample/test.rb: まつもとさん用の伝統的なテスト
• test/, booststraptest/, benchmark/
• テスト、基礎的なテスト(何が違うか?)、ベンチマーク
• tool/
• ビルドなどで利用するスクリプトなど
13
ファイル構成
• コア部分
•
•
•
•
•
•
parse.y: 構文解析
compile.c, iseq.c: コンパイラ
vm*.c: VM
gc.c: メモリ、オブジェクト管理(GC)
object.c: オブジェクト管理
…
YARV と言われている
部分はごく一部
• 組込クラス、メソッド部分
•
•
•
•
string.c
array.c
time.c
…
ソースコード的には
この部分が一番多い
• prelude.rb
• 実行時に読み込まれる初期化スクリプト(なぜ必要か?)
14
自動生成されるファイル
• *.inc
• insns.def などから Rubyスクリプトで生成したC言語ソー
ス
• VM関連定義ファイル
• どこかから #include して利用
• VM関連の操作は機械的に可能なものが多いため
• 自動的に最適化するため
• parse.c
• parse.y から生成(bison)
• prelude.c
• prelude.rb から生成
15
演習:自分Rubyの開発
• $ ruby -v を実行したら,何か自分専用の挙動をす
るようにしてみよう
• 参考:
http://bugs.rubylang.org/projects/ruby/wiki/DeveloperHowtoJa
16
演習:改造
1. VALUE の定義を探そう
2. NODE の定義を探そう
3. “foo”.hello() とすると “Hello foo” を返すメソッドを
追加(ヒント: String クラスに追加)
4. Fixnum で足し算したら引き算になるように変更
(ヒント:VMの中身まで見ないと厳しい)
5. GC でオブジェクト終了のお知らせを表示
6. その他、好きなこと
17