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の方が都合が良いかもしれませんね。