2013年3月6日水曜日

RClass (クラス図)

Ruby はオブジェクト指向プログラミング言語(OOPL)なので,クラスをどのように実現しているかを最初に読むのが良かろうと判断しました。メソッド(関数)がいっぱい定義されていますが,まずは静的構造から読み始めました。 class.h に定義されているクラス(構造体),RClass 周辺のクラス図を書きました。
C言語の構造体は OOPL のクラスに,C言語の関数は OOPL のメソッドに対応すると考えます。下記のクラス図で現れるクラスは,実際にはC言語の構造体で表されています。

RClass 周辺の(メタ)クラス図


RClass は mruby のクラスを実現するもので,おそらく Ruby Class の略なのでしょう。
RClass 自身への関連 super はスーパークラスを表現するものです。
RClass には他に iv と mt の2つの関連があります。おそらく iv は instance variable,つまりインスタンス変数(属性)を表していて,mt はメソッド(操作)なのでしょうね。
MRB_OBJECT_HEADER の本体は value.h で定義されています。「mruby のオブジェクトに付属するヘッダー」というような意味合いなのでしょう。

iv_tbl は「インスタンス変数テーブル」でしょうね。rootseg でつながっている segment がリスト構造になっています。size と last_len はリスト構造の長さに関わる変数だと思いますが,使い分けはソースコードをよく読まないとわかりません。

segment に実際のインスタンス変数のメタ情報が格納されるようです。key, val という変数名なので,連想配列のイメージを持てばよさそうです。

mrb_sym は mrbconf.h で定義されていて,実体は short になっています。「mrubyのシンボル」という意味でしょう。short 型ではありますが,mrb_sym を操作する専用の関数が定義されているようなので,クラスとして扱ってもいいのかもしれません。
mrb_value は value.h で定義されていて,実体は共用体(union)を含む構造体になっています。

kh_mt はメソッドを格納するのだと思いますが,実体はどこにも定義されていないように思います。メソッドを詳しく読まないとわからなそうです。

最後の fc_result は,現時点ではどんな役割を担っているのか,想像つきません。ここでも mrb_sym と mrb_value が登場します。

どうやら mrb_sym と mrb_value は mruby の基本的なデータ構造のようなので,次回はこれらを読むことにしようと思います。