MPS 2023.3 ヘルプ

世代計画

世代計画

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

目的

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

生成計画の定義

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

genplan4.png

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

genplan5.png

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

genplan1.png

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

Gen2.png

変換は生成ステップを表します。変換ステートメントは、具体的な言語と次のいずれかのオプションでパラメーター化されます。

  • 変換 - 指定された言語を生成します。

  • ターゲット - 指定された言語を「ターゲット」言語として明示する言語のすべてのジェネレーターを実行します (言語依存関係内)。

  • 拡張 - 指定された言語を「拡張」言語として明示する言語のすべてのジェネレーターを実行します (言語依存関係内)。

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

Gen2.png

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

ForkG.png

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

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

genplan9.png

これらの中間チェックポイントモデルは、MPS をシャットダウンするか、モデルまたはそれらが依存するモデルを再構築するまで保持されます。または、手動で削除することもできます:

genplan10.png

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

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

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

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

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

Gen1.png

モデルの生成計画の指定

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

genplan3.png

生成計画の確認

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

genplan7.png

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

genplan6.png

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

genplan61.png

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

genplan7.png
genplan8.png

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

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

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

devkit1.png

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

devkit2.png

クロスモデル生成

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

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

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

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

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

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

checkpoints1.png

言語記述子モデルの生成

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

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