MPS 2024.1 ヘルプ

実行構成

導入

実行構成により、ユーザーは自分の言語で書かれたプログラムの実行方法を定義できます。

既存の実行構成は、メインツールバーにある実行構成ボックスから実行できます。

runConfig1.png

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

runConfig7.png

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

runConfig6.png

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

runconfig3.png
runconfig4.png
runconfig5.png

まとめると、実行構成は次のことを定義します。

  • 作成段階では:

    • 構成名、キャプション、アイコン。

    • 構成の種類

    • ノード、モデル、モジュール、プロジェクトから構成を作成する方法。

  • 構成段階では:

    • 永続パラメーター

    • 永続パラメーター用のエディター。

    • 永続パラメーターの妥当性のチェッカー

  • 実行段階では:

    • 実際に実行されるプロセス

    • すべてのタブ、アクションボタン、実際のコンソールウィンドウを備えたコンソール。

    • この構成をデバッグするために必要なもの(可能な場合)

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 からの読み取り)、クローンを作成したいため、それらの型には制限があります。それぞれのプロパティは CloneableString、または任意のプリミティブ型のいずれかであるべきです。template persistent property という特別な種類のプロパティもありますが、それらについては後で説明します。

  • editor- このセクションでは、構成のエディターについて説明します。次の機能を保持します: createapply toreset fromdispose セクションでは、エディターの一部のオブジェクトを格納するフィールドを定義することもできます。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 つの型のパラメーターがあります。オプションのパラメーターはデフォルト値を持つことができ、コマンドの開始時に省略することができますが、required はデフォルト値を持つことはできず、それらは必須です。コマンドの任意の 2 つの実行セクションには、必須パラメーターの(型ごとに)異なるリストがなければなりません。ある実行セクションが別の実行セクションを呼び出すことができます。各実行セクションは、process または ProcessHandler 型のいずれかの値を返す必要があります。

ProcessBuilderExpression

コマンド実行セクションから処理を開始するには、ProcessBuilderExpression が使用されます。コマンド部分の簡単なリストです。各部分は、string または list<string> 型の式で構成される ProcessBuilderPart、またはキー付きのパラメーターを表す ProcessBuilderKeyPart(「-classpath/path/to/classes」など)です。ProcessBuilderExpression から生成されたコードが呼び出されると、各部分は NULL または空であるかどうかがテストされ、そうでない場合は省略されます。その後、各部分はスペースで複数の部分に分割されます。そのため、コマンド部分にスペースを入れて、それを分割したくない場合(たとえば、スペースを含むファイルパスがある場合)、それを二重引用符(")で囲む必要があります。作成されたプロセスのインスペクターで指定することができます。

デバッガー統合

コマンドをデバッガーと統合するには、2 つのことを指定する必要があります。

  • 統合する特定のデバッガー

  • プロセスのコマンドライン引数

デバッガーを指定するには、DebuggerReferencejetbrains.mps.debug.apiLangdebugger 型の式)を使用して、特定のデバッガーを参照します。デバッガー設定は、タイプ IDebuggerSettings のオブジェクトでなければなりません。

構成

設定言語は実行構成を作成することを可能にします。実行構成を作成するには、on で RunConfiguration のインスタンス(基本的には設定言語からの構成)を作成し、それに RunConfigurationExecutor を提供する必要があります。この構成の種類を指定する RunConfigurationKind、ノード、モデル、モジュールからこの構成を作成する方法を指定する RunConfigurationProducer、および実行前に構成を準備する方法を指定する BeforeTask も必要になる場合があります。

執行者

Executor はノードであり、この実行構成に対してプロセスがどのように開始されるかを記述しています。ユーザーが入力した設定を受け取り、そこからプロセスを作成します。そのため、エグゼキュータの execute メソッドは、process 型のインスタンスを返すべきです。これは StartProcessHandlerStatement を介して行われます。型 process または ProcessHandler を持つものはすべてそれに渡すことができます。process は 3 つの異なる方法で作成できます。

  1. コマンド経由。

  2. ProcessBuilderExpression 経由(コマンド内でのみ使用することをお勧めします)。

  3. ProcessHandler クラスの新しいインスタンスを作成します。この方法は、リモートデバッグ用の実行構成を作成していて、実際にプロセスを開始する必要がない場合など、上記の 2 つが適切でない場合にのみ推奨されます。

エグゼキュータ自体は、次のセクションで構成されています。

  1. この executor の対象となる構成、およびその別名が指定されている "for" セクション。

  2. この設定を実行 / デバッグする機能が指定されている "can" セクション。このエグゼキュータでコマンドが使用されていない場合は、ここに DebuggerConfiguration のインスタンスを指定する必要があります。

  3. Make など、この構成の実行前に実行できるタスクの呼び出しを含む「before」セクション。

  4. プロセス自体が作成される "execute" セクション

デバッガー統合

コマンドを使用してプロセスを開始する場合は、設定をデバッグ可能として指定すること以外は何もしないでください(executor で "debug" を選択することによって)。ただし、カスタムデバッガー統合が必要な場合は、コマンド宣言と同じ方法で行われます。

生産者

実行構成のプロデューサーは、さまざまなノードまたはノードのグループ、モデル、モジュール、プロジェクトに対してこの構成を作成する方法について説明します。これにより、各プロデューサーのコンテキストメニューに選択された項目の実行を提案するアクションが表示されるため、実行構成をユーザーにとって簡単に見つけることができます。また、最初に編集ダイアログを見ずに何かを実行するデフォルトの方法を提供するため、これは設定を単純化します。

各プロデューサーは、作成する実行構成を 1 つ指定します。構成の生成元となるソースの種類ごとに、セクションからの複数の生成元を持つことができます。このソースは、node <>、nlist <>、model、module、project のいずれかになります。ソースとは別に、セクションからの各プロデュースには、作成セクション(ソースでパラメーター化された概念関数)があります。この関数は、作成された実行構成を返すか、何らかの理由で作成できない場合は null を返します。

便利な例

このセクションでは、実行構成の使用箇所に関するいくつかの役立つヒントと例を見つけることができます。

パーソンエディター

この例では、"Person" のエディターが作成されています。このエディターは、人物の 2 つのプロパティ、名前とメールアドレスを編集します。

personEditor.png

PersonEditor は、次のように java コードから使用できます。

public class SettingsEditorDialogTest { public static void main(string[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { // create PersonEditor template configuration<PersonEditor> personEditor = new PersonEditor(); // create dialog SettingsEditorDialog dialog = new SettingsEditorDialog(personEditor); // show dialog dialog.setVisible(true); // print name and email, specified by user System.out.println("name = " + personEditor.myName); System.out.println("email = " + personEditor.myEmail); } }); } }

実行コマンド

これは、特定の workingDirectory 内の programParameters を使用して特定の executable を開始する単純なコマンドの例です。

exec.png

タスクの前に gcc でコンパイルする

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

compilegcc.png

これは単なる例にすぎないことに注意してください。実際のシナリオでは、たとえばコンパイル中にタスクに進行状況ウィンドウが表示されるはずです。

Java エグゼキュータ

これは MPS からの Java 実行構成のための実際の executor です。

java.png

Java プロデューサー

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

producer.png

ここに 3 つの「プロデュース」セクションがあります。ここでは、ClassConceptStaticMethodDeclarationIMainClass のノードから Java 実行構成が作成されます。

java クラスに生成されたノードの実行

main メソッドを使って java クラスに生成される概念のノードがあり、このノードを MPS から実行したいとしましょう。この場合、実行設定を作成する必要はありませんが、次の手順を実行する必要があります。

  1. 実行したいコンセプトは jetbrains.mps.execution.util 言語から IMainClass コンセプトを実行するべきです。ノードをいつ実行できるかを指定するには、isNodeRunnable メソッドをオーバーライドします。

  2. そのためにユニット情報を生成する必要があります。実行するクラス名を正しく特定するためにユニット情報が必要です。MPS ドキュメントのデバッガーセクションで、すべてのトレース情報と同様に、ユニット情報についてさらに読むことができます。この確認を確実にするために、以下の条件の 1 つが満たされていることを確認してください。

    1. ノードから jetbrains.mps.baseLanguage から ClassConcept が生成されます。

    2. ノードはテキストに生成され(言語は生成に textGen アスペクトを使用します)、ノードの概念は jetbrains.mps.traceable から UnitConcept インターフェースを実装します。

    3. ノードは、3 つの指定された条件のうちの 1 つが満たされるという概念に分類されます。

関連ページ:

デバッガー

MPS は、カスタムデバッガーを作成し、java のデバッガーと統合するための API を提供します。MPS デバッガー機能の説明については、デバッガーの使用箇所ページを参照してください。基本:ユーザーモデルから生成されるコードをデバッグするために、MPS は以下をする必要があります: デバッガーでシームレスに 2 つの世界を一致させることができるようにするために、生成されたコードまでユーザモデルのノードを追跡します、どのノードにどのタイプのブレークポイントを作成できるかを理解する、デバッガーで...

使用箇所の検索

MPS では、どのモデルもノードで構成されています。ノードはさまざまな種類の関係を持つことができます。これらの関係はノード構造(たとえば、クラス上の「クラス子孫」関係)で表現されていてもいなくてもよい(たとえば、メソッド上の「オーバーライドメソッド」関係)。使用箇所の検索は与えられたノードに対していくつかの特別に関連したノードを表示するためのツールです。MPS では、使用箇所の検索システムは完全にカスタマイズ可能です - 独自の実体、いわゆるファインダーを書くことができます。そしてそれは関連する...

エラーを抑制する

MPS で高品質のコードを維持するための非常に効果的な方法の 1 つは、エラー、警告、潜在的な問題をコード内で直接ハイライトする即時のコード分析です。他のコード品質報告ツールと同様に、ユーザーが誤検知をマークして繰り返し報告されないようにできることが不可欠です。MPS はエラーを抑制するために 2 つのメカニズムを提供し、それらがエディターおよびモデルチェッカーツールに表示されるのを防ぎます。1 つ目は、言語開発者が利用できる一般的なものです。言語拡張を設計したり、既存の言語を新しい言語に埋め込...