MPS 2020.3 ヘルプ

世代計画

世代計画

生成計画を使用すると、開発者は自分のモデルに望ましい生成順序を明示的に指定でき、生成プロセスをより適切に制御できます。

目的

大規模プロジェクトでは、相互ジェネレーターの優先順位を指定するのが面倒になるかもしれません。さらに、優先順位を指定するためには、適切な相互依存関係を宣言することによって関係言語が互いについて知る必要があります。これは、(時に望ましい)独立性を破ります。生成計画は、生成ステップの適切な順序付けの責任を単一の場所、つまり生成計画にまとめます。これにより、言語設計者は、エンドユーザーモデルを目的の順序で処理するための直感的な手段を提供できます。生成計画は生成プロセスに含まれるべきであるすべての言語をリストし、適切に順序付けしそして選択的にチェックポイントを指定し、そこで生成者は現在の過渡モデルを保存します。これらのモデルは、生成プロセスのさらに先の自動クロスモデル参照解決に使用できます。

生成計画の定義

生成計画を作成するには、最初にモデルを作成する必要があります。通常のモデルと簡単に区別できるように、モデルに genplan ステレオタイプを与えることを検討できますが、これは必須ではありません。

Genplan4

jetbrains.mps.lang.generator.planjetbrains.mps.lang.smodel 言語をインポートした後、あなたの世代の計画を表現する計画コンセプトのルートノードを作成することができます。

Genplan5

生成計画は、変換チェックポイントで構成されます。

Genplan1

必要なジェネレーターを明示的に指定することも可能です。

Gen2

変換は生成ステップを表し、その生成フェーズの一部として生成する必要のある言語が含まれます。

Apply は、特定のジェネレーターの明示的な呼び出しを表します。apply with extended ステートメントは、指定されたジェネレーターと拡張するジェネレーターを 1 つのステップで適用します。これにより、言語設計者は可能な拡張に対応できます。

Gen2

フォーク付きにより、計画は生成プロセスを分岐し、別の生成計画を分岐することができます。

Fork g

参照された生成計画は、フォークステップにあった状態のモデルのコピーから始まり、通常の変換として進みます。この時点から、2 つのジェネレーターは独立して稼働します。

チェックポイントは、中間モデルを保持する必要がある生成中のポイントを表します。生成の後半で解決される参照は、マッピングラベルを介して、保存された中間モデル内のノードを検索して解決できるようになります。これらのチェックポイントモデルは、プロジェクトビューツールウィンドウで表示できます。

Genplan9

<TODO - これはもう有効ではないかもしれません> これらの中間チェックポイントモデルは、MPS をシャットダウンするまで、またはモデルまたはそれらが依存するモデルを再構築するまで保持されます。あるいは手動で削除することもできます。

Genplan10

チェックポイントは、異なる計画間の同期点を提供します。チェックポイントモデルは、モデルの作成時に使用されたチェックポイントの名前と一致するステレオタイプで示されます。モデルは、<plan-name> - <checkpoint name> の命名規則を使用して、生成されたソースとともに永続化されます。

個別のステートメントにより、チェックポイントのさまざまな側面を取り込むことができます。

  • checkpoint <name> ステートメントを宣言します。ジェネレータープランがそれらの間で共有できるラベルを指定します。このステートメントは、変換されたモデルの状態を記録 / 永続化するものではなく、他の世代の計画が参照できるようになる単なる宣言です。

  • checkpoint <checkpoint> - 変換されたモデルの状態を記録 / 永続化します。これは、どちらかのインプレースチェックポイントを宣言するか、宣言したチェックポイントを参照することができます。

  • <checkpoint> ステートメントと同期する - 指定されたチェックポイントの永続化されたモデルでターゲットノードを検索するように生成計画に指示しますが、独自のノードは永続化しません(チェックポイントへの読み取り専用アクセス)。このステートメントは新しい状態を導入しませんが、他の場所で宣言されたチェックポイントを参照します。

Gen1

モデルの生成計画の指定

生成計画に従ってモデルを構築する必要があるモジュールは、カスタム生成ファセットを有効にし、実際に必要な生成計画を指す必要があります。

Genplan3

生成計画の確認

モデルのポップアップメニューの世代計画を表示するアクションは、生成のアウトラインを作成するときに、生成計画を正しく考慮します。

Genplan7

生成計画の出所の詳細と実際の計画へのクリック可能なリンクは、レポートに含まれています。

Genplan6

使用されている言語のいずれかが生成計画で処理されていない場合は、計画にも記載されています。

Genplan61

明示的な生成計画スクリプトなしで使用される元の生成優先度ベースの生成計画を表示するには、Alt キーを押しながら生成計画の表示メニューエントリをクリックします。

Genplan7

Genplan8

レポートには、現在アクティブな計画ではないことがヘッダーに表示されています。

DevKits を使用して世代計画を関連付ける

DevKits は世代計画も関連付けることができます。

Devkit1

まず、DevKit がラップする必要のある言語とソリューションへの依存関係を追加します。次に、インポートされたソリューション内から世代計画を指定します。これは、DevKit に関連付けられます。その DevKit をインポートするモデルには、DevKit に関連付けられた生成計画が適用されます。

Devkit2

クロスモデル生成

モデルは MPS の生成単位です。単一モデル内のすべてのエンティティが一緒に生成され、ノード間の参照は参照マクロマッピングラベルを 使用して解決できます。ただし、マッピングラベルは、デフォルトでは他のモデルからアクセスできません。これにより、他のモデルのノードを参照する参照の生成が複雑になります。幸い、モデルが生成計画を共有している場合、通常のマッピングラベルは、相互参照を使用して相互に独立したモデルの生成をサポートできます。このメカニズムは、チェックポイントを活用して中間過渡モデルをキャプチャーし、参照解決に使用します。

基本的に、複数のモデルを生成するときにモデル間の参照を保持するには、モデルが生成計画を共有していることを確認してください。その生成計画では、モデル間の参照解決に使用されるマッピングラベルが設定された時点で、チェックポイントを定義する必要があります。残りは自動的に処理されます。参照マクロは、ラベルと入力による通常の genContext.get 出力(リダクションまたはルートマッピングルールによって生成されたノードの場合)またはモデルの genContext.get 出力(条件付きルートマッピングルールによって生成されたノードの場合)を介して、マッピングラベルからノードを解決できます。

チェックポイントモデルのリンク

チェックポイントで作成されたモデルは、シーケンス内の前のチェックポイントモデルへの参照を保持するようになりました。これは、ジェネレーターが複数のジェネレーターフェーズにわたる入力と一致するマッピングされたノードを発見できます。

チェックポイントモデルのデバッグ情報

モデル間の生成シナリオのデバッグを容易にするために、各チェックポイントモデル内の専用ルートに、格納されている入力ノードと出力ノードへのポインターとともにマッピングラベル名が一覧表示されます。各チェックポイントで公開されているマッピングラベルを調査すると、モデル間の生成シナリオをデバッグし、未解決の参照を修正するのに大いに役立ちます。次にクロスモデル参照が解決されない場合は、対応するチェックポイントモデルを調べて、入力のラベルが実際にあるかどうかを確認します。

Checkpoints1

言語記述子モデルの生成

生成計画は、言語( <language.name>@descriptor として知られている)の記述子モデルを生成するように拡張されました。構造、textgen、型システム、データフロー、制約の側面が生成計画で生成されるようになり、新しいクロスモデル参照解決メカニズムが使用されます。

言語作成者によって定義されたカスタムアスペクトも、生成計画に参加できます。カスタムアスペクトを取得した場合は、そのジェネレーターが jetbrains.mps.lang.descriptor 言語のジェネレーターを拡張していることを確認する必要があります。これは、プランに対してカスタム拡張機能をアクティブ化する方法です。