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

Ruby 1.9.0のバイトコードをいじり倒す(その6)

いろいろなところで、Ruby 1.8.xと1.9.0の非互換性が話題になっていますが、バイトコードをいじくってちょっと乗り越えてみようという*冗談*です。 今回まな板にあげる非互換性は、ブロックローカル変数です。 たとえば、 a = 12 0.upto(1) do |n| a = a + 2…

Ruby 1.9.0のバイトコードをいじり倒す(その5)

現在分かっているInstructionSequcenceの問題点です。いろいろ、追ってみたのですが分からないです。 prog = <

Ruby 1.9.0のバイトコードをいじり倒す(その4)

そういえば、言い忘れていましたが、タイトルにいじり倒すと書いてある割りには、バイトコードを1から作る話は出てきません。バイトコードを1から作る話としては、hzkrさんのScheme on YARV(http://d.hatena.ne.jp/hzkr/20070323#p3)がすばらしいです。 私…

Ruby 1.9.0のバイトコードをいじり倒す(その3)

では、このVMLib::InstSeqTreeを使って、トレースを実現したいと思います。各ブロックの始まりと終わりにprintメソッドの呼び出しを追加して、ファイル名と行番号を入れるようにします。 require 'instruction' require 'pp' include VMLib iseq = VM::Instr…

Ruby 1.9.0のバイトコードをいじり倒す(その2)

VM::InstructionSequenceの簡単な使い方です。 require 'pp' iseq = VM::InstructionSequence.compile("print 'Hell world\n'") PP.pp iseq.to_a VM::InstructionSequence.load(iseq.to_a).eval 出力結果は次のようになります。 ["YARVInstructionSequence/S…

Ruby 1.9.0のバイトコードをいじり倒す(その1)

昨日の日記を書いたら、おとなり日記に入っていたsshiさんの日記(http://d.hatena.ne.jp/sshi/20071226)でVM::InstructionSequenceを使う話が出ていました。VM::InstructionSequenceは消え行く運命で、使っている人も少ないみたいですが、私は大好きなので、…

ruby 1.9.0-0をコンパイルした

クリスマスにリリースされたruby 1.9.0-0をコンパイルして試してみました。 VM::InstructionSequence#loadが無くなっちゃったのはちょっと残念ですが、仕方がないですね。予定通りの話ですし。InstcutionSequenceをいじるCライブラリを書かないといけないか…

ランダム生成の改良?

昨日のプログラムのランダム生成は余りにもめちゃめちゃな出力なので、少し、文法に則ってるかチェックするようにしました。チェックの結果ダメならやり直さなければならないのですが、やり直すロジックはかなり面倒です。SICPでこの手の処理を継続で書いて…

プログラムのランダム生成作ってみました

マルコフ連鎖を利用してプログラムをランダムに作るプログラムを作ってみました。種のプログラムを指定するとそれを元に、推移表を作ってプログラムを合成します。SEEDPROG定数に種になるプログラムのファイル名を指定します。pcompose.rbはこの生成プログラ…

言語処理系のランダムテストのメモ

言語処理系のランダムテストは、マルコフ連鎖を利用するとうまく行くような気がします。ちょうど、自然言語でそれっぽい文章をマルコフ連鎖で作れるように、それっぽいプログラムが自動生成できるんじゃないかなと思います。試してみたいのですが、今はかな…

RushCheckでFloatのカスタマイズをしてみた

poor man's rubyでRushCheckを使うため、Floatのカスタマイズをしてみました。バグが出やすいところを集中的にテストできるようにランダムの分布を制御できるようにしました。 統計とか詳しくないので、これでいいのか知らないですが、正規分布の組み合わせ…

poor man's rubyの高速化検討

デバッグしないといけないが、つい楽しい方に流れてしまいます。そういうことで、minilightを実行したときのプロファイルをとってみました。 $ gprof /usr/local/bin/static-poorruby Flat profile: Each sample counts as 0.01 seconds. % cumulative self …

poor man's rubyでminilightが動いた

poor man's rubyでようやくminilight(http://www.hxa7241.org/minilight/minilight.html)が動きました。速度を測ってみました。colinux(Linux 2.6.12 Pentium4 2.8GHz)での計測です。付属のcornellboxをレンダリングしました。 時間は次の通りです。 $ time …

poor man's rubyのパッチ

まだ、一杯バグがありますけど、パッチを晒します。 ライセンスはruby's でお願いします。変更情報 バグがあったので直しました。 2007/12/9 直したのは、 条件比較が思い切りバグっていたので直しました。Floatの数値をポインタのまま比較していました。 EP…

久しぶりにpoor man's rubyのデバッグ

ここ1週間全然プログラムが出来なかったけど、ようやく時間が取れたのでpoor man's rubyのデバッグをやってみました。 make testでコアを吐いてしまう件について追ってみました。プログラムは次のようなものです。 x = Proc.new { binding }.call eval("i4 =…

Dynamoの話めちゃくちゃおもしろい!

http://dodgson.org/omo/t/?date=20071201面白いです。Dynamoのアプローチ面白いなと思いました。Time Warpアルゴリズムに通じるものがあるなと思います。一貫性は余り気にせず、矛盾が生じたら何とかするというアプローチは分散処理が大規模になると必須に…

poor man's rubyの詳細

yarv-devに投稿したものに加筆しています。fixnumに泣いてもらってfixnumの領域に押し込むようにしました。fixnumは30bitを越えるとbignumになってしまいます。 フォーマットは xxxxxxxxxxxxxxxxxxxxxxxxxxxx11 FIXNUM xxxxxxxxxxxxxxxxxxxxxxxxxxxx01 FIXFL…

poor man's rubyの生い立ち

poor man's rubyはもともとメーリングリストyarv-devで発表した笹田さんの浮動小数点数をポインタ領域に押し込むというアイデアが元になっています。笹田さんが64bit CPUを対象にしたものでdoubleを押し込めることを考えているとのことでした。 一方、私は64…

開発環境をcolinuxに移した

CygwinでCのコードをデバッグすると、余りに不便なのでcolinuxに開発環境を移しました。ダイナミックリンクした先でもちゃんとソースコードデバッグできるし、なかなか快適そうです。でも、最終的にはwin32oleが使いたいので、Cygwinで動くようにしないとい…

poor man's rubyのデバッグを始めた

RushCheckを使っての、poor man's rubyのデバッグを始めました。 デバッグしたいのはRubyの処理系なので、RushCheckをpoor man's rubyで動かすわけには行きません。そこで、普通のrubyでRushCheckを動かして、パイプでpoor man's rubyのテストプログラムを流…

RushCheckにモナドをみた

coarbitaryって何やってるんだろうということを理解するためにinteger.rbのInteger#coarbitaryを見てみました。 無断引用です。まずかったら教えてください。 # this method is needed to use Coarbitrary. def coarbitrary(g) m = (self >= 0) ? 2 * self :…

ランダムテストについて

ランダムテストについていろいろ調査するにあたって、出来るかどうかは別として考えをまとめます。ランダムテストというのはやったことがないのですが、使用する乱数は一様分布じゃなくてある程度分布が制御できるといいのではないかなと思います。例えば、p…

RushCheckを調べてみた

まず始めに、RushCheckすげーーーーー!!! やりたいことはほとんどRushCheckとそのカスタマイズで出来そうです。ただし、調べたいのはRubyのプログラムじゃなくて、Rubyそのものなのでプロセス間通信するなどの工夫が必要そうです。使い方の概要はtakkan_m…

poor man’s rubyの状況とランダムテスト

poor man's rubyはFIXNUMに泣いてもらってFloat(単精度になります)をポインタ領域に押し込むことでFloatを高速化するというruby 1.9.0のパッチです。今のところ、結構動くようになってobject_idも対応できているようです。それでも、minilight(http://www.hx…

デバッガのソースコード

とりあえず、デバッガのソースコードを掲載します。instruction.rb # # instruction.rb - structured bytecode library # module VMLib class InstSeqTree Headers = %w(magic major_version minor_version format_type misc name filename type locals args…

開発日記を始めることにしました

miuraと申します。いろいろなプログラムを書いています。このブログではプログラムの開発の話を書こうと思っています。今、作っているプログラムは ruby 1.9.0のVM:InstructionSequenceを使ったバイトコードパッチ式のデバッガ ruby 1.9のFloatをVALUEに埋め…