実行構成
導入
実行構成により、ユーザーは自分の言語で書かれたプログラムの実行方法を定義できます。
既存の実行構成は、メインツールバーにある実行構成ボックスから実行できます。

メインメニューのファイル名を指定して実行メニュー項目

または実行 / デバッグポップアップ(Alt + Shift + F10 /Alt + Shift + F9)を使用します。

実行構成は、ノード、モデル、モジュール、プロジェクトに対して実行 / 作成することもできます。例: JUnit 実行構成では、選択したプロジェクト、モジュール、モデル内のすべてのテストを実行できます。独自の実行構成にこのような動作を実装する方法の詳細については、「生産者」を参照してください。



まとめると、実行構成は次のことを定義します。
作成段階では:
構成名、キャプション、アイコン。
構成の種類
ノード、モデル、モジュール、プロジェクトから構成を作成する方法。
構成段階では:
永続パラメーター
永続パラメーター用のエディター。
永続パラメーターの妥当性のチェッカー
実行段階では:
実際に実行されるプロセス
すべてのタブ、アクションボタン、実際のコンソールウィンドウを備えたコンソール。
この構成をデバッグするために必要なもの(可能な場合)
MPS の実行構成をサポートするために、以下の言語が導入されました。
jetbrains.mps.execution.common(共通言語) - 他の実行言語で利用されている概念を含みます。jetbrains.mps.execution.settings(設定言語) - さまざまな設定エディターを定義するための言語。jetbrains.mps.execution.commands(コマンド言語) - Java からの呼び出しを処理します。jetbrains.mps.execution.configurations(構成言語) - 実行構成定義。
設定
設定言語を使用すると、設定エディターを作成し、相互に統合できます。設定エディターに必要な機能は次のとおりです。
編集するフィールド
フィールドの正当性の検証
エディターの UI コンポーネント。
UI コンポーネントから設定を適用したり、UI コンポーネント内の設定を保存状態にリセットしたりするための関数の適用 / リセット。
不要になった UI コンポーネントを破棄する関数
ご覧のとおり、設定には UI コンポーネントがあります。通常、1 つの UI コンポーネントが複数の設定インスタンスに対して作成されます。設定では、言語設定は通常「設定」と呼ばれ、その UI コンポーネントは「エディター」と呼ばれます。
設定言語の主な概念は PersistentConfigurationTemplate です。次の節があります。
永続プロパティ - このセクションでは、実際に編集する設定について説明します。これらの設定を永続化(つまり、XML への書き込み /XML からの読み込み)し、構成を複製する必要があるため、プロパティの型には制限があります。各プロパティは、
Cloneable、String、任意のプリミティブ型である必要があります。template persistent propertyという特殊なプロパティもありますが、これについては後ほど説明します。editor- このセクションでは、構成のエディターについて説明します。次の機能を保持します:
create、apply to、reset from、disposeセクションでは、エディターの一部のオブジェクトを格納するフィールドを定義することもできます。create関数は、エディターのメイン UI コンポーネントである swing コンポーネントを返す必要があります。apply to/reset from関数は、エディターの設定をパラメーターとして指定された構成に適用またはリセットします。dispose関数はエディターを破棄します。check - このセクションでは永続的なプロパティが正しいかどうかチェックされます。一部のプロパティが無効な場合は、
report errorステートメントを使用できます。基本的に、この文はRuntimeConfigurationExceptionをスローします。追加の方法 - このセクションは設定で使用される方法のためのものです。基本的に、これらのメソッドは構成インスタンスメソッドです。
永続的なプロパティ
永続プロパティは、Cloneable、String、任意のプリミティブ型のいずれかであると前述しました。しかし、実行構成内で設定言語を使用する場合は、これらのプロパティも XML 永続化をサポートする必要があります。文字列とプリミティブ型は通常どおり永続化されます。オブジェクトの場合、永続化はより複雑です。オブジェクトに対して永続化されるプロパティは、パブリックインスタンスフィールドと、setXXX および getXXX メソッドを持つプロパティの 2 種類です。永続プロパティに複合型を使用する場合は、重要なフィールドをすべてパブリックにするか、永続化したいものすべてに setXXX および getXXX メソッドを提供する必要があります。
構成を互いに統合する
設定言語の 2 つの基本機能の 1 つは、ある設定を別の設定に簡単に統合できることです。そのために template persistent properties が使われています。
テンプレートパラメーター
設定言語の 2 つ目の基本機能は、テンプレートパラメーターです。これは、java のコンストラクターパラメーターにいくらか似ています。例: ノードを選択するための構成を作成する場合、ノードの概念で構成をパラメーター化したい場合があります。この場合、概念は永続的なパラメーターではありません。つまり、ユーザーが選択するものではありません。これは、構成作成時に指定されるパラメーターです。
コマンド
Commands 言語を使用すると、コマンドラインから実行する方法でコードからプロセスを起動できます。言語の主な概念は CommandDeclaration です。宣言では、コマンドパラメーターとこのパラメーターで処理を開始する方法を指定します。また、コマンドはデバッガーパラメーターといくつかのユーティリティメソッドを持つことができます。
実行コマンドセクション
各コマンドは複数の execute セクションを持つことができます。これらの各セクションでは、複数の実行パラメーターが定義されます。パラメーターには、必須パラメーターとオプションパラメーターの 2 種類があります。オプションパラメーターはデフォルト値を持つことができ、コマンドの開始時に省略できますが、必須パラメーターはデフォルト値を持つことができず、必須です。コマンドの任意の 2 つの実行セクションは、異なる (型による) 必須パラメーターのリストを持つ必要があります。1 つの実行セクションは、別の実行セクションを呼び出すことができます。各実行セクションは、process 型または ProcessHandler 型の値を返す必要があります。
ProcessBuilderExpression
コマンドからプロセスを開始するには、実行セクション ProcessBuilderExpression を使用します。これはコマンドパートの単純なリストです。各パートは、string または list<string> 型の式で構成される ProcessBuilderPart か、キーを持つパラメーター ("-classpath/path/to/classes") を表す ProcessBuilderKeyPart のいずれかです。ProcessBuilderExpression から生成されたコードが呼び出されると、各パートが null または空かどうかがテストされ、そうでない場合は省略されます。次に、各パートはスペースによって複数のパートに分割されます。スペースを含むコマンドパートを指定し、分割されたくない場合 (たとえば、スペースを含むファイルパスがある場合) は、それを二重引用符 ("") で囲む必要があります。作成されたプロセスの作業ディレクトリは、インスペクターで指定できます。
デバッガー統合
コマンドをデバッガーと統合するには、2 つのことを指定する必要があります。
統合する特定のデバッガー
プロセスのコマンドライン引数
デバッガーを指定するには、DebuggerReference (jetbrains.mps.debug.apiLang の debugger 型の式)を使用して、特定のデバッガーを参照します。デバッガー設定は、タイプ IDebuggerSettings のオブジェクトでなければなりません。
構成
構成言語を使用すると、実行構成を作成できます。実行構成を作成するには、RunConfiguration のインスタンス (基本的には設定言語の構成) を作成し、それに対応する RunConfigurationExecutor を指定します。また、この構成の種類を指定するために RunConfigurationKind、ノード、モデル、モジュールからこの構成を作成する方法を指定するために RunConfigurationProducer、実行前に構成を準備する方法を指定するために BeforeTask が必要になる場合があります。
執行者
Executor はノードであり、この実行構成に対してプロセスがどのように開始されるかを記述しています。ユーザーが入力した設定を受け取り、そこからプロセスを作成します。そのため、エグゼキュータの execute メソッドは、process 型のインスタンスを返すべきです。これは StartProcessHandlerStatement を介して行われます。型 process または ProcessHandler を持つものはすべてそれに渡すことができます。process は 3 つの異なる方法で作成できます。
コマンド経由。
ProcessBuilderExpression経由(コマンド内でのみ使用することをお勧めします)。ProcessHandler クラスの新しいインスタンスを作成します。この方法は、リモートデバッグ用の実行構成を作成していて、実際にプロセスを開始する必要がない場合など、上記の 2 つが適切でない場合にのみ推奨されます。
エグゼキュータ自体は、次のセクションで構成されています。
この executor の対象となる構成、およびその別名が指定されている "for" セクション。
この設定を実行 / デバッグする機能が指定されている "can" セクション。このエグゼキュータでコマンドが使用されていない場合は、ここに
DebuggerConfigurationのインスタンスを指定する必要があります。Make など、この構成の実行前に実行できるタスクの呼び出しを含む「before」セクション。
プロセス自体が作成される "execute" セクション
デバッガー統合
コマンドを使用してプロセスを開始する場合は、設定をデバッグ可能として指定すること以外は何もしないでください(executor で "debug" を選択することによって)。ただし、カスタムデバッガー統合が必要な場合は、コマンド宣言と同じ方法で行われます。
生産者
実行構成のプロデューサーは、さまざまなノードまたはノードのグループ、モデル、モジュール、プロジェクトに対してこの構成を作成する方法について説明します。これにより、各プロデューサーのコンテキストメニューに選択された項目の実行を提案するアクションが表示されるため、実行構成をユーザーにとって簡単に見つけることができます。また、最初に編集ダイアログを見ずに何かを実行するデフォルトの方法を提供するため、これは設定を単純化します。
各プロデューサーは、作成する実行構成を 1 つ指定します。構成の生成元となるソースの種類ごとに、セクションからの複数の生成元を持つことができます。このソースは、node <>、nlist <>、model、module、project のいずれかになります。ソースとは別に、セクションからの各プロデュースには、作成セクション(ソースでパラメーター化された概念関数)があります。この関数は、作成された実行構成を返すか、何らかの理由で作成できない場合は null を返します。
便利な例
このセクションでは、実行構成の使用箇所に関するいくつかの役立つヒントと例を見つけることができます。
パーソンエディター
この例では、"Person" のエディターが作成されています。このエディターは、人物の 2 つのプロパティ、名前とメールアドレスを編集します。

PersonEditor は、次のように java コードから使用できます。
実行コマンド
これは、指定された workingDirectory 内の programParameters を使用して、指定された executable を開始するコマンドの例です。

タスクの前に gcc でコンパイルする
これは、gcc コマンドでソースファイルのコンパイルを実行する BeforeTask の例です。また、実行構成実行プログラムの外部でコマンドを使用する方法も示しています。

これは単なる例にすぎないことに注意してください。実際のシナリオでは、たとえばコンパイル中にタスクに進行状況ウィンドウが表示されるはずです。
Java エグゼキュータ
これは MPS からの Java 実行構成のための実際の executor です。

Java プロデューサー
これは MPS からの Java 実行構成のプロデューサーです。

ここに 3 つの「プロデュース」セクションがあります。ここでは、ClassConcept、StaticMethodDeclaration、IMainClass のノードから Java 実行構成が作成されます。
java クラスに生成されたノードの実行
概念のノードがメインメソッドを持つ java クラスに生成され、そのノードを MPS から実行したいとします。この場合、実行構成を作成する必要はありませんが、以下の手順を実行する必要があります。
実行したいコンセプトは
jetbrains.mps.execution.util言語からIMainClassコンセプトを実行するべきです。ノードをいつ実行できるかを指定するには、isNodeRunnableメソッドをオーバーライドします。概念ごとにユニット情報を生成する必要があります。ユニット情報は、実行されるクラス名を正しく特定するために必要です。ユニット情報およびすべてのトレース情報については、MPS ドキュメントのデバッガーセクションを参照してください。これを確認するには、以下のいずれかの条件が満たされていることを確認してください。
ノードから
jetbrains.mps.baseLanguageからClassConceptが生成されます。ノードはテキストに生成され(言語は生成に
textGenアスペクトを使用します)、ノードの概念はjetbrains.mps.traceableからUnitConceptインターフェースを実装します。指定された 3 つの条件のうち 1 つを満たす概念にノードが生成されます。
関連ページ:
デバッガー
MPS は、カスタムデバッガーを作成するための API を提供するとともに、Java 用デバッガーとの統合も可能にします。MPS デバッガーの機能については、デバッガーの使用箇所ページを参照してください。基本:ユーザーモデルから生成されるコードをデバッグするために、MPS は以下をする必要があります: デバッガーでシームレスに 2 つの世界を一致させることができるようにするために、生成されたコードまでユーザモデルのノードを追跡します、どのノードにどのタイプのブレークポイントを作成できるかを理解す...
使用箇所の検索
MPS では、あらゆるモデルはノードで構成されます。ノードは様々な種類の関係を持つことができます。これらの関係は、ノード構造で表現される場合(たとえば、クラス間の「クラスの子孫」関係)もあれば、そうでない場合(たとえば、メソッド間の「メソッドのオーバーライド」関係)もあります。使用箇所の検索は、特定のノードに関連するノードを表示するためのツールです。MPS では、使用箇所の検索システムは完全にカスタマイズ可能です - 独自の実体、いわゆるファインダーを書くことができます。そしてそれは関連するノー...
エラーを抑制する
MPS でコードの品質を高く維持する最も効果的な方法の 1 つは、コード内のエラー、警告、潜在的な問題を直接ハイライト表示する、即時のオンザフライコード分析です。他のコード品質レポートツールと同様に、誤検出が繰り返し報告されないように、ユーザーが誤検出をマークできることが重要です。MPS は、エラーを抑制し、エディターとモデルチェッカーツールに表示されないようにする 2 つのメカニズムを提供します。まず、言語開発者が利用できる一般的な機能があります。言語拡張を設計したり、既存の言語を新しい言語に...