世代計画
世代計画
生成計画を使用すると、開発者は自分のモデルに望ましい生成順序を明示的に指定でき、生成プロセスをより適切に制御できます。
目的
相互ジェネレーターの優先順位の指定は、大規模なプロジェクトの場合には面倒になる可能性があります。さらに、優先順位を指定するために、関係する言語は、適切な相互依存関係を宣言することによって互いのことを知る必要があります。これにより、言語の (場合によっては望ましい) 独立性が損なわれます。生成計画では、生成ステップの適切な順序付けの責任が 1 か所 (生成計画) にまとめられます。これらにより、言語設計者は、エンドユーザーモデルを希望の順序で処理する直感的な手段を提供できます。生成計画には、生成プロセスに含める必要があるすべての言語がリストされ、適切に順序付けし、オプションでジェネレーターが現在の一時モデルを保存するチェックポイントを指定します。これらのモデルは、生成プロセスのさらに後の自動モデル間参照解決に使用できます。
生成計画の定義
生成計画を作成するには、まずモデルを作成する必要があります。通常のモデルと区別しやすいように、モデルに genplan ステレオタイプを付けることを検討することもできますが、これは必須ではありません。
jetbrains.mps.lang.generator.plan と jetbrains.mps.lang.smodel 言語をインポートした後、あなたの世代の計画を表現する計画コンセプトのルートノードを作成することができます。
生成計画は変換とチェックポイントで構成されています。
必要なジェネレーターを明示的に指定することも可能です。
変換は生成ステップを表します。変換ステートメントは、具体的な言語と次のいずれかのオプションでパラメーター化されます。
変換 - 指定された言語を生成します。
ターゲット - 指定された言語を「ターゲット」言語として明示する言語のすべてのジェネレーターを実行します (言語依存関係内)。
拡張 - 指定された言語を「拡張」言語として明示する言語のすべてのジェネレーターを実行します (言語依存関係内)。
Apply は、特定のジェネレーターの明示的な呼び出しを表します。apply with extended ステートメントは、指定されたジェネレーターと拡張するジェネレーターを 1 つのステップで適用します。これにより、言語設計者は可能な拡張に対応できます。
fork with を使用すると、プランは生成プロセスをフォークし、別の生成プランをフォークすることができます。
参照された生成計画は、フォークステップにあった状態のモデルのコピーから始まり、通常の変換として進みます。この時点から、2 つのジェネレーターは独立して稼働します。
fork with のオプションの as プロパティは、文字列修飾子であり、フォークのトリガーとして機能します。フォークは、生成中のモデルが、文字列トリガーと一致するファセット ID を持つファセット (生成ターゲットファセットである必要があります) を持つモジュールによって所有されている場合にのみ発生します。
fork as は、生成プランのオプションのプロパティであり、現在のプランをフックして、他の生成プランを実際に変更することなくフォークします。実際の結果として、"main "生成プランのフォークとしてマークされた生成プランは、"main "生成プランの先頭に挿入された標準の"fork" ステートメントで明示的に参照されたかのように評価されます。プロパティの実際の値は、フォークの発生をトリガーする文字列です。Fork with ステートメントの as プロパティと同様に、フォークは、生成中のモデルが、文字列 guard と一致するファセット ID を持つファセット (生成ターゲットファセットである必要があります) を持つモジュールによって所有されている場合にのみ発生します。
チェックポイントは、中間モデルを保持する必要がある生成中のポイントを表します。生成の後半で解決される参照は、マッピングラベルを介して、保存された中間モデル内のノードを検索して解決できるようになります。これらのチェックポイントモデルは、プロジェクトビューツールウィンドウで表示できます。
これらの中間チェックポイントモデルは、MPS をシャットダウンするか、モデルまたはそれらが依存するモデルを再構築するまで保持されます。または、手動で削除することもできます:
チェックポイントは、異なる計画間の同期点を提供します。チェックポイントモデルは、モデルの作成時に使用されたチェックポイントの名前と一致するステレオタイプで示されます。モデルは、<plan-name> - <checkpoint name> の命名規則を使用して、生成されたソースとともに永続化されます。
個別のステートメントにより、チェックポイントのさまざまな側面を取り込むことができます。
checkpoint <name> ステートメントを宣言します。ジェネレータープランがそれらの間で共有できるラベルを指定します。このステートメントは、変換されたモデルの状態を記録 / 永続化するものではなく、他の世代の計画が参照できるようになる単なる宣言です。
checkpoint <checkpoint> - 変換されたモデルの状態を記録 / 永続化します。これは、どちらかのインプレースチェックポイントを宣言するか、宣言したチェックポイントを参照することができます。
<checkpoint> ステートメントと同期する - 指定されたチェックポイントの永続化されたモデルでターゲットノードを検索するように生成計画に指示しますが、独自のノードは永続化しません(チェックポイントへの読み取り専用アクセス)。このステートメントは新しい状態を導入しませんが、他の場所で宣言されたチェックポイントを参照します。
モデルの生成計画の指定
生成計画に従ってモデルを構築する必要があるモジュールは、カスタム生成ファセットを有効にし、実際に必要な生成計画を指す必要があります。
生成計画の確認
モデルのポップアップメニューの世代計画を表示するアクションは、生成のアウトラインを作成するときに生成計画を正しく考慮します。
生成計画の出所の詳細と実際の計画へのクリック可能なリンクは、レポートに含まれています。
使用されている言語のいずれかが生成計画で処理されていない場合は、計画にも記載されています。
明示的な生成計画スクリプトなしで使用される元の生成優先度ベースの生成計画を表示するには、Alt キーを押しながら生成計画の表示メニューエントリをクリックします。
レポートには、現在アクティブな計画ではないことがヘッダーに表示されています。
DevKits を使用して世代計画を関連付ける
DevKits は世代計画も関連付けることができます。
まず、DevKit がラップする必要がある言語とソリューションへの依存関係を追加します。次に、インポートしたソリューション内から世代計画を指定します。これは DevKit に関連付けられます。その DevKit をインポートするすべてのモデルは、それに適用された DevKit の関連世代計画を取得します。
クロスモデル生成
モデルは MPS の生成単位です。単一モデル内のすべてのエンティティが一緒に生成され、ノード間の参照は参照マクロとマッピングラベルを使用して解決できます。ただし、マッピングラベルは、デフォルトでは他のモデルからアクセスできません。これにより、他のモデルのノードを参照する参照の生成が複雑になります。幸い、モデルが生成計画を共有している場合、通常のマッピングラベルは、相互参照を使用して相互に独立したモデルの生成をサポートできます。このメカニズムは、チェックポイントを活用して中間過渡モデルをキャプチャーし、参照解決に使用します。
基本的に、複数のモデルを生成するときにモデル間の参照を保持するには、モデルが生成計画を共有していることを確認してください。その生成計画では、モデル間の参照解決に使用されるマッピングラベルが設定された時点で、チェックポイントを定義する必要があります。残りは自動的に処理されます。参照マクロは、ラベルと入力による通常の genContext.get 出力(リダクションまたはルートマッピングルールによって生成されたノードの場合)またはモデルの genContext.get 出力(条件付きルートマッピングルールによって生成されたノードの場合)を介して、マッピングラベルからノードを解決できます。
チェックポイントモデルのリンク
チェックポイントで作成されたモデルは、シーケンス内の前のチェックポイントモデルへの参照を保持するようになりました。これは、ジェネレーターが複数のジェネレーターフェーズにわたる入力と一致するマッピングされたノードを発見できます。
チェックポイントモデルのデバッグ情報
クロスモデル生成シナリオのデバッグを容易にするために、各チェックポイントモデル内の専用ルートは、格納された入力ノードと出力ノードへのポインターとともにマッピングラベル名を一覧表示します。各チェックポイントで公開されているマッピングラベルを調査すると、モデル間の生成シナリオをデバッグし、未解決の参照を修正するのに大いに役立ちます。次にクロスモデル参照が解決されない場合は、対応するチェックポイントモデルを調べて、入力に実際にラベルがあるかどうかを確認します。
言語記述子モデルの生成
生成計画は、言語(<language.name>@descriptor
として知られている)の記述子モデルを生成するように拡張されました。構造、textgen、型システム、データフロー、制約の側面が生成計画で生成されるようになり、新しいクロスモデル参照解決メカニズムが使用されます。
言語作成者によって定義されたカスタムアスペクトも、生成計画に参加できます。カスタムアスペクトを取得した場合は、そのジェネレーターが jetbrains.mps.lang.descriptor
言語のジェネレーターを拡張していることを確認する必要があります。これは、プランに対してカスタム拡張機能をアクティブ化する方法です。
関連ページ:
マッピング優先順位
マッピング優先順位:マッピング優先順位は、生成規則(マッピング構成)間の優先順位を指定するマッピング優先順位規則のセットです。マッピングの優先順位は、ジェネレーターモジュールのプロパティダイアログで指定されます。参照: 生成プログラム各マッピング優先度ルールは、左側、右側、中央の優先度記号で構成されます。例:* < [sample.language/generator: *] 優先度ルールの左側は、このジェネレーターのマッピング構成のみを参照できます。* このジェネレーターのすべてのマッピング...
ジェネレーターデモ
ジェネレーターチュートリアル:MPS で言語ジェネレーターを定義および拡張するプロセスをガイドする、更新されたジェネレーターチュートリアルへようこそ。チュートリアルは 7 つのパートで構成されており、徐々に複雑さが増しています。すべてのデモは、同じ基本的なストーリー、つまり Java Swing コンポーネントへの XML コードの変換を共有しています。各デモは前のデモに基づいており、より高度な(または場合によっては単に異なる)機能、プラクティス、アプローチを示しています。すべてのデモは論理的に...