MPS 2025.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

fork with を使用すると、プランは生成プロセスをフォークし、別の生成プランをフォークすることができます。

ForkG.png

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

fork with のオプションの as プロパティは、文字列修飾子であり、フォークのトリガーとして機能します。フォークは、生成中のモデルが、文字列トリガーと一致するファセット ID を持つファセット (生成ターゲットファセットである必要があります) を持つモジュールによって所有されている場合にのみ発生します。

fork as (非推奨) is an optional property of the generation plan. It has been deprecated and replaced by PlanContribution. The effective result is that the generation plan marked as a fork of a “main” generation plan will be evaluated as if it was referred to explicitly with the standard “fork” statement inserted at the very beginning of the “main” generation plan. The actual value of the property is a string that serves as a trigger for the fork to happen. Identically to the as property of a Fork with statement, the fork will only happen if the model that is being generated is owned by a module that has a facet (must be a generation target facet) with a facet id matching the string guard.

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

genplan9.png

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

genplan10.png

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

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

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

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

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

Gen1.png

Plan Contribution

Plan Contribution (the PlanContribution root concept) allows a generation plan to be "contributed" to the generation process under a provided condition. Effectively, a PlanContribution forks the generation process without the need to modify the main generation plan.

Example of PlanContribution

Plan Attributes provide a mechanism to denote a model of a branch (for any branch originating from a plan or a plan contribution) with additional model attributes. The language/plan designer might want to add custom model attributes to identify the outcome of a particular generation branch for further processing. For example, one of the attributes employed by MPS itself is targetFacet (see the jetbrains.mps.generator.extensions.common model), which tells <mps.make> which GenerationTargetFacet/ModuleFacet to consult when determining an appropriate output location for a model.

Example of model attribute specification

Conditional forks with generator plans - Both the fork step and a PlanContribution support conditional activation. It ’ s now possible to activate certain branches of a plan only when certain criteria are met. At the moment, MPS comes with a conditional statement that checks the values of specified plan parameters. We intend to eventually extend statements to support logical operations (and/or), as well as other potential operations, while maintaining a strict interpretation of generator plans (i.e. no BaseLanguage code in plans). A language designer can provide custom ParameterDeclaration classes. Values for these parameters can be contributed using the PlanParameterContributor extension point. MPS comes with a few predefined parameters that are usable straight out of the box – see the jetbrains.mps.generator.extensions.common model for full details.

Example of PlanParameter definition

モデルの生成計画の指定

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

生成計画をモデルに関連付ける主な方法は、生成計画を含むモデルを含む DevKit を使用することです。

devkit1.png

まず、DevKit がラップする言語とソリューションへの依存関係を追加します。次に、インポートしたソリューションから世代計画を指定します。これは DevKit に関連付けられます。この DevKit をインポートするすべてのモデルには、DevKit に関連付けられた生成プランが適用されます。1 つのモデルに対して、複数の DevKit に genplan を提供することは推奨されません。

devkit2.png

生成計画を指定する簡単な方法

DevKit の要件を満たしていないモデルに genplan を提供するショートカットも用意されており、迅速な実験やプロトタイピングに使用できます。生成プランに従ってモデルをビルドする必要があるモジュールでは、カスタム生成ファセットを有効にし、必要な生成プランを指定する必要があります。

genplan3.png

生成計画の確認

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

genplan7.png

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

genplan6.png

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

genplan61.png

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

genplan7.png
genplan8.png

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

クロスモデル生成

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

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

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

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

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

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

checkpoints1.png

言語記述子モデルの生成

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

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

2025 年 11 月 20 日