IronじゃないRuby.NET
IronRubyのお陰でGardens Point Ruby.NET Compilerの影が薄くなっていますが、IronRubyに対してどのような差別化をしていくか気になるところです。現時点で注目すべきポイントは、他言語との相互運用です。IronRubyからC#のコードを呼ぶことはできますが、その逆のC#からIronRubyのコードを呼ぶためにはHosting APIを使う必要があります(って試してないですが、IronPythonと同じなら、そーなるハズ)。Hosting API経由というのは正直言って扱いにくいです。ですが、Ruby.NETで作成したアセンブリは、そのままC#から呼び出せるのです。Ruby.NETの実装は内部的にRubyインタプリタを呼んでいるはずなので、いったいどーやっているのでしょうか?
例えば、下記のようなクラスがあったとします。
class Person def init(name, age) @name = name @age = age end def print() puts "#{@name} is #{@age}" end end
これをコンパイルしてDLLを作成してみます。
$ rubycompiler /t:library person.rb
これをReflectorでディスアセンブルしてみると・・・
public class Person : Object { // Methods public Person() : base(SourceFile_person.Person) { } public Person(Class klass) : base(klass) { } public override object init(object p1, object p2) { return Eval.Call2(this, "init", p1, p2); } public override object print() { return Eval.Call0(this, "print"); } }
こんなラッパーを作っていたのでした。C#などの言語をメインで使って一部をRubyで実装するみたいな場合には、Ruby.NETの方が都合が良いかもしれませんね。