読者です 読者をやめる 読者になる 読者になる

ちくわ

ちくわにきゅうりを入れるとうまい

【読書メモ】組込Ruby「mruby」のすべて(第2回)

第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 のバージョンで性能結果は入れ替わることがある