Hatena::ブログ(Diary)

miura1729の日記 このページをアンテナに追加 RSSフィード

2008-10-12

llvmはrubyには堅すぎる

19:42 |  llvmはrubyには堅すぎるを含むブックマーク  llvmはrubyには堅すぎるのブックマークコメント

ささださんのコメントの返事の続きです。

たった2週間しかllvmに触っていない(しかもllvmruby越しに)ので私の勘違いかも知れないです、ということを断っておきます。

本質的には、rubyのような動的言語を実現するにあたって、llvmネイティブコードを生成して実行するまでのオーバヘッドが大きすぎるかなとと感じていいます。llvmrubyではllvmのbit codeをネイティブコードに変換して実行するのに大体0.1秒掛かるようです。そうすると、このままでは動的にbit codeを書き換えて再実行するということはほとんど不可能です。動的言語を高速に実行するためのInline cacheなどのテクニックは動的にコードを書き換えることが必須にあると思います。そうでなければ、あらかじめ条件分岐を設ける必要があり、Inline cacheにならないためです。

そのように考えると、llvmJITを作るという試みはCなど(ひょっとすると関数型言語も)の言語は良いのですが、Rubyのような動的言語では制限があるように感じます。ちょろめのV8ネイティブを直接吐いて命令書き換えも高速に出来るようですが、移植性を犠牲にしてもそういった戦略でインプリメントしないと高速な処理系は出来ないのかなと思います。V8はGoogleのリソースに飽かせて贅沢仕様なのかなと思ったのですが、結構本質的な話なのかなと思うようになりました。

yarv2llvmで出来るとこまでやったら、その後は次のような選択があるかなと思います。

  1. llvmに手を入れる
  2. V8が使えないか考える
  3. 独自にJITライブラリを作る
  4. llvmバージョンアップするまで待つ(llvmは動的に最適化することを考えているので、動的書き換えが効率化するようにバージョンアップするかもしれない)
  5. もう全部あきらめる

ささだささだ 2008/10/12 14:44 おお,すばらしい.

miura1729miura1729 2008/10/12 18:19 ありがとうございます
でも、まだチャンピオンデータで動くだけです。単項マイナスすらサポートして無いし。もうちょっと先に進めると思います。でも、C言語相当の機能が限界かなーって思います。

AdrianAdrian 2008/11/28 18:34 Unfortunately, I don't understand Japanese, but the benchmarks speak for themselves. Keep it up!

miura1729miura1729 2008/11/29 07:10 Thank you for your comment.
Current version of yarv2llvm become little slower than this article. Because support 'self' variable. I have some idea for speed up, but I think I can't make speed of yarv2llvm with current feature over this article.