第2回の読書メモです。 第1回はこちら
【読書メモ】組込Ruby「mruby」のすべて(第1回) - ちくわ
改めて、こちらの本です。
第2回では実際に mruby をコンパイルしてプログラムを動かす事が中心にかかれています。
- mruby は最初から英語 & GitHub で開発
- mruby を持ってきてコンパイル (こちらは前回 hello world を表示した際に実行済み)
- bin/mruby のコマンド実行 (書籍では tools/ 配下となっていたが、現在は bin/ になっていた)
bash-3.2$ ./bin/mruby -e 'puts "Hello"' Hello
bash-3.2$ bin/mirb mirb - Embeddable Interactive Ruby Shell > puts "Hello" Hello => nil > quit
- mruby のテスト
bash-3.2$ .//build/test/bin/mrbtest mrbtest - Embeddable Ruby Test ...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................?................................................................................................................................................................................ Skip: Module#prepend super in alias super does not currently work in aliased methods Total: 899 OK: 899 KO: 0 Crash: 0 Time: 0.28 seconds
- mruby を動かしてみる
bash-3.2$ ./bin/mirb mirb - Embeddable Interactive Ruby Shell > class Foo * def foo(a) * p a * end * end => :foo > f = Foo.new => #<Foo:0x7fab7b807d30> > f.foo ArgumentError: 'foo': wrong number of arguments (0 for 1) > f.foo("hi") "hi" => "hi"
CRuby と mruby の違い
- 実装及びAPI - Ruby1.9 と互換性を目指し、完全に新規に実装
- 足りないクラス・機能 - プラットフォーム依存のクラスは提供できず、サブセットになっている. IO, Thread, Process, system など
- 言語仕様上の差異
- 特殊変数が無効 -
$?
とか - Ruby2.0 の機能が無い - Ruby1.9 をベースに開発したよ
- Hash のキーに順序が無い
- 整数除算の結果が違う - CRuby だと 1/2 は 0 だけど、mruby だと 0.5 になる. Bignum が無いため.
- 特殊変数が無効 -
フィボナッチ数のベンチマーク比較@local Mac
- 書籍だと mruby と ruby1.9 の性能比はさほど無い (mruby:ruby1.9 = 1:0.98 とか) なのに、だいぶ差が出てしまった。何かあるのだろうか...
bash-3.2$ cat benchmark/bm_fib.rb def fib n return n if n < 2 fib(n-2) + fib(n-1) end puts fib(37)
mruby
bash-3.2$ time ./bin/mruby benchmark/bm_fib.rb 24157817 real 0m12.679s user 0m12.656s sys 0m0.012s
ruby 1.9 (rbenv で install & 実行)
bash-3.2$ ruby -version ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-darwin15.4.0] -e:1:in `<main>': undefined local variable or method `rsion' for main:Object (NameError) bash-3.2$ time ruby benchmark/bm_fib.rb 24157817 real 0m4.733s user 0m4.365s sys 0m0.342s
他、書籍にはマンデルブロ集合ベンチマークなるものがあったが、mruby リポジトリには同梱されてないようでした。 ポイントは以下
- 浮動小数点数計算は mruby 有利
- ガベージコレクションやオブジェクト生成の有無によって、mruby や ruby のバージョンで性能結果は入れ替わることがある