開発日記

JITコンパイラの開発日記だった

Onigmoのインタプリタをdirect threaded codeに置き換えてCRubyを8%高速化した話

Ruby言語の正規表現エンジンとしても使われているOnigmo(鬼雲)を高速化したのでその話をします。 Onigmoでは、正規表現のマッチにはバイトコードインタプリタを用いてNFAの実行をしています。バイトコードインタプリタの高速化には古くから知られている技法…

qrintfの最適化

H2Oの内部では,数値,文字列のフォーマッタとしてsprintfが用いられています. 我々は,最近までsprintf専用ソースコード変換器, qrintfのチューニングを行っていました. 本稿ではqrintfの概要と今回適応した工夫,そして今後の課題についてまとめておきま…

JITコードの無効化

Ruby向けJITコンパイラ RuJIT Advent Calendar 8日目です. RuJITに最近追加された最適化(?)の1つにJITコンパイルされた機械語(以下JITコード)中で毎回実行されるメソッド再定義チェックなど実行時検査コードの除去があります.ただ,実行時検査コード…

トレース選択器の起動

Ruby向けJITコンパイラ RuJIT Advent Calendar 7日目です. そろそろRuJITの中身についても書くことがなくなってきましたが,今日もRuJITの中身について書きます.今日はRuJITを起動するエントリーポイントの部分を見ていきます. RuJITを起動するためのフッ…

RuJITの中間表現 LIRへのコンパイル

Ruby向けJITコンパイラ RuJIT Advent Calendar 6日目です. 今日はYARVバイトコードからLIRへの変換をサンプルコードを用いて説明する. 実行の流れ まずはRubyプログラムのYARVバイトコードへのコンパイルについて概要を述べておく. CRubyはRubyプログラム…

RuJITの中間表現 LIR

Ruby向けJITコンパイラ RuJIT Advent Calendar 4日目です.今日はRuJITの中間表現 LIRを紹介します.RuJITの中間表現LIRはYARVバイトコードを参考に設計したレジスタベースの中間表現で,実行時に収集した型情報をもった中間表現です. LIRの定義はlir.defに…

RuJITの中間表現 LIRへのコンパイラ

Ruby向けJITコンパイラ RuJIT Advent Calendar 5日目です. 今日はYARVバイトコードからLIRへのコンパイラについて書きます. YARVバイトコードからLIRへのコンパイラはsendやinvokeblockなど複雑なバイトコード命令を除きほとんどが自動生成されるコードに…

RuJITの動かし方

Ruby向けJITコンパイラ RuJIT Advent Calendar 3日目です. 本稿では,RuJITのビルド方法と動かし方について説明します.本稿ではOSX環境を前提に話を進めますが,Linux環境でも同じように動作すると思います. ビルドに必要なソフトウェア RuJITはCRubyのVM…

RuJIT: a trace-based JIT compiler for CRubyの概要

Ruby向けJITコンパイラ RuJIT Advent Calendar 2日目です. 今日は,現在私が開発を行っているCRuby向けtrace-based JIT, RuJITの概要を説明していきたいと思います. はじめに RuJITはCRuby用trace-based JITコンパイラです.開発は以下URLにて行っています…

Just In Time(JIT) コンパイラとは?

Ruby向けJITコンパイラ Advent Calendar1日目. 1日目はJITコンパイラについて書こうと思います. JITコンパイラとは? JITコンパイラとは,プログラム実行中にコンパイルを行うコンパイラです.Wikipediaによれば以下の様なものを指すようです. 実行時コ…

RuJIT開発日記

Ruby処理系向けトレース方式JITコンパイラRuJITの開発日記を始めました.