ひとり勉強会

ひとり楽しく勉強会

2007-02-05から1日間の記事一覧

まとめ

というわけで、これでコンパイル処理は完成です。次回からはVMの実行部のコード読みに移ります。ではではー。

iseq_translate_direct_threaded_code @ compile.c

いよいよステップ5です。YARVの命令処理は「ダイレクトスレッデッドコード」という方式で高速化されています。これについては YARV Maniacs 【第 3 回】 が詳しくてしかもわかりやすいです。それまで他の解説読んでもスレッデッドコードの意味がわからなく…

set_optargs_table @ compile.c

あれれ、コンパイルのところで見落としてました。メソッドのデフォルト引数は、こういう風にコンパイルされるみたいです。 /* * set optional argument table * def foo(a, b=expr1, c=expr2) * => * b: * expr1 * c: * expr2 */ 該当コードはiseq_compile→N…

set_exception_table @ compile.c

次は、set_sequenceで計算したラベルの位置情報を使って、例外ハンドラのテーブルを構築します。コンパイル時に「このラベルからこのラベルの間で例外が発生したら・・・」式のテーブルを作ってあったので、これを単純に、ラベル情報からアドレス情報を取得…

set_sequence @ compile.c

では、ステップ4に進みます。 ここまでのステップで、Ruby の構文木が、命令 (struct INST) とラベル (struct LABEL) のリンクリストへと変換されました。リンクリストのままだと直接実行するにはまだ向かないので、次は、これをYARVの仮想マシン語のバイト…

特化命令(続)

その前に、前回のささださんにコメントいただいた点について、まとめます。YARV Maniacs 第9回 での解説に加えて、現在ではsendメソッドの特化機能が追加されているそうです。 id = :method ... obj.send(id, args) という記述を obj.method(args) と書いた…

YARV ソースコード勉強会 (11)

遊びすぎで気づいたら金曜日と土曜日と日曜日が終わってました。。。今回は、YARVのコンパイルステップ4と5を読みます。 step 4: 命令のリンクリストから、バイトコード(ワードコード)列への変換 step 5: スレッデッドコードのための準備