2008-10-01から1ヶ月間の記事一覧
llvmrubyを使っていて困るのがllvmから出るassertエラーです。llvmに渡すパラメータが不正だと、assertエラーが発生するのですが、これが起こるとエラーが起きたことだけを報告してそのままプログラムが終了してしまいます。そのエラーがどこで起きたかも、…
yarv2llvmはブロック呼び出しを作っています。ブロックを伴ったメソッド呼び出しは、引数に呼び出し元のフレームへのポインタとブロックの関数へのポインタ(ブロックは関数で実現します)がこっそり引数として追加されます。多分ここで関数の定義と呼び出しで…
yarv2llvmは現在、fib以外のベンチマークを作るため、Rubyのソースコードにあるbm_so_mandelbrot.rbを動かそうと色々拡張しています。なぜbm_so_mandelbrot.rbかといえば、それ以外はクラスとかつかっていて動きそうに無いからです。 今のところ、動かすとcr…
InfoQの記事にコメントが入っていて、Ludicrous JIT Compiler なるものが紹介されていました http://rubystuff.org/ludicrous どうもかなり完成度が高そうです。ソースがgithub(http://github.com/cout/ludicrous/tree/master)にあるので、見てみました。型…
llvm.frameaddressを使うとsetdynamic, getdynamicが実現できそうフレームにはサイズの違うデータが混在するから、フレームの構造を表すStructの定義を生成して、llvm.frameaddressの戻り値をそのStructでキャストする必要があるような気がする。
propellaさんの日記(言語ゲーム)に面白そうな言語が紹介されていました(http://d.hatena.ne.jp/propella/20081018/p1)。 この中のjolt2が面白いなと思いました。jolt2のコード生成ルーチンを上手に使うと、Rubyがうまく動かせるコード生成ライブラリが得られ…
もし(そうじゃないことを祈っていますが)、LLVMでGCを作らなければならなくなったら、きっとお手上げなんだろうなって考えていました。ところが、今日調べてみるとちゃんとGCのAPIが用意されていることが判りました。 http://llvm.org/docs/GarbageCollectio…
うおー、InfoQに取り上げられてる!!!(http://www.infoq.com/news/2008/10/llvmruby-roundup-yarv2llvm) 自分のことを取り上げてもらって完全には理解できない自分の英語力が悲しいです。llvmrubyでできることって意外と狭いような気がします。llvmrubyで…
関数の呼び出し情報を使って型推論をする機能を入れてみました。あまり、使いどころは無いような気がしますが(必要なら+ 0.0とか入れて型を指定すればいいから)、面白いかなと思います。 def fact(n) n end def llvmfib(n) fact(3.9) if n < 2 then 1 else l…
配列の型推論が出来るようになりました。 YARV2LLVM::compile(<<-EOS def arr1() a = [] a[0] + 1 a end def arr2() a = [] a[0] + 1.0 a end EOS ) arr1 :() -> Array of Int32Ty arr2 :() -> Array of FloatTya[0] + 1でnilと1を足しているじゃないかと突…
yarv2llvmは今は配列の型推論を作っています。これができたら、関数と構造体を作って型推論は終わりにしようと思っています。クラスとメソッドはどう考えても今の延長ではできないと思います。そういえば、PyPyを落として見ています。面白いです。 GCがPytho…
llvmrubyの作者のブログでyarv2llvmのことを取り上げてくれました。とてもうれしいです。http://llvmruby.org/wordpress-llvmruby/?p=27いろいろ情報交換をしたいのですが、英語がネックです。英語を勉強しなくては。I have big pleasure that yarv2llvm was…
ささださんのコメントの返事の続きです。 たった2週間しかllvmに触っていない(しかもllvmruby越しに)ので私の勘違いかも知れないです、ということを断っておきます。 本質的には、rubyのような動的言語を実現するにあたって、llvmでネイティブコードを生成し…
yarv2llvmの生成したコードが動くようになりました。 使い方は、 require 'vmtraverse' としておいて、こんな感じでメソッドを定義します。 YARV2LLVM::compile( <
yarv2llvmを相変わらず作っています。if文で分岐する場合も対応できるようになりました。llvm命令の中でも峠らしいPHI命令を使っています。生成したコードはまだ動かしていないのですが果たしてうまく行くのか・・・。 今後はコードがめちゃめちゃ汚いので、…
とりあえず、コード生成が出来るようになりました。コード生成が正しいかどうかはこれから確かめます。 さっきの、foo, bar, bazはこんな感じに生成されます。追記 見たら、全然正しくないです。まだまだ、苦労は続きそうです。 ; ModuleID = 'yarv2llvm' de…
yarv2llvmを作っています。とりあえず、型推論が動き出しました。まだ、fixnumとfloatしか対応していませんが、それなりに判断しているみたいです。 ソースは http://github.com/miura1729/yarv2llvm/tree/master にあります。こんな感じのプログラムを食わ…
これまで書かれたプログラムの中で、それがHello Worldである割合と、これまで書かれた言語処理系の中で、それがLisp系言語である割合は常に同じじゃないのかな。
llvmもRubyも全然関係ないのですが。コロコロコミック「とどろけ! 一番」の突っ込みです。http://blog.livedoor.jp/textsite/archives/cat_1048649.html#19434227
レンラダが不完全だけど動き出して気づいたのは、これ手でllvmに直していたら苦労するなってことです。しかも、レンラダのアルゴリズムを替えると苦労はみんな水の泡。 そこで、YARVの出力をllvmにするプログラムを作ろうと思い立ちました。Syoyoさんのpy2ll…
正規表現も完全には動かないのですが、飽きてきたので中断して次のサンプルを作ることにしました。 今度はレンダラをやってみようと思いました。minilightというRubyで書いた優れたレンダラがあるのですが、自分の勉強を兼ねて1から作ることにしました。 ア…