[MD3]動的言語について3

 Dynamic Language Runtime(DLR)の設計目標において、共有オブジェクトという考え方があります。具体的には、以下の図のようなことを実現するためのものです。
OneObject

異なる言語間でオブジェクトを共有しようとしますので、「obj.x」という記述から「obj」というオブジェクトインスタンスに対して以下の手順を踏むことを表わしています。

  1. xというメンバーを持っていますか(ゲッター)。
    持っていればメンバーを返します。
  2. 返されたメンバーを使って呼び出します。

このオブジェクトに対して、DLRは メンバーに対するGet/Set/Deleteを提供します。もちろん言語による制約(たとえば、大文字・小文字を区別するとか)も考慮されます。このオブジェクトを実現するための型としてDynamicTypeが提供されます。つまり、DLR上で作成されるオブジェクトは、全てがDynamicTypeを使って実現されると言うことができます。

このDLRのソースコードを提供しているIronPython 2.0アルファ1の大まかな構造は、以下のようになっています。
IPY20A1

この図にある「Microsoft.Scripting.Vestigal」とはIronPythonがDLRへ対応する過程で残ったもののようです(Vestigalの意味は、傷痕といったものです)。このため、最終リリースでは無くなるのではないかと推測されます。

現状のDLRの実装では、DynamicTypeはDynamicMixinを継承して作成されています。このDynamicMixinを見ていくと、大文字・小文字を区別するとかオペレータやコンバートメソッドなどが含まれているのが解かります。そしてオブジェクトやメソッドの名前などを保持するためにSymbolIDの辞書を持っていることにも気が付きます。つまり、オブジェクトへのメンバーがあるかどうかを問い合わせるのにSymbolID辞書を探しているということを表しているわけです。

ご興味があればソースコードを調べてみてください。なかなか興味深い発見があるかも知れません。