[ruby-list:48600] [ANN] ytl 0.0.5 リリース
From:
"Miura Hideki" <m-72@...6.so-net.ne.jp>
Date:
2012-01-20 10:08:30 UTC
List:
ruby-list #48600
三浦と申します。 ytl 0.0.5をリリースしました。 ytlは超サブセットのRuby(正確にはRubyVM(YARV)の命令列)をX86(32bit, 64bit) に変換して実行するプログラムです。変換の際に型推論を行ってその情報による 最適化(動的ディスパッチや型チェックの削除やデータのUNBOX化など)を 行います。生成した機械語コードを格納する領域の管理などどうしてもRubyでは 書けないところ以外は型推論・アセンブル等も含めてRubyで書いています。 Ruby 1.9.2 p136以降でX86系のCPUなら動くと思います。32bit/64bitは RUBY_PLATFORMの情報を使って自動的に判別します。 このリリースにあたってruby 2.0.0dev [i386-cygwin] 及び、ruby 2.0.0dev [x86_64-linux] で動作確認しています。 SSE2を使っているのでPentium 4以前のものは動かないと思います。 gemでのインストールが可能なので gem install ytl でインストールできるとおもいます。 ytl [オプション] プログラム.rb で運が良ければ、Rubyより早く結果が得られます。 インストールや使い方については次をご覧ください。 https://github.com/miura1729/ytl/wiki/How-To-Use-%28In-Japanese%29 0.0.5では0.0.4に比べて次の2点が変わっています。 1. unboxedなオブジェクト及びオブジェクトのスタック割り付けのサポート 0.0.4でも実験的に入っていましたが、バグを修正し使用可能な場合が増えました。 unboxなオブジェクトとはRubyのオブジェクト(Fixnum. Float, Array, ユーザ定義オブジェクトなど) から型情報(ヘッダやFixnumの下位1bit)を取り除いたものです。 例えばArrayはC言語の配列ような構造になります。 オブジェクトの確保・解放が高速化されることが期待できます。 一方、オブジェクトをヒープではなくスタックで割り当てれる時は、スタック(マシンスタック ではなく、ヒープ上に領域を取ってFILOで管理する)にオブジェクトを割り当てるように しています。アロケーションの高速化、GCの頻度の軽減が期待できます。 これら機能により、shootout のbinary treeではナイーブにmallocを使ったC版を上回る 速度が出ています。ただし、オブジェクトのアロケーションが伴わない場合は型推論 が重くなる分遅くなります。また、unboxと通常のオブジェクトの相互変換をまだ作って いないので使えない場合があります。 2 スレッドのサポート ytl独自の機能として、スレッドをRubyのThreadクラスとは別にサポートしました。 GILの関係ないところでスレッドを作りますので並列に動きます。 排他制御のメカニズムとして、Concurrent revisionsライクな物を用意しました。 スレッドを作成するとselfがコピーされて並列に実行されます。 joinのタイミングで親スレッドと子スレッドのselfがマージされます。 マージする方法はカスタマイズすることができます。 フィボナッチ数を求めるマルチスレッドのプログラムの例です。 https://github.com/miura1729/ytl/blob/master/test/threadfib.rb ほとんど使ってないのでものすごくバギーです。次のバージョンまでには、ましになるでしょう。 そのほか、0.0.5でサポートされているRubyの仕様の詳細については 次のドキュメントを参照してください。 リリースノート https://github.com/miura1729/ytl/wiki/Relese-Node-in-Japanese サポートしている言語仕様 https://github.com/miura1729/ytl/wiki/language-spec-in-japanese ソースコードは https://github.com/miura1729/ytljit https://github.com/miura1729/ytl をご覧ください。