MPS 2020.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 - 言語に固有の補完メニューのカスタマイズについて説明します。つまり、Control + Space と入力するとどうなりますか。

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

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

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

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

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

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

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

ジェネレーター

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

DevKits

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

プロジェクト

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

Java コンパイル

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

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

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

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

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

関連ページ:

依存関係を正しくする

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

生成プログラム

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

基本的な考え方

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

用語集

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