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

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

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

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

変換は生成ステップを表します。変換ステートメントは、具体的な言語と次のいずれかのオプションでパラメーター化されます。
変換 - 指定された言語を生成します。
ターゲット - 指定された言語を「ターゲット」言語として明示する言語のすべてのジェネレーターを実行します (言語依存関係内)。
拡張 - 指定された言語を「拡張」言語として明示する言語のすべてのジェネレーターを実行します (言語依存関係内)。
Apply は、特定のジェネレーターの明示的な呼び出しを表します。apply with extended ステートメントは、指定されたジェネレーターと拡張するジェネレーターを 1 つのステップで適用します。これにより、言語設計者は可能な拡張に対応できます。

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

参照された生成計画は、フォークステップにあった状態のモデルのコピーから始まり、通常の変換として進みます。この時点から、2 つのジェネレーターは独立して稼働します。
fork with のオプションの as プロパティは、文字列修飾子であり、フォークのトリガーとして機能します。フォークは、生成中のモデルが、文字列トリガーと一致するファセット ID を持つファセット (生成ターゲットファセットである必要があります) を持つモジュールによって所有されている場合にのみ発生します。
フォークとして (非推奨) は生成プランのオプションプロパティです。これは非推奨となり、PlanContribution に置き換えられました。結果として、「メイン」生成プランのフォークとしてマークされた生成プランは、「メイン」生成プランの先頭に挿入された標準の「fork」ステートメントによって明示的に参照されたかのように評価されます。このプロパティの実際の値は、フォークの発生をトリガーする文字列です。Fork with ステートメントの as プロパティと同様に、生成対象のモデルが、文字列 guard に一致するファセット ID を持つファセット(生成ターゲットファセットである必要があります)を持つモジュールによって所有されている場合にのみ、フォークが発生します。
チェックポイントは、中間モデルを保持する必要がある生成中のポイントを表します。生成の後半で解決される参照は、マッピングラベルを介して、保存された中間モデル内のノードを検索して解決できるようになります。これらのチェックポイントモデルは、プロジェクトビューツールウィンドウで表示できます。

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

チェックポイントは、異なる計画間の同期点を提供します。チェックポイントモデルは、モデルの作成時に使用されたチェックポイントの名前と一致するステレオタイプで示されます。モデルは、<plan-name> - <checkpoint name> の命名規則を使用して、生成されたソースとともに永続化されます。
個別のステートメントにより、チェックポイントのさまざまな側面を取り込むことができます。
checkpoint <name> ステートメントを宣言します。ジェネレータープランがそれらの間で共有できるラベルを指定します。このステートメントは、変換されたモデルの状態を記録 / 永続化するものではなく、他の世代の計画が参照できるようになる単なる宣言です。
checkpoint <checkpoint> - 変換されたモデルの状態を記録 / 永続化します。これは、どちらかのインプレースチェックポイントを宣言するか、宣言したチェックポイントを参照することができます。
<checkpoint> ステートメントと同期する - 指定されたチェックポイントの永続化されたモデルでターゲットノードを検索するように生成計画に指示しますが、独自のノードは永続化しません(チェックポイントへの読み取り専用アクセス)。このステートメントは新しい状態を導入しませんが、他の場所で宣言されたチェックポイントを参照します。

プラン拠出
プラン拠出(PlanContribution ルートコンセプト)は、与えられた条件で、生成計画を生成プロセスに「貢献」することを可能にします。実質的に、PlanContribution はメインの生成計画を変更することなく、生成プロセスをフォークします。

プラン属性は、追加のモデル属性を使用してブランチ(プランまたはプランコントリビュートから生成されたブランチ)のモデルを示すメカニズムを提供します。言語 / プラン設計者は、特定の世代のブランチの結果を識別し、さらに処理するために、カスタムモデル属性を追加する必要がある場合があります。例: MPS 自体で使用される属性の 1 つに targetFacet があります(jetbrains.mps.generator.extensions.common モデルを参照)。これは、モデルの適切な出力先を決定する際に参照する GenerationTargetFacet/ModuleFacet を <mps.make> に指示します。

ジェネレータープランによる条件付きフォーク - フォークステップと PlanContribution はどちらも条件付きアクティベーションをサポートしています。これにより、特定の条件が満たされた場合にのみ、プランの特定のブランチをアクティベートできるようになりました。現在、MPS には、指定されたプランパラメーターの値をチェックする条件文が付属しています。最終的には、ジェネレータープランの厳密な解釈(つまり、プランに BaseLanguage コードがない)を維持しながら、論理演算(and/or)やその他の潜在的な演算をサポートするように文を拡張する予定です。言語設計者は、カスタム ParameterDeclaration クラスを提供できます。これらのパラメーターの値は、PlanParameterContributor 拡張ポイントを使用して提供できます。MPS には、すぐに使用できる定義済みパラメーターがいくつか付属しています。詳細については、jetbrains.mps.generator.extensions.common モデルを参照してください。

モデルの生成計画の指定
DevKits を使用して世代計画を関連付ける
生成計画をモデルに関連付ける主な方法は、生成計画を含むモデルを含む DevKit を使用することです。

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

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

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

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

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

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


レポートには、現在アクティブな計画ではないことがヘッダーに表示されています。
クロスモデル生成
モデルは MPS の生成単位です。単一モデル内のすべてのエンティティが一緒に生成され、ノード間の参照は参照マクロとマッピングラベルを使用して解決できます。ただし、マッピングラベルは、デフォルトでは他のモデルからアクセスできません。これにより、他のモデルのノードを参照する参照の生成が複雑になります。幸い、モデルが生成計画を共有している場合、通常のマッピングラベルは、相互参照を使用して相互に独立したモデルの生成をサポートできます。このメカニズムは、チェックポイントを活用して中間過渡モデルをキャプチャーし、参照解決に使用します。
基本的に、複数のモデルを生成するときにモデル間の参照を保持するには、モデルが生成計画を共有していることを確認してください。その生成計画では、モデル間の参照解決に使用されるマッピングラベルが設定された時点で、チェックポイントを定義する必要があります。残りは自動的に処理されます。参照マクロは、ラベルと入力による通常の genContext.get 出力(リダクションまたはルートマッピングルールによって生成されたノードの場合)またはモデルの genContext.get 出力(条件付きルートマッピングルールによって生成されたノードの場合)を介して、マッピングラベルからノードを解決できます。
チェックポイントモデルのリンク
チェックポイントで作成されたモデルは、シーケンス内の前のチェックポイントモデルへの参照を保持するようになりました。これは、ジェネレーターが複数のジェネレーターフェーズにわたる入力と一致するマッピングされたノードを発見できます。
チェックポイントモデルのデバッグ情報
クロスモデル生成シナリオのデバッグを容易にするために、各チェックポイントモデル内の専用ルートは、格納された入力ノードと出力ノードへのポインターとともにマッピングラベル名を一覧表示します。各チェックポイントで公開されているマッピングラベルを調査すると、モデル間の生成シナリオをデバッグし、未解決の参照を修正するのに大いに役立ちます。次にクロスモデル参照が解決されない場合は、対応するチェックポイントモデルを調べて、入力に実際にラベルがあるかどうかを確認します。

言語記述子モデルの生成
生成計画は、言語(<language.name>@descriptor として知られている)の記述子モデルを生成するように拡張されました。構造、textgen、型システム、データフロー、制約の側面が生成計画で生成されるようになり、新しいクロスモデル参照解決メカニズムが使用されます。
言語作成者によって定義されたカスタムアスペクトも、生成計画に参加できます。カスタムアスペクトを取得した場合は、そのジェネレーターが jetbrains.mps.lang.descriptor 言語のジェネレーターを拡張していることを確認する必要があります。これは、プランに対してカスタム拡張機能をアクティブ化する方法です。
関連ページ:
マッピング優先順位
マッピング優先順位:マッピング優先順位は、生成規則(マッピング構成)間の優先順位を指定するマッピング優先順位規則のセットです。マッピングの優先順位は、ジェネレーターモジュールのプロパティダイアログで指定されます。参照: 生成プログラム各マッピング優先度ルールは、左側、右側、中央の優先度シンボルで構成されます。例:* < [sample.language/generator: *] 優先度ルールの左側は、このジェネレーターのマッピング構成のみを参照できます。* このジェネレーターのすべてのマッピ...
ジェネレーターデモ
ジェネレーターチュートリアル:MPS で言語ジェネレーターを定義および拡張するプロセスをガイドする、更新されたジェネレーターチュートリアルへようこそ。チュートリアルは 7 つのパートで構成されており、徐々に複雑さが増しています。すべてのデモは、同じ基本的なストーリー、つまり Java Swing コンポーネントへの XML コードの変換を共有しています。各デモは前のデモに基づいており、より高度な(または場合によっては単に異なる)機能、プラクティス、アプローチを示しています。すべてのデモは論理的に...