MPS の仕組み

テーマに固有のダイアレクトと言語は、それぞれのテーマに関する正確かつ効率的なコミュニケーションに役立ちます。 MPS はプログラミング言語の世界に同様の柔軟性をもたらします。 厳密な構文とセマンティクスを持つ従来のプログラミング言語とは異なり、MPS ではユーザーが言語をゼロから作成、変更または拡張できます。

言語を拡張する際の主な課題は、文字列を解析してデータ構造を構築するパーサーにあります。パーサーはコードの固定的表現を単一の表記に制限しており、他のパーサーと簡単に組み合わせることができません。この事が言語のモジュール化を妨げています。

この問題を解決する代替手段として最もよく提案されているのは、プログラムのコードをテキスト以外の表現で実装することです。 この方法の主な利点は、構文解析が不要になることです。 しかし、MPS では別の代替手段を提案しています。 私たちはプログラムコードを完全に表現する属性一式(プロパティ、子、参照)を持つノードから構成されるデータ構造である抽象構文木(AST)と呼ばれるものに常にコードを保持することで、この問題を解決しました。

MPS エディターの仕事は、ユーザが使いやすい方法で AST を視覚化し、効果的に編集する手段を提供することです。 例えば標準的なテキスト言語をシミュレートする言語を作成する場合、エディターは一般的なテキストエディターを使用する場合と同じ使用感を提供しなければなりません。 同様に、視覚的な表現で言語を作成する場合、エディターはダイアグラムエディターを使用する場合と同じ使用感を提供しなければなりません。

MPS で言語を作成するときは、コードの編集ルールを定義し、ユーザーに対するコードの表示方法を指定します。 言語の型システムと制約をその言語に適用するルールセットとして指定することもできます。 これらの特徴を兼ね備えた MPS では、プログラムコードをその場でチェックできます。また、新しい言語でのプログラミングが容易で、間違いが発生しにくくなっています。

MPS は生成的アプローチを使用します。 そのため、エンドユーザーの入力をより平凡な、概して汎用的な言語に変換するジェネレーターをあなたの言語のために定義できます。現在の MPS は特に Java コードの生成に優れていますが、Java に限定されているわけではありません。 C、C#、XML、FHTML、PDF、LaTeX、JavaScript なども生成できます。

ドメイン固有言語(DSL)とは?

「特定の問題領域の概念とルールを直接使用するソリューションを定義することで、プログラミングを超えて抽象度を高めるプログラミング言語である」

KellyとTolvanen(2008)

MPS を使用すると、新しい言語用のカスタムエディタを定義して、DSL を簡単に使用することができます。 従来のプログラミングに慣れていないドメイン専門家でも、独自のドメイン固有の用語を使用して設計されたドメイン固有言語を使用して、MPS で簡単に作業できます。

プロジェクションエディタ

プロジェクションエディタを使うと、ユーザがコードの抽象構文木(AST)表現を効率的に編集できます。 また、テキスト表記用のテキストエディタ、グラフィカル言語用のダイアグラムエディタ、表編集用のタブエディタなどの動作を模倣することができます。 ユーザーは画面上の視覚的要素を介して直感的にコードを操作し、同じコードを複数表示してそれらを切り替えることもできます。

IDEのサポート

JetBrains はその高性能 IDE と開発ツールでよく知られており、MPS も例外ではありません。

MPS は、DSL を最大限に活用するために必要なすべてを備えた強力な IDE です。 コード補完、ナビゲーション、リファクタリング、エラーチェック、クイックフィックス、DSL のデバッグ、自動マイグレーションによる言語のバージョン管理、メインストリームのバージョン管理システムとの統合などが機能として含まれます。

コード生成

ビジネスドメインと実装ドメインの間のセマンティックギャップを、MPS ジェネレーターが埋めます。

一連のステップを経て、ジェネレータは、元のドメイン固有モデルを Java、C、JavaScript、XML などの下位の汎用言語で表現されたモデルに徐々に変換します。 変換されたモデルは、さらにテキスト形式のソースファイルに変換され、従来のコンパイラで実行可能なバイナリが生成されます。

ドメイン固有言語はドメイン専門家のビジネス知識を形式化しますが、ジェネレータはその知識の実装を所定の技術でカプセル化します。 ジェネレータは、最も優れたソフトウェア開発者の専門知識を再利用可能な形で保存し、他の人がそれらの恩恵を受けられるようにします。

言語に含まれるビジネス知識と、ジェネレータが保持している実装知識を明確に分離しているため、ユーザーは同じ言語に対して複数のジェネレータを使用することによって、同時に複数のプラットフォームをターゲットにすることができます。 また、ジェネレータのみを変更することで、対象とする実装技術を手間なく切り替えることができます。 既存のドメイン固有モデルに含まれるビジネス知識はそのまま利用できます。

DSLおよび言語拡張を作成するためのMPS

MPS にはもともと、BaseLanguage と呼ばれる、Java をコピーしたすぐに使える汎用言語が含まれていました。 その後、XML、C、JavaScript などの言語が追加されました。 これらを使用してプログラムを作成できます。 しかし、MPS の真の強みは、BaseLanguage やその他の汎用言語を拡張し、それらをベースに新しい言語を作成するときに発揮されます。 MPS には、文字列、コレクション、日付、正規表現などを操作するための、BaseLanguage の便利な拡張機能がいくつか用意されています。 また、これらを参照して新しい言語を作成することもできます。 これらの強力なツールのおかげで、MPS は非常に有能なドメイン固有言語(DSL)作成手段となっています。