MPS 2020.1ヘルプ

MPSプロジェクト構造

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

プロジェクト

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

モデル

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

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

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

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

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

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

This meta information can be altered in モデル特性 of the model's pop-up menu or using Alt+Enter when positioned on the model.

モジュール

モデル自体は最もきめ細かいグループ化要素です。モジュールはモデルをより高いレベルのエンティティに編成します。モジュールは通常、モジュールのプロパティと依存関係を記述するメタ情報を伴ういくつかのモデルで構成されています。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 - 言語に固有の補完メニューのカスタマイズについて説明します。つまり、Control + Spaceと入力するとどうなりますか。

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

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

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

  • インテンション - インテンションについて説明する (context dependent actions available when light bulb pops up or when the user types Alt+Enter )

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

  • data flow - describes the intented flow of data in code. It allows you to find unreachable statements, uninitialized reads etc.

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

ジェネレーター

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

DevKits

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

プロジェクト

This one is easy. A project simply wraps modules that you need to group together and work with them as a unit. You can open the プロパティ of a project ( Alt+Enter on the Project node in the プロジェクト・ビュー panel) and add or remove modules that should be included in the project. You can also create new modules from the project nodes' context pop-up menu.

Javaコンパイル

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

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

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

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

最終更新日: 2020年6月18日

関連ページ:

依存関係を正しくする

目的、便利なキーボードショートカット、ソリューション、ソリューションモデル、プロジェクトへの外部Javaクラスとjarの追加 - ランタイムソリューション、言語、言語モデル/側面、生成プログラム、目的:モジュールとモデルは通常、さまざまなタイプの依存関係のネットワークによって相互接続されています。M...

生成プログラム

MPSジェネレーターに関する素早い使い方ドキュメントはジェネレータクックブックをチェックしてください。導入、概要、ジェネレーターモジュール、新しいジェネレータを作成する、ジェネレーターのプロパティ、ジェネレーター、変換、マッピング設定、ジェネレータルール、マクロ、外部テンプレート、テンプレートスイッ...

基本的な考え方

この章では、MPSの基本的な概念(ノード、概念、および言語)について説明します。これらはMPSがどのように機能するかを正しく理解するための鍵です。それらはすべて他のものと組み合わされたときに意味をなさないため、それらについてすべて一緒に話さなければなりません。このセクションでは、各要素の本質について...

用語集

MPS用語集BaseLanguageJava 6の投影クローン(Java 7および8のオプションの拡張機能付き)。Java仕様に準拠し、Java 6.と1:1の互換性があります。さらに、MPSは、日付、コレクション、クロージャなど、BaseLanguageに便利な拡張機能をいくつか提供します。コード...