2008-11-01から1ヶ月間の記事一覧

木の循環検知、こんな感じだとどうでしょうか?

shiroさんのページより http://practical-scheme.net/wiliki/wiliki.cgi?Shiro 最後の "Best solution" にあげられてる「うさぎと亀」はあらゆるLisp/Scheme処理系で使われていると思う。list?は循環リストについても停止しないとならないため。 (CLのlistp…

ベ...ベンチマークの為にやっているんじゃないからねっ!

タイトルは大嘘でベンチマークの為に、トップレベルで定義されたメソッドはselfを渡さないようにしました。これでちょっとベンチマークが速くなります。まあ、ベンチマークだけじゃなくてクラスを使わないプログラムだと恩恵があるのではないかなと思います…

ジャロに訴えられないようにしないと

Ruby Insideに取り上げられました!(http://www.rubyinside.com/llvmruby-a-compiler-toolkit-available-to-rubyists-1362.html) フィボナッチ級数のベンチマーク(http://d.hatena.ne.jp/miura1729/20081012/1223785541)がリンクされていてすごい勢いでアク…

本日のyarv2llvm

すっかりChangeLogと化しています 本日はこんなことをしました。 バグの修正 def tgc i = 320000 b = [1] while i > 0 a = [1, 2, 3, 4, 5, 7, 8] c = [1, 2, 3, 4] i = i - 1 end b end こんなプログラムで、GCをいじめたら落ちてしまいました。GC周りかな…

結構いいコードが生成できるようになりました

基本ブロック内の変数畳み込みなどを実装しました。 def array3 a = [1, 2, 3, 4, 5] i = 0 i = i + 0 a[i] = 2 p i a[i] + a[1] + a[2] end がこんな感じに生成されます。pメソッドのの呼び出しのところでRubyでは変数iですが、0であることが静的に判る(本…

配列の高速化を実装しました

yarv2llvmはデータマイニングやグラフィックスなど速度が必要なプログラムで、Hot spotになっているところを高速化するという感じで使うことを考えています。このような場合、行列計算など配列の操作が多いのではないかなと思います。 これまで配列の参照(op…

llvmrubyでRubyを拡張する

yarv2llvmはコンパイルするプログラムを文字列で与えています。これは、Rubyでバイトコード列を得るAPIがRubyVM::InstructionSequence.compileとcompile_fileしかなくどちらもRubyのプログラムを文字列で与えるためです。コンパイルするプログラムを文字列で…

yarv2llvmでサンプルを書きました

yarv2llvmのサンプルを追加しました。自然対数の底を約1000桁求めるというものです。 作っていて色々バグが出たので直しました。引数を渡す順番が違っていて、2つ以上引数を渡すとうまく動かなかったのには我ながら呆れました。 require 'yarv2llvm' YARV2LL…

LLVMで分散処理(めも)

LLVMって色々なアーキテクチャで動くからネットワークにLLVMのビットコードを流すようにして、プログラムの状態をfirst classで扱うような機能が付けばyarv2llvmでプロセスのマイグレーションができそう。といっても、ここにはLLVMが動きそうなパソコンは1台…

invoke/unwindを使った場合のコード

色々調べてllcに-enable-correct-eh-supportなるオプションがあることがわかった。とりあえず、invoke/unwindを使ったbit codeをファイルに落としてllcでX86の機械語に変換してみました。 こんなコードです。 ; ModuleID = 'foo.bc' define i32 @test2() { b…

llvmrubyにinvoke/unwindを追加できました

昨日の日記のアサーションエラーが解決しました。原因はllvmrubyそのものでもLLVMでも無く、使い方の問題でした。 b.invoke(f2, nd, ud) b.return(1.llvm) # ここがだめ と、invoke命令の後にreturnをつけていたのですが、これがいけなかったようです。invok…

llvmrubyにinvoke/unwindを追加してはまっています。

llvmrubyはinvoke/unwind命令の生成がまだサポートされていないので、それらの命令のサポートを作っています。作るのはそれほど難しくないのですが、変なアサーションが出ます。 assertion "use_empty() && "Uses remain when a value is destroyed!"" faile…

yarv2llvmの例外処理

mandel.rbを動かすためには例外処理を実装する必要があることがわかりました。ブロックの中でbreakを使っていて、これを実行するためには2レベルの関数呼び出し(Range#eachがはさまれる)をreturnする必要があるからです。LLVMの仕様をみてみるといくつか例外…

llvmチュートリアル(その4)

今回は関数を定義してみたいと思います。llvmrubyで生成したllvmのコードをRubyから実行するには、関数を定義しないといけません。ちょうど、C言語でmain関数を定義しないといけないことと似ています。ただし、llvmrubyでは関数の名前は正しい関数の名前であ…

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

その2で重要なことを書き忘れていました。LLVM::Module.new('hello')の戻り値のLLVM::Moduleクラスのインスタンスは重要です。llvmrubyで何かを行う場合はたいていこの戻り値に対してメソッドを呼び出す形になります。続いて、実際に実行する命令を定義して…

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 一見…