言語ワークベンチドメイン特化言語 (DSL: Domain Specific Launguage) を中心とするメタプログラミングのための環境であり、実例としては Intentional SoftwareIntentional Domain WorkbenchJetBrainsMeta Programming System, EclipseTextual Modeling Framework などが挙げられます。

今回は 言語ワークベンチ として Textual Modeling Framework を使って DSL エディタの実装にチャレンジします。

MATSUFUJI Hideharu

外部 DSL と内部 DSL

DSL は特定の知識分野 (ドメイン) 向けに設計されたコンピュータ言語であり、日本語では「ドメイン特化言語」あるいは「ドメイン固有言語」と呼ばれています。

DSL の熱心な支持者である Martin Fowler 氏は記事「言語ワークベンチ」で、DSL外部 DSL内部 DSL に分類しています。

外部 DSL はアプリケーションを書くためのプログラミング言語 (ホスト言語) とは異なる言語で書かれた DSL です。これに対して、内部 DSL はホスト言語と同じ言語で書かれた DSL です。

同記事に書かれているように、外部 DSL と内部 DSL には長所と短所があります。筆者なりに以下にまとめてみました。

外部 DSL 内部 DSL
表現力 (読みやすさ、理解のしやすさ)高い低い
DSL 処理系の実装コスト高い低い
ツールによるサポートなしあり (ただし限定的)

内部 DSL はホスト言語の制約を受けるため表現力には限界がありますが、ホスト言語とリンクしており言語設計にホスト言語の機能を活用することができます。これによって DSL 処理系の実装を低コストで行うことができます。しかし、DSL 処理系の実装が不要になるわけではありません。内部 DSLDSL なのでホスト言語および周辺ツールはその DSL のことを知りません。よってそのサポートは限定的です。

ノート: 流れるようなインターフェイス はツールによるホスト言語用のサポートを最大限に活用するための内部 DSL といえます。

外部 DSL には表現上の制約がないため、そのドメインに最適な言語を提供できる可能性があります。内部 DSL と比較すると処理系の実装は高コストです。ツールによるサポートは絶望的であり、この部分の開発は間違いなく高コストになるでしょう。

しかし、言語ワークベンチ の登場によりこの状況に変化が生まれています。言語ワークベンチDSL の処理系の大部分を自動生成することができます。同時に DSL エディタの自動生成により手厚いツールサポートの提供を可能にします。

今回は EclipseTextual Modeling Framework による DSL エディタの実装を通して、言語ワークベンチ がもたらすものを体験したいと思います。

DSL 処理系のプロセスフローを知る

DSL エディタの実装に入る前に、DSL 処理系のプロセスフローを見てみましょう。

tmf1-dsl.png

DSL はコンピュータ言語なので、プログラムから利用できる形である 抽象構文木 (AST: Abstract Syntax Tree) に変換しなければなりません。これは レキサ (字句解析器)パーサ (構文解析器) の仕事です。

レキサとパーサによって変換された AST は ジェネレータ によって、セマンティックモデル のオブジェクトやクラスなどに変換されます。セマンティックモデルは ドメインモデル でありそのオブジェクトやクラスはそれぞれ DSL の動的および静的な表現です。

DSL のグラマー (文法) を読み込んで パーサ を生成するのは パーサジェネレータ の仕事です。

ノート: パーサジェネレータにはレキサを生成するものがあります。今回使用する ANTLR もそのひとつです。

以下は DSL 処理系の実装プロセスの例です。

  1. ホスト言語から使うことができるパーサジェネレータを選定する
  2. DSL のグラマーを設計する
  3. パーサジェネレータでパーサ (およびレキサ) を生成する
  4. ジェネレータ、セマンティックモデルを実装する

TMF

TMFEclipse Modeling Project 傘下のプロジェクトのひとつで、テキストベースのモデリングフレームワークです。TMF の根幹となるフレームワークは Xtext です。この Xtext はもともと openArchitectureWare で開発されていましたが、Eclipse に寄贈され、現在は TMF のプロジェクトの一環として開発が進められています。

ここで、先ほどの図に TMF を加えて、一般的な DSL 処理系と TMF を加えた処理系を比較してみましょう。

tmf1-tmf.png

TMF の最大の特徴は Xtext ファイルから DSL 専用のエディタを生成できることです。また、パーサも自動生成されるため、DSL 処理系の実装コストは大幅に削減されます。つまり、これらの特徴は外部 DSL の問題を解消します。

Xtext ファイルはエディタのための文法ファイルであり、このファイルを起点として、いろいろなプログラムが生成されます。

パーサジェネレータは自由に選択することができますが、実際にはインタフェースが用意されている ANTLR か PackratParser がよいでしょう。Xtext では ANTLR が推奨されています。

また、ジェネレータも生成されます。これは一見すると便利ですが、生成されたコードは EMFXtext に依存しているため、Java 以外のホスト言語で DSL 処理系を構築する場合に応用が難しいという問題があります。

TMF のインストール

それでは TMF をインストールしましょう。TMF は Eclipse Modeling Tools に含まれているので、以下のサイトからダウンロードして利用することにします。

http://www.eclipse.org/downloads/
tar xvzf eclipse-modeling-galileo-incubation-linux-gtk.tar.gz

次にパーサジェネレータである ANTLR と、ANTLRXtext から利用するためのプラグインをインストールします。これらは以下の更新サイトからインストールすることができます。

http://download.itemis.com/updates

おわりに

今のところ TMF はインキュベーションの段階であり、まだまだこれからのプロジェクトです。しかし、グラマーを定義するだけで専用のエディタを生成できることに、筆者は大きな魅力と可能性を感じています。

次回は、TMF を使って、DSL を定義し、その DSL 専用のエディタを生成したいと思います。

使用したソフトウェアのバージョン

Eclipse (Eclipse Modeling Tools)3.5
TMF (Xtext)0.7.0
ANTLR3.0.1

参考文献

トラックバック(0)
  • このブログ記事のトラックバックURL:
コメント