Ruby言語の正規表現エンジンとしても使われているOnigmo(鬼雲)を高速化したのでその話をします。 Onigmoでは、正規表現のマッチにはバイトコードインタプリタを用いてNFAの実行をしています。バイトコードインタプリタの高速化には古くから知られている技法…
H2Oの内部では,数値,文字列のフォーマッタとしてsprintfが用いられています. 我々は,最近までsprintf専用ソースコード変換器, qrintfのチューニングを行っていました. 本稿ではqrintfの概要と今回適応した工夫,そして今後の課題についてまとめておきま…
Ruby向けJITコンパイラ RuJIT Advent Calendar 8日目です. RuJITに最近追加された最適化(?)の1つにJITコンパイルされた機械語(以下JITコード)中で毎回実行されるメソッド再定義チェックなど実行時検査コードの除去があります.ただ,実行時検査コード…
Ruby向けJITコンパイラ RuJIT Advent Calendar 7日目です. そろそろRuJITの中身についても書くことがなくなってきましたが,今日もRuJITの中身について書きます.今日はRuJITを起動するエントリーポイントの部分を見ていきます. RuJITを起動するためのフッ…
Ruby向けJITコンパイラ RuJIT Advent Calendar 6日目です. 今日はYARVバイトコードからLIRへの変換をサンプルコードを用いて説明する. 実行の流れ まずはRubyプログラムのYARVバイトコードへのコンパイルについて概要を述べておく. CRubyはRubyプログラム…
Ruby向けJITコンパイラ RuJIT Advent Calendar 4日目です.今日はRuJITの中間表現 LIRを紹介します.RuJITの中間表現LIRはYARVバイトコードを参考に設計したレジスタベースの中間表現で,実行時に収集した型情報をもった中間表現です. LIRの定義はlir.defに…
Ruby向けJITコンパイラ RuJIT Advent Calendar 5日目です. 今日はYARVバイトコードからLIRへのコンパイラについて書きます. YARVバイトコードからLIRへのコンパイラはsendやinvokeblockなど複雑なバイトコード命令を除きほとんどが自動生成されるコードに…
Ruby向けJITコンパイラ RuJIT Advent Calendar 3日目です. 本稿では,RuJITのビルド方法と動かし方について説明します.本稿ではOSX環境を前提に話を進めますが,Linux環境でも同じように動作すると思います. ビルドに必要なソフトウェア RuJITはCRubyのVM…
Ruby向けJITコンパイラ RuJIT Advent Calendar 2日目です. 今日は,現在私が開発を行っているCRuby向けtrace-based JIT, RuJITの概要を説明していきたいと思います. はじめに RuJITはCRuby用trace-based JITコンパイラです.開発は以下URLにて行っています…
Ruby向けJITコンパイラ Advent Calendar1日目. 1日目はJITコンパイラについて書こうと思います. JITコンパイラとは? JITコンパイラとは,プログラム実行中にコンパイルを行うコンパイラです.Wikipediaによれば以下の様なものを指すようです. 実行時コ…
Ruby処理系向けトレース方式JITコンパイラRuJITの開発日記を始めました.