IronRuby と MRIの比較 (その1)

| コメント(0) | トラックバック(0) このエントリーを含むはてなブックマーク

数ヶ月前にIronRubyを知るために、IronRuby と matz氏のruby の実行結果を比較をした。
その結果を自分のPCのディスクの肥やしになっていてもしょうがないということで、記載してみようと思う。

基本的に、IronRuby は動くだろうという前提のもと、自分の興味のある部分についてテストしただけなので、まったくもって網羅されてない。

何故そんなことを思ったのかを踏まえて記載出来ればと思う。

基本は、matz氏のruby と IronRuby を比較していたわけですが、この記事を記載するにあたり、せっかくなので IronRuby と ruby 1.8 と ruby 1.9 全てについて調べてみようと思う。

 

01_puts.rb

puts "hello world"
puts ['abc',123,:def,[1,2,3]].inspect

興味のある部分は、inspect の挙動。同じ表現で出てくれるか。

ちなみに inspect 挙動は以下の通り。

instance method Object#inspect
inspect -> String 
オブジェクトを人間が読める形式に変換した文字列を返します。 

実行結果

C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\01_puts.rb
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
hello world ["abc", 123, :def, [1, 2, 3]] C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\01_puts.rb
ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32] hello world ["abc", 123, :def, [1, 2, 3]] C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\01_puts.rb IronRuby 0.9.1.0 on .NET 2.0.0.0 hello world ["abc", 123, :def, [1, 2, 3]]

 

02_missing.rb

def method_missing( name , *args )
  p name
  p args
end

xxx(1,2,3)

興味のある部分は、method_missing が呼ばれるか、適切に情報が渡ってくるか

method_missing は以下のような挙動を示すこととなる。

instance method Object#method_missing
method_missing(name, *args) -> object 
呼びだされたメソッドが定義されていなかった時、Rubyインタプリタがこのメソッドを呼び出します。 
呼び出しに失敗したメソッドの名前 (Symbol) が name にその時の引数が第二引数以降に渡されます。 
デフォルトではこのメソッドは例外 NameError を発生させます。 

実行結果

C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\02_missing.rb
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
:xxx
[1, 2, 3]

C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\02_missing.rb
ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]
:xxx
[1, 2, 3]

C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\02_missing.rb
IronRuby 0.9.1.0 on .NET 2.0.0.0
:xxx
[1, 2, 3]

 

03_pp.rb

require 'pp'
pp [1,2,3,4,5,'1'*40,{:a=>1,:b=>[1,2,3]}]

興味のある部分は、ppライブラリが正しくどうさするか(inspectの結果からは正しいと思うけど)及び、ハッシュの記載方法などが処理されるか。(何故テストしたかは不明)

実行結果

C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\03_pp.rb
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
[1,
 2,
 3,
 4,
 5,
 "1111111111111111111111111111111111111111",
 {:a=>1, :b=>[1, 2, 3]}]

C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\03_pp.rb
ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]
[1,
 2,
 3,
 4,
 5,
 "1111111111111111111111111111111111111111",
 {:a=>1, :b=>[1, 2, 3]}]

C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\03_pp.rb
IronRuby 0.9.1.0 on .NET 2.0.0.0
[1,
 2,
 3,
 4,
 5,
 "1111111111111111111111111111111111111111",
 {:a=>1, :b=>[1, 2, 3]}]

 

04_each.rb

[1,2,'ab',:xxx,[1]].each do |item|
	p item
	p item.class
end

興味のある部分は、class メソッドでクラス名が取得できるか

実行結果

C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\04_each.rb
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
1
Fixnum
2
Fixnum
"ab"
String
:xxx
Symbol
[1]
Array

C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\04_each.rb
ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]
1
Fixnum
2
Fixnum
"ab"
String
:xxx
Symbol
[1]
Array

C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\04_each.rb
IronRuby 0.9.1.0 on .NET 2.0.0.0
1
Fixnum
2
Fixnum
"ab"
String
:xxx
Symbol
[1]
Array

 

05_caller.rb

require 'pp'
def func3
    pp caller
end

def func2
    func3
end

def func1
    func2
end

func1

興味のある部分は、callerの動作について。これはコールスタックを一覧でだしてくれる。何故欲しいか?は想像にお任せします。

module function Kernel.#caller
caller(level_num = 1) -> [String] | nil 
level_num 段上の呼び出し元の情報を $@ の形式のバックトレース(文字列の配列)として返します。 
トップレベルでは空の配列を返します。caller の戻り値を $@ に代入することで例外の発生位置を設定できます。 
指定した level_num 段上が存在しない場合は nil を返します。 

実行結果

C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\05_caller.rb
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
["mytest/05_caller.rb:8:in `func2'",
 "mytest/05_caller.rb:12:in `func1'",
 "mytest/05_caller.rb:15"]

C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\05_caller.rb
ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]
["mytest/05_caller.rb:8:in `func2'",
 "mytest/05_caller.rb:12:in `func1'",
 "mytest/05_caller.rb:15:in `
'"] C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\05_caller.rb IronRuby 0.9.1.0 on .NET 2.0.0.0 ["mytest/05_caller.rb:8:in `func2'", "mytest/05_caller.rb:12:in `func1'", "mytest/05_caller.rb:15"]

 

06_localvar.rb

x=1
y=2
z='abc'

local_variables.each do |name|
	puts name
end

興味のある部分は、local_variablesの動作について

module function Kernel.#local_variables
local_variables -> [String] 
現在のスコープで定義されているローカル変数名の配列を返します。 

実行結果

C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\06_localvar.rb
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
x
y
z

C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\06_localvar.rb
ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]
x
y
z

C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\06_localvar.rb
IronRuby 0.9.1.0 on .NET 2.0.0.0
x
y
z

 

まとめ?

変態コードを沢山試してきたが、このくらいの変態度合いでは、差異は見つからなかった。すごいぞIronRuby。まぁこのくらいこなしていないと RubyOnRailsは動作しないだろうけど。

ちなみに、もう少し試したコードがあるので、続きは次回にでも。

トラックバック(0)

トラックバックURL: http://www.m-tea.info/mt-tb.cgi/9

コメントする

あわせて読みたいブログパーツ

このブログ記事について

このページは、k1ha410が2009年10月29日 10:45に書いたブログ記事です。

ひとつ前のブログ記事は「IronRuby 日本語処理(その3)」です。

次のブログ記事は「IronRuby と MRIの比較 (その2)」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。