Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2005-02-05

[プログラミング]C にトランスレートされる何か

昨日の続きを SPL (相模湖ピクニックランド)への往復路で運転しながら考えていた。忘れないうちにメモしておく。

まずメソッド呼び出しをどう C で実現するか。

call_meth(obj_id, "meth_name", *p_block_fanc, arg0, arg1, arg2, ...);

という関数でよさそうな気がする。ブロック付きメソッドも関数ポインタでできるような気がするがどうだろう。ブロックはあらかじめ関数に展開しておく。 Ruby の仕様をよく知らなかったり、ましてや実装は何にも知らない(まだ調べてもいない)ので勝手な想像だが。

この方法だとメソッドがオブジェクトに定義されているかどうかを検索して、定義されていれば実行する。つまりオブジェクトに対して動的にメソッドの追加とすり替えが可能。あと、実際は文字列で渡しているメソッド名は整数型に変換しておいたほうが速そうだ。

なんか、これだけでほとんどのものがオブジェクト、ほとんどメソッド呼び出しが実現できそうなんだけどどうだろう。 if とか while についてはまだよく考えていない。

あと重要なのは C 言語とのやりとり。 C と Ruby っぽい書き方を同時に表現できるだろうか。

# foo.rb?
def foo
  print "hello\n"
=begin c
  /* ここは C 言語の世界 */
  printf("hello c\n");
=end
  C::printf "hello c\n" # これも C 言語関数の呼び出し
  return 1
end

=begin c
void foo_c()
{
  int num;
  num = foo;
}
=end

上記ソースが foo_rb.c に変換される。次は C ソース。そう言えば C の #include を使えば eRuby を使って埋め込む必要もないか。

/* main.c */
#include "foo_rb.c"

int main()
{
  foo();
  foo_c();
}

例えばこんな感じだろうか。メソッドの戻り値をどう C で受け取るかとか深く考えていないが、まあそれほど問題ないような。

面白いのでもう少し考えてみよう。