MPS 2019.1ヘルプ

世代計画

世代計画

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

目的

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

生成計画の定義

生成計画を作成するには、まずモデルを作成する必要があります。通常のモデルと区別しやすいように、モデルにgenplanステレオタイプを付けることを検討することもできますが、これは必須ではありません。

genplan4

jetbrains.mps.lang.generator.planおよびjetbrains.mps.lang.smodel言語をインポートした後、プランの概念のルートノードを作成できます。これは、生成計画を表します。

genplan5

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

genplan1

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

Gen2

変換は生成ステップを表し、その生成フェーズの一部として生成されるべき言語を含みます。

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

Gen2

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

ForkG

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

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

genplan9

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

genplan10

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

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

  • チェックポイント<名前>を宣言する文 - ジェネレーター計画がそれらの間で共有できるラベルを指定します。このステートメントは変換されたモデルの状態を記録/保持しません。それは他の世代計画が参照することができるという単なる宣言です。

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

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

Gen1

モデルの生成計画の指定

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

genplan2

genplan3

生成計画の確認

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

genplan7
genplan6

明示的な生成計画スクリプトなしで使用される、ジェネレーターの優先順位に基づく元の生成計画を表示するには、世代計画を表示するメニュー項目をクリックしながら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 言語のジェネレータを拡張することを確認するべきです。


最終更新日: 2019年7月5日