簡単な言語の作り方2

前回はIronPython 2.0 A8に含まれるDLRを使って、独自言語をホスティングするコンソールのみを作成しました。これから独自言語を定義していくのですが、その前にA6以前とA7以降のホスティングの変更点を説明します。

  • LanguageProviderが廃止され、LanguageContextに統一された。
  • 上記に伴って独自のScriptEngineではなく、Microsoft.Scripting.Hosting.ScriptEngineを使用するようになった。

この2点の変更が非常に大きな特徴ではないかと私は考えています。A6のIronPythonでは、LanguageProviderを使ってIronPythonLanguageProviderを定義していました。このIronPythonLanguageProviderのGetEngineメソッドで、PythonEngineのインスタンスを取得していました。PythonEngineは、ScriptEngineを継承しているIronPython用のスクリプトエンジンでした。これがA7以降では、DLRのScriptEngineを使用するようになったためにPythonEngineの中身が無くなりました。A7以降でPythonEngineは残されていますが、ScriptEngineを継承しているだけで実装コードが無くなっています。多分、開発中の名残かIronPython独自のホスティングのためだけに残されているのかも知れません。
 それとScriptEngineを取得するためにGetEngineメソッドを前回は使用しました。これ以外にGetEngineByFileExtentionメソッドもあります。このメソッドの名前が示すように、拡張子を利用してScriptEngineを取得します。拡張子を利用するためには、前回に説明したRegisterLanguageContextメソッドを使用する必要があります。それでは現在のDLRで使用できる拡張子(言い換えれば言語)には、何があるのでしょうか。IronPython、JScript、Managed VB、IronRubyなどがDLR対応言語として発表されていますので、これらだと思いますが、この言語が何処かで登録されていなければならないことになります。これを調べていくとMicrosoft.Scripting.Hosting.ScriptEnvironmentSetupクラスのコンストラクタに記述されているのを見つけることができます。ここに記述されている言語として、前述のものの他にtoyscriptも記述されています。ということは、C#などからDLRを利用して新しい言語を利用する場合は、このコンストラクタに変更を加えるか、RegisterLanguageContextメソッドを使って利用する言語を登録しておけば良いことになります。

それと以前に説明したMicrosoft.Scripting.Scriptクラスですが、A8では廃止されたようです。この事から考えられることは、DLR自体に含まれていた重複した機能の整理統合の過程にあるということです。つまり、今後の開発が進むにつれて削除されたりするAPIが出てくることが予想できます。まあ、まだAlphaですから仕方ないと云えば仕方ないのかも知れません。早くベータレベルになって、APIが落ち着いて欲しいなあと思ったりもします。何故ならIronRubyとか、Nuaとか他の言語開発への影響が大きいと思うからです。