Ruby

ソース隠蔽手法

昨日の続き。隠蔽といってもアセンブラレベルでは見れてしまうので頑張れば解析可能なわけだが。Rubyのアセンブラは高レベルなので読みやすいというのが難点か。 ともあれ、このようなファイルを作る。名前はiseqloader.rbとしよう。 require 'fiddle' class…

バイトコードのローディング

ちょいとメモ。 require 'fiddle' class RubyVM class InstructionSequence addr = Fiddle.dlopen(nil)['rb_iseq_load'] fn = Fiddle::Function.new( addr, [Fiddle::TYPE_VOIDP] * 3, Fiddle::TYPE_VOIDP) define_singleton_method(:load) do |dat, par=nil…

Rubyのインスタンス変数について

Rubyの特徴としてよく言われるのは「すべてがオブジェクト」だが、オブジェクトであるならばインスタンス変数を持つことができる。今回はRubyのインスタンス変数についての色々。 インスタンス変数とは Rubyでは「@」ひとつで始まる変数名が自動的にインスタ…

TypedDataについて

Ruby2.0でC拡張ライブラリ用のオブジェクト形式としてTypedDataが追加されている。俺はずっとRuby1.8&1.9用に作ってたからつい最近まで知らなかったのだが(新しいREADME.EXT.jaにも書いてないし)、RGenGCに対応する方法を追っかけてたらなんか出てきたという…

RGenGCに対応する方法

Ruby2.1.0-preview1は出たがREADME.EXT.jaを見ても書いてないので調べたことをここに書いておく。正式なマニュアルじゃないし検証してるわけでもないから豪快に間違っているかもしれん。■はじめに RGenGCは今までの拡張ライブラリのコードそのままで動作する…

Ruby2.1.0-preview1

今年の12/25リリース予定であるRuby2.1.0のpreview1が出たのでDXRubyをそのままコンパイルして動くかどうかを試してみた。 Ruby2.1ではGCが世代別GCになって、本来であれば拡張ライブラリは修正が必要になるもんなのだが、そこはうまいこと細工してそのまま…

パンの袋をとめるアレをクロージャといいます。

DXRubyWSではシグナルハンドラやオートレイアウトの定義でクロージャを多用するのだが、クロージャと言われてもピンとこない人は結構いるのではないかと思う。今回はクロージャとは、という話。■スタックとローカル変数 Rubyでメソッドを定義するとその中で…

スタックとキューの速度

RubyではスタックもキューもだいたいArrayを使って実装する。Arrayの一番後ろに追加、取り出しをするのはpush/popメソッドで、一番前にするのはunshift/shiftである。これらをどういう組み合わせで使うかでスタックとキューのどっちかになるわけだが、組み合…

アリーナのかいしんのいちげき

mrubyにはmrb_gc_arena_save()/mrb_gc_arena_restore()という関数があって、これを使わずにCでオブジェクトを作りまくるとエラーでコケる。この件について作者のMatzが直々に日記を書いておられる。(http://www.rubyist.net/~matz/20130731.html#p01) mruby…

mrubyのハッシュ

直してプルリしたら受け付けられたので喜びのメモ。ハッシュについて。 https://github.com/mruby/mruby/commit/00353a3c42e0a65fbf2e2b355535ff6fce2e872a#include/mruby/khash.hRubyではインスタンス変数やメソッドのテーブルはハッシュテーブルとして保持…

DLとWin32APIとFiddle

Rubyには外部のライブラリの呼び出しインターフェイスとしてDLというライブラリが添付されているが、Ruby2.0になってそれは廃止予定になってFiddleが追加された。他にWindows用にはWin32APIもある。このへんをまとめる。■Ruby1.8時代 Win32APIが独自実装で存…

メジャーGCを減らす作戦

RGenGCやmrubyのシンプルな2世代管理の世代別GCでは、新世代オブジェクトはマイナーGCで1回マークされるだけで旧世代オブジェクトになる。この方式の利点は処理が軽いことで、欠点はマイナーGC実行時にタイミング悪く参照されていた一時オブジェクトが長寿命…

ライトバリアの改善策

RGenGCもmrubyも世代別GCなのでライトバリアがある。 どっちもたとえば配列aに新オブジェクトbをpushした場合に、配列aを記録しておいて後で探索するという動作をする。なぜbじゃなくaなのかと言うと、bは配列に突っ込んですぐ取り出して捨てる可能性があり(…

RGenGCとC拡張ライブラリの関係

Ruby2.1のRGenGCについて対応などを考えていたので個人的まとめ。■世代別GCとC拡張ライブラリの相性の悪さ RGenGCは世代別GCである。通常はRubyシステムによって適切に制御されたライトバリアと世代別管理されたGCによって効率よく処理されるが、C拡張ライブ…

世代別とインクリメンタル

mrubyでどのように実現しているのかを眺めてみたので把握したことを個人的メモ。■世代別GCとインクリメンタルGC mrubyでの世代別GCは全探索するメジャーGCと、差分探索するマイナーGCに分かれる。このうちマイナーGCはルートスキャンからスウィープまで一気…

tri-color inclemental gcの色

mrubyのgcを眺めていて把握したことを個人的メモ。mrubyは世代別GC+インクリメンタルGCなわけだが、このインクリメンタルGCはtri-color inclemental gcとコメントに書いてあるようにオブジェクトのマーク状態を色で表現している。3色で白、灰色、黒となって…

RubyとGCについて

思ったことをつらつらと支離滅裂な個人的メモ。1.シンプルマルチスレッドGCこのあいだからいじってるやつだが、とりあえず世代別GCがあるのとないので3倍も違うというのはおかしいのでまだどこかバグっているんじゃないかと思う。効率面での話なのでヒープ…

マルチスレッドGC実験その後

動きのおかしいコードをそのままにしておくのも気持ち悪いのできちんと動くように修正してみた。64指定のao-render.rbが34秒で動くようになったので相当おかしいことになっていたのだと思う。githubにあげたコードはあれこれいじっているが、バグっていた箇…

mrubyでマルチスレッドGCを実験する

githubがよくわかってないのでbranchとかがなんか変なことになっているような気がするのだが、それはさておき。 このあいだ、マルチコアを活用するマルチスレッドGCについてアイデアをひらめいたので、とりあえず手ごろなmrubyをいじって実験してみようと思…

Ayame/Ruby0.0.2

3年以上あけてAyame/Rubyのバージョンアップである。 http://dxruby.sourceforge.jp/files/ayameruby002-mswin32-ruby19.zip 今回はAyame同梱のサポートクラスを使ってフェードイン/アウトと状態取得メソッドの追加およびMIDIファイルの再生に対応している。…

Rubyの実行速度を考える

昔はよくこういうことをやっていた記憶がある。 ruby 1.9.3p125 (2012-02-16) [i386-mingw32]にて。そういえばしばらく更新してないから古いね。 require 'benchmark' Benchmark.bm {|x| x.report { 100000.times do Array.new(100) {1} end } x.report { 10…

mrubyのattr系メソッドの速度(2)

「attr系メソッド使うとすごく遅いからgetter/setterは自分で書いたほうがいい」とかいう話になると、Ruby的にはあまり喜ばしくない。 mrubyはターゲットが組み込みだったり、ゲーム用途も視野に入っているということなので、そういうことを気にする人という…

mrubyのattr系メソッドの速度

mrubyのbenchmarkディレクトリにao-render.rb(AOベンチ)があるわけだが、このコードを見ると例えばVevtorクラスのgetter/setterは自前で定義されている。作った人(@miura1729さん)によると元はytl用のものでattr系メソッドが無かったからということなのだが…

mrubyのop_enter_optimizeの話

一昨日、mrubyにNaN boxingが実装された。 https://github.com/mruby/mruby/commit/7d02df3016b0c6eb3f4ee945198772cf4ebca3fa 前に俺が試したナンチャッテNaN boxingではttが32bitのためにMRUBY_OBJECT_HEADERが大きくなっていたり、その他未解決の問題がい…

mrubyのContextThreading化 その5 最終回

こまごまとした修正と若干のパフォーマンスチューニングを入れて、O3コンパイルでmake testを通過できるようにしておいた。 https://github.com/mirichi/mruby/tree/ct この時点でAOベンチ(O3コンパイル)比較は 元のmruby:6分8秒(368秒) ContextThreading:…

mrubyのContextThreading化 その4

例外を処理するには現在のContextThreadingの仕掛けでは致命的な問題がある。ブロックの呼び出しにCPUスタックを使ってネストしたcall命令で処理しているところだ。 もともと、mrubyのVMではブロックの呼び出しにcallinfoとgotoを使っていてCPUのスタックを…

mrubyのContextThreading化 その3

不具合も解消したので未実装のものをどうにかする。とかいいつつ、実装しなければならないモノがどれだけあるのかわからないので目標をAOベンチ完走に置いて、動かないところを調べていった。 昨日の時点で未実装の機能はメソッド途中のOP_RETURNと、引数省…

mrubyのContextThreading化 その2

前回に引き続きmrubyをContextThreading化する。基本命令が動作するところまではできたので、次はOP_JMP系だ。 そのまえに、ローカル変数が動かなかった件は解決した。単純にi=*pcを書き忘れていて初期化されていなかっただけだった。よくそれで動いていたも…

mrubyのContextThreading化 その1

ちょっと前に間接分岐に関する記事を並べてみたわけだが、そもそも間接分岐自体を消してしまうテクニックも存在する。ContextThreadingという。これまた日本語の記事が無いのだが、軽い説明がこちらのブログにある。 http://d.hatena.ne.jp/higepon/20080510…

NaN boxingとsizeof(mrb_value)

mrubyはオブジェクトの型としてmrb_valueというものを使う。これは以下のような宣言になっている。 typedef struct mrb_value { union { mrb_float f; void *p; mrb_int i; mrb_sym sym; } value; enum mrb_vtype tt:8; } mrb_value;共用体valueに4つの型が…