DLR で俺言語を作ってみる講座

この記事は、IronPython2.0Alpha4 付属の DLR について書いています。
バージョンによって DLR の中身が大きく異なる場合がありますのでご注意を


さて、言語開発合宿 なるものに参加してきました。DLR を使ってごにょごにょと、勉強をかねてサンプルっぽい言語を1から作ってました。で、この記事は合宿で自分が知ったこととか予め勉強してたこととかのまとめみたいなものです。間違ってたらごめん。

DLR の中身

DLR の中身を、ネームスペースごとに大まかな機能を書き下してみます。

Microsoft.Scripting ScriptCode とか Module とか。ごった煮
Microsoft.Scripting.Action 抽象構文木の各要素に対するアクション関係
Microsoft.Scripting.Ast 抽象構文木
Microsoft.Scripting.Generation 抽象構文木からバイトコードを生成する関係
Microsoft.Scripting.Hosting ScriptEngine とか LanguageProvider とか ConsoleHost とか
Microsoft.Scripting.Math BigInteger と Complex64 が入ってます
Microsoft.Scripting.Shell Hosting と合わせて、インタラクティブなコマンド環境を提供
Microsoft.Scripting.Types 肝。動的型サポート。DynamicType とか ExtensionTypeAttribute とか
Microsoft.Scripting.Utils ごった煮

Microsoft.Scripting を基本に、Hosting と Shell を継承して処理系の外枠を作り、ソースをパースして Ast を構築、Ast に Action を関連付けて実行するといった具合です。実行時の動的型操作には Types を使います。

俺言語を手軽に作成するには

さて、DLR はけして小さくないライブラリです。処理系の基本的な動作や抽象構文木に対するアクションなどは予め多数用意されていて、それを上手く使うとパーサだけで簡単な俺言語なら作れちゃったりします。


で、その前に Hosting 名前空間と Shell 名前空間に入っているクラスを継承して処理系の外枠を作るわけですが、そのスケルトンを用意してみました。
Sample_Skeleton.lzh
インタラクティブ実行に必要な最低限のクラスとメソッドを用意してあります。何か入力して Enter を押すとエコーされます。


詳しくは次回の講釈にて説明しますが、Sample.SampleLanguageContext#ParseSourceCode メソッドが、コンソールに対し入力が行われたとき呼び出されるメソッドです。上のスケルトンでは入力したソースをそのまま出力するための抽象構文木を作り DLR 側に返しています。要はそこにパーサを挟ませてソースに対応する抽象構文木を生成するようにしてやれば、簡単に俺言語が作れるという算段です。

余談

IronRuby 作った John Lam 氏が ToyScript っていうサンプル言語を公開してましたけど、だいぶ DLR の中身が変わってるんでそのままではコンパイル通らなかったりします。


続きは次回の講釈にて。
目次は http://sirokuro.s206.xrea.com/?DLR%20%A4%C7%B8%C0%B8%EC%C0%BD%BA%EE に用意してみました。