Preludeのprecompile2011年 8月 13日プログラミング言語クラス  松下 正樹
rubyの処理の流れYARVという仮想マシンが存在コードを解析した後YARVが理解できる命令列にコンパイルし、実行する(例)puts “Hello, world!”               ↓ RubyVM::InstructionSequence.compile0003 putstring        "Hello, world!"0005 send             :puts, 1, nil, 8, <ic:0>
Preludeとは(1)インタプリタの起動時に毎回実行されるRubyスクリプトコードの内容MUTEX_FOR_THREAD_EXCLUSIVEの定義	(排他制御などに利用する為のVMグローバルなMutex)rubygem.rbをrequire(Rubyの標準パッケージ管理システム)エンコーディングの定義とそのエイリアス、トランスコーダ
課題実行ファイルにPreludeのRubyコードが埋め込まれていて、rubyは起動時にこのコードを解析、コンパイル、実行する起動時にコードの解析と、VARV命令列へのコンパイルが毎回必要Preludeの内容は変化しないので、前もってYARV命令列にコンパイルしておけば高速化が期待できる
Preludeのprecompilerubyのビルド時に、PreludeのRubyコードの内容をVARY命令列にコンパイルしておくrubyの起動時には、コンパイルしておいた命令列を読みだしてそのまま実行する
結果ビルド時にPreludeをprecompileしてファイルに書き出し、rubyの実行時にはコンパイル済みの命令列を直接実行できるようになったprelude.cに埋め込まれていたCの文字列
PreludeのRubyコードから生成したYARV命令列
precompileなしを1とした時のpreludeの実行にかかる時間
考察precompileしたのに遅い->解析とコンパイルにかかる時間よりも、文字列からのYARV命令列の復元にかかる時間の方が長いMarshal.loadがボトルネック?->YARV命令列専用の形式で高速化の可能性

Preludeのprecompile