2008-01-01から1年間の記事一覧

llvmrubyチュートリアル (その2)

「最初に書くプログラムはHello Worldであること」という法律に従ってこのチュートリアルでもHello Worldを取り上げます。ただし、多くのプログラム言語と違いllvmrubyのHello Worldは難しいです。このプログラムを書くのに結構いろいろ調べました。ほとんど…

llvmrubyチュートリアル (その1)

明日、LLVM 2.4がリリースされるそうです。これまで、llvmrubyを使うためにはSVNで開発版LLVMを取ってきてコンパイルする必要があったのですが、llvmrubyを使う敷居が一気に下がりそうです。また、llvmrubyもgem化されていてインストールがかなり容易になっ…

ブロックが動いた

とりあえず、ブロックが動くようになりこんな感じのプログラムがコンパイル・実行できるようになりました。 def times j = 0 while j < self yield j j = j + 1 end 0 end def send_with_block(n) a = 0 n = n + 0 n.times do |i| a = a + i end a end 一見…

llvmrubyをフォークした

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)にあるので、見てみました。型…

自分用メモ(yarv2llvm)

llvm.frameaddressを使うとsetdynamic, getdynamicが実現できそうフレームにはサイズの違うデータが混在するから、フレームの構造を表すStructの定義を生成して、llvm.frameaddressの戻り値をそのStructでキャストする必要があるような気がする。

面白そうな言語

propellaさんの日記(言語ゲーム)に面白そうな言語が紹介されていました(http://d.hatena.ne.jp/propella/20081018/p1)。 この中のjolt2が面白いなと思いました。jolt2のコード生成ルーチンを上手に使うと、Rubyがうまく動かせるコード生成ライブラリが得られ…

LLVMとGC

もし(そうじゃないことを祈っていますが)、LLVMでGCを作らなければならなくなったら、きっとお手上げなんだろうなって考えていました。ところが、今日調べてみるとちゃんとGCのAPIが用意されていることが判りました。 http://llvm.org/docs/GarbageCollectio…

HidekじゃないよHidekiだよ

うおー、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の作者に取り上げてもらった

llvmrubyの作者のブログでyarv2llvmのことを取り上げてくれました。とてもうれしいです。http://llvmruby.org/wordpress-llvmruby/?p=27いろいろ情報交換をしたいのですが、英語がネックです。英語を勉強しなくては。I have big pleasure that yarv2llvm was…

llvmはrubyには堅すぎる

ささださんのコメントの返事の続きです。 たった2週間しかllvmに触っていない(しかもllvmruby越しに)ので私の勘違いかも知れないです、ということを断っておきます。 本質的には、rubyのような動的言語を実現するにあたって、llvmでネイティブコードを生成し…

yarv2llvmが動き出した

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

yarv2llvmを書くことにしました

レンラダが不完全だけど動き出して気づいたのは、これ手でllvmに直していたら苦労するなってことです。しかも、レンラダのアルゴリズムを替えると苦労はみんな水の泡。 そこで、YARVの出力をllvmにするプログラムを作ろうと思い立ちました。Syoyoさんのpy2ll…

llvmrubyの次のサンプル

正規表現も完全には動かないのですが、飽きてきたので中断して次のサンプルを作ることにしました。 今度はレンダラをやってみようと思いました。minilightというRubyで書いた優れたレンダラがあるのですが、自分の勉強を兼ねて1から作ることにしました。 ア…

正規表現コンパイラをgithubに置きました

正規表現コンパイラをgithubに置きました。 http://github.com/miura1729/regexpllvm/tree/master生成したllvmのbitcodeを最適化できるようにしました。 やっていることは、bitcodeをファイルに書き出してoptを呼んでいるだけです。 def optimize bitout = T…

Rubyによる正規表現コンパイラ(その4)

状態遷移表を作るルーチンreexp_compにバグが一杯あって、作り直しています。大体うまく行くようになっていますが、まだ動きが変です。あと、llvmrubyを改造してoptimizerをサポートしようと考えています。 いづれにしても区切りが付いたらgithubに置きたい…

Rubyによる正規表現コンパイラ(その3)

ベンチマークしてみました。 if __FILE__ == $0 then require 'benchmark' ruby = "ruby" perl = "perl" dumy1 = "absadsafdsredddkflr" dumy2 = "sse3fdfds2#%666721" all = (dumy1 + dumy2 * 2 + dumy1) * 109000 + ruby + dumy1* 12 + dumy2 * 11 + perl …

Rubyによる正規表現コンパイラ(その2)

ようやくできた! 苦しかった・・・。 昨日のruby66版の後ろにくっつけるか別ファイルにしてrequireするように書き換えてください。次はベンチマークを行います。llvmrubyではまったところ 関数の引数で渡した文字列はVALUE型なのでそのままでは、扱えません…

Rubyによる正規表現コンパイラ(その1)

llvmrubyのサンプルで何か作りたいなと思い、正規表現コンパイラを作ろうと思い立ちました。 調べてみたらomoさんがllvmで正規表現コンパイラを作っていましたhttp://www.dodgson.org/omo/t/?date=20071215。これをllvmrubyに移植しようと思ったのですが、コ…

llvmrubyを使ってみた

少しいじってみました。主にRubyのJITを目指しているruby_vm.rbあたりを主にいじっています。 面白いのですが、まだちょっと完成度が低く感じます。気づいたこと Ruby 1.9.0でも古いバージョンを使っているような気がします。新しいバージョンだと動かないと…