Every repository with this icon (
Every repository with this icon (
Japanese
yarv2llvmのページです
yarv2llvmとは?
yarv2llvmは、Ruby1.9のバイトコード列をllvmに変換するソフトウエアです。llvmrubyを使用して、全部Rubyで書いています。バイトコード列への変換はRuby1.9の機能を使っていますが、あたかもyarv2llvmがRubyのコンパイラであるかのように使うことができます。ただし、yarv2llvmが変換できるメソッドや言語仕様は非常に限られています。
yarv2llvmの特徴は型推論を行い、余計な動的チェックを省いて高速に実行することです。どのくらい高速化されるかはプログラムによって異なりますが、Ruby1.9に比べてfibなど非常に単純なプログラムで最高で40倍くらい、通常の計算主体のプログラムで10~5倍くらい、ファイル操作やオブジェクトをがんがん生成するような場合でRuby1.9と同じくらいという感じです。
型推論が決まってちゃんと変換できればいいのですが、Rubyは非常に柔軟な言語なのでどうしても型推論ができない場合もあります。当初考えていたときよりかなり型推論できる範囲が広がっていっているのでまだわかりませんが、フルセットのRubyのサポートはこの先も無いと思います。
yarv2llvmはRubyのサブセットのくせにRubyから拡張されたものもあります。こんなものが拡張されています。
- マクロ
- Unsafe型オブジェクト
マクロは、Common Lisp風のものです。これを実現するためにYARVをRubyに戻す処理を実現しています。
Unsafe型オブジェクトはCレベルの構造体、配列、ポインタなどのデータ構造をWrapしたオブジェクトです。これを用いることでC言語の構造体などを直接いじることができます。まだ、十分な機能が揃っていませんが、最終的にはyarv2llvm自身で十分なパフォーマンスを発揮できるランタイムを全部記述できるようになると考えています。
サポートしている言語仕様
演算子
基本的に整数・浮動小数点数の2項演算子はすべて使えます。ただし、Bignumはサポートしていません。他のオブジェクトについては現在、少しずつ拡張しています。まだ、ユーザが演算子を定義することはできませんが、できる目処はたっています。オブジェクト、メソッド
yarv2llvmはランタイムとしてRuby 1.9のものをそのまま使っているので、Ruby1.9の組み込みのオブジェクトはすべて生成することができます。また、ブロックを伴わないメソッドならばすべて呼び出すことができます。ただし、この場合、メソッドの引数と戻り値の情報がないため、型推論が出来なくなります。情報が無い場合、メソッドの戻り値がObject型に推論されるため、返り値に対してObjectのメソッド以外呼べません。
メソッド毎に引数と戻り値の情報を付加することができるのですが、情報があるメソッドはほんの一部です。今後は少しずつ増えていく予定です。
制御構造、ブロック
if/while/untilなどは使えます。ブロックも使えますが、Procオブジェクトに変換することはできません。ブロックを受け取るメソッドはRuby 1.9のものをそのまま使うことができないので、yarv2llvm用に定義する必要があります。定義されたものはeach, Fixnum#timesなどほんの一部ですが、今後増えていく予定です。
例外やrescue/ensureなどはまだサポートしていません。
ブロックからのbreak, returnもRuby 1.9では例外を使って実現されているので、yarv2llvmではサポートしていません。ブロックをインライン化する(—inline-blockオプションをつけて)と動く場合がありますが、あまりお勧めしません。







