ソフトウェアサイエンス特別講義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
© Copyright 2024 ExpyDoc