MPS 2019.1ヘルプ

MPSプロジェクト構造

導入

言語を設計したりコードを書いたりするときには、優れた構造を使用して各部分を移動したり、組み合わせたりすることができます。MPSはこの点で他のIDEと似ています。

プロジェクト

プロジェクトはMPSの主な組織単位です。プロジェクトは1つ以上のモジュールで構成されており、それら自体がモデルで構成されています。モデルは生成/コンパイルの最小単位です。以下でこれらの概念を詳細に説明します。

モデル

これはMPSがもたらす大きな違いです - プログラムはテキスト形式ではありません。今まで
あなたはどんなプログラミングもテキストで行われるという事実に慣れているかもしれません。テキストを編集します。テキストはパーサーによって解析され、ASTが構築されます。文法は通常、パーサーを定義するために使用されます。ASTは、実行可能なコードを生成するためのコンパイラによって、または賢いコード支援、リファクタリング、および静的コード分析を提供するためのIDEによって、プログラムをさらに処理するためのコアデータ構造として使用されます。
ASTはとても便利で柔軟で強力なデータ構造であることを見て、テキスト、文法、パーサーを完全に避けて、最初からASTを扱うことができたらどうだろうか。まあ、これはまさにMPSがすることです。

コードに構造を与えるために、MPSのプログラムはモデルにまとめられています。テキストベースの言語では、モデルはコンパイル単位に多少似ていると考えてください。例を挙げると、MPSの一番下の言語であるBaseLanguageは、Java上に構築され、さまざまな方法で拡張されていますが、モデルを使用して各モデルがJavaパッケージを表すようにします。モデルは通常、トップレベルの宣言を表すルートノード非ルートノードで構成されています。例:BaseLanguageでは、クラス、インターフェース、および列挙型はルートノードです。(ここでノードについてもっと読むことができます )。

モデルはメタ情報を保持する必要があります。

  • 彼らが使用するモデル (インポートモデル)

  • それらが書かれている言語(そしてdevkitsも) (使用言語のセクション)

  • モデルファイルや特別なジェネレータパラメータなど、いくつかの追加パラメータ

このメタ情報は、モデルのポップアップメニューのモデル特性で変更することも、モデルに配置したときにAlt + Enterを使用して変更することもできます。

モジュール

モデル自体は最もきめ細かいグループ化要素です。モジュールはモデルをより高いレベルのエンティティに編成します。モジュールは通常、モジュールのプロパティーと依存関係を記述するメタ情報を伴ういくつかのモデルで構成されています。MPSはいくつかのタイプのモジュールを区別します: ソリューション言語devkits、そしてジェネレータ
ここで、メタ情報構造と個々のモジュールタイプについて詳細に説明します。

モジュールメタ情報

今、ものをモジュールにまとめるとき、より良い善のためにモジュールを一緒に組み合わせる方法が必要です。モジュール間の関係は、それらが保持するメタ情報を通して記述されます。モジュール間の可能な関係は、いくつかのグループに分類できます。

  • 依存 - あるモジュールが別のモジュールに依存している場合、前者のモデルは後者のモデルをインポートできます。依存関係の再エクスポートプロパティーは、依存関係が推移的かどうかを示します。モジュールAがtrueに再エクスポートプロパティーを設定して、モジュールBに依存している場合、自動的にdepencyを宣言し、他のすべてのモジュールは、同様にBに依存します。

  • 拡張された言語依存性 - 言語Lが言語Mを拡張する場合、Mからのすべての概念は、役割または拡張概念のターゲットとしてL内で使用できます。また、言語Mのすべての側面は、言語Lの対応する側面で使用および拡張が可能です。

  • 生成ターゲット依存関係 - 2つの言語(L2とL1)の間の関係。L2の生成プログラムがL1に生成するように指定する必要があるため、L1の実行時依存関係が必要です。

  • 使用言語 - モジュールAが言語Lを使用している場合、A内のモデルは言語Lを使用できます。

  • 中古devkit - モジュールAがdevkit Dを使用している場合、A内のモデルはdevkit Dを使用できます。

  • ジェネレーター出力パス - ジェネレータの出力パスは、新しく生成されたすべてのファイルが配置されるフォルダーです。これはMPSがあなたのために生成するものを探すことができる場所です。

それでは、MPSにあるさまざまな種類のモジュールについて見ていきます。

解決策

解決策はMPSの最も単純な種類のモジュールです。コードを保持し、共通の名前で統一されたモデルのセットです。解決策にはいくつかの種類があります。

  • サンドボックスソリューション - これらのソリューションにはエンドユーザーコードが含まれています。IDEはコードを特別な方法で処理しません。

  • ランタイム ソリューション - これらのソリューションには、他のモジュール(ソリューション、言語、またはジェネレータ)が依存するコードが含まれています。コードはMPSモデルとJavaクラス、ソースまたはjarファイルで構成できます。IDEは、クラスがコンパイルまたは外部で変更されるたびに、クラスをリロードします。

  • プラグインソリューション - これらのソリューションは何らかの方法でIDE機能を拡張します。それらは新しいメニューエントリを提供したり、サイドツールパネルウィンドウを追加したり、プロジェクト設定ダイアログなどからカスタム設定画面を定義したりすることができます。繰り返しますが、MPSはクラスが変更されるたびにリロードし続けます。さらに、IDE機能もそれに応じて更新されます。

言語

言語は、ソリューションよりも複雑で再利用可能な言語を表すモジュールです。それはいくつかのモデルで構成され、それぞれが言語の特定の側面を定義します。構造エディターアクション型システムなど。
言語は他の言語を拡張することができます。拡張言語は拡張言語からすべての概念を使用することができます - それ自身の概念を派生させ、参照のターゲットとして継承された概念を使用し、そしてまた継承された概念をそれ自身の概念の中の子として直接配置します。

言語は実行時にサードパーティのライブラリーやソリューションに依存することがよくあります。たとえば、HibernateやSwtなどの任意のJavaライブラリーをラップする言語を作成できます。そうすれば、言語は、これらのライブラリーに付属している標準のJava APIに代わる、より優れた滑らかな代替手段をユーザーに提供するでしょう。
今、言語が機能するためには、あなたの言語でラップされたライブラリーを含める必要があります。実行時クラスパスまたはランタイムソリューションを介してそれを行います。ランタイムクラスパスは、Javaで作成されたライブラリーなどの一般的なシナリオに適していますが、ランタイムソリューションはより複雑なシナリオに適しています。

  • ランタイムクラスパス - ライブラリークラスをスタブ言語ジェネレータとして利用可能にします。

  • ランタイムソリューション - これらのモデルはジェネレータ内部のすべてのモデルから見える

言語面

言語の側面は、言語のさまざまな側面を表します。

  • 構造体 - 言語ASTのノードと構造体を記述します。これはあらゆる言語の唯一の必須の側面です。

  • エディター - 言語がエディターでどのように表示され編集されるかを説明します。

  • actions - 言語に固有の補完メニューのカスタマイズについて説明します。つまり、コントロール+スペースと入力するとどうなりますか。

  • constraint - ASTの制約について説明します。ノードが適用可能な場所、許可されているプロパティーおよび参照など。

  • behavior - ASTの動作の側面、つまりASTメソッドについて説明します

  • 型システム - 言語で型を計算するための規則について説明します。

  • インテンション - インテンションについて説明します (電球がポップアップしたとき、またはユーザーがAlt + Enterを入力したときに使用可能なコンテキスト依存のアクション )

  • プラグイン - 言語をMPS IDEに統合することを可能にします

  • データフロー - 意図されたデータの流れをコードで記述します。次のことができますは到達不能なステートメント、未初期化の読み込みなどを見つけます。

このガイドの対応するセクションで各側面についてもっと読むことができます。

ジェネレーター

ジェネレータは、ある言語から他の言語、通常は別の言語への変換を定義します。ジェネレーターは他のジェネレーターに依存するかもしれません。ジェネレータにコードを適用する順序は重要であるため、ジェネレータに順序付け制約を設定できます。対応するセクションで生成についてもっと読むことができます。

DevKits

DevKitsはあなたの人生を楽にするために作られました。相互に接続された言語が多数ある場合は、それらを単一の単位として扱う方法をお勧めします。例:個々の言語をすべてリストしないでそれらをインポートしたい場合があります。DevKitsはこれを可能にします。DevKitを構築するときは、含める言語をリストするだけです。
予想通り、DevKitsは他のDevKitsを拡張することができます。拡張されたDevKitは、継承されたすべての言語をあたかも独自の言語のように継承します。

プロジェクト

これは簡単です。プロジェクトでは、グループ化してそれらを1つの単位として使用するために必要なモジュールを単にラップします。プロジェクトのプロパティープロジェクト・ビューパネルのProjectノードにあるAlt + Enter)を開いて、プロジェクトに含めるべきモジュールを追加または削除することができます。プロジェクトノードのコンテキストポップアップメニューから新しいモジュールを作成することもできます。

Javaコンパイル

MPSはJavaから生まれ、Java環境でよく使われます。MPSモデルはjavaファイルに生成されることが多いので、プログラムを実行する前にjavaをコンパイルする方法が必要です。一般的に2つの選択肢があります。

  • MPSでコンパイルする (推奨)

  • IntelliJ IDEAでコンパイルする (IntelliJ IDEAが必要です)

MPSでクラスをコンパイルするときは、モジュールのソースパスを設定する必要があります。ソースファイルは、モジュールが生成されるたびに、またはmakeまたはrebuildアクションによって手動でコンパイルを呼び出すたびにコンパイルされます。

最終更新日: 2019年4月12日