JetBrains MPS-問題指向プログラミング言語を開発するためのIDE

はじめに



MPSは、Intellij Ideaプログラミング言語開発環境です。 パーサー、レクサー、およびさまざまなサードパーティの言語機能に気を取られることなく、プログラミング言語をシミュレートし、構造を記述し、特に設計およびビジネスロジックに焦点を当てる機会を提供します。 すぐに特定する必要があるもの:MPSを使用して開発された言語は、作業プログラムにコンパイルされません。 ほとんどの場合、他の言語のモデルまたはテキスト形式で生成されます。



なぜこの記事を書くことにしたのですか? これは非常に過小評価されている機会であり、エントリーのしきい値が非常に高いため過小評価されていると考えています。さらに、これは最も人気のないJetBrains製品の1つです。



ドキュメントは非常に詳細であり、すべての可能性を説明していますが、「自分が何をしていて、なぜそれをすべきか」という認識がなければ、役に立つとは思えません。 YouTubeのJetBrainsからも一連のレッスンがありますが、ここでも、シリーズ全体の2つのビューと提案されたサンプルプロジェクトの徹底的な調査の後、何が起こっているのかを理解し始めました。



この素晴らしい環境についての一連の投稿を書いて、熱心な読者が最後に「このことをどのように行うか」という質問をできるだけ少なくし、 ドキュメントを効果的に使用できるように構造をできるだけ理解するようにします 。 天気のパターンを説明する言語の作成中にMPSを学習します。 なぜ、実際にはそうではないのですか?



コンセプト



MPS(以降、環境/ MPSと呼びます)は、 LanguageSolutionの 2種類のモジュールを作成する機能を提供します。 1つ目は言語とその側面の説明、2つ目はプロジェクトの開発、言語のテスト、言語拡張に使用されます。



Languageから始めます。



最初から理解する最も重要なことは、言語を開発するプロセスと、その後に言語に何が起こるかです。



  1. 言語モデルと、この言語の必要な側面、たとえば型システム、エディターでの動作について説明します。
  2. 言語のモデルをテキストまたは別の言語のモデルにコンパイルする方法を説明します。

  3. Intellij Ideaのプラグインに言語を集めて使用します。 あるモデルから別のモデルへのすべての移行は私たちのために行われ、その結果、既製のコンパイル済みコードを取得します。



MPS形式でコードを書くことは、実際にAST(Abstract Syntax Tree)を編集しているため、プログラムテキストを書くこととはわずかに異なり、コードエディタに表示されるのはASTプロジェクションです。



したがって、1つの記事-最終プロジェクトの1つの部分。



MPSでプロジェクトを作成する



MPS_1_START






この段階で、プロジェクトの名前と言語の名前を選択します。また、Sandboxソリューションを作成することもできます。このモジュールでは、言語の動作を確認できます。



画像






空のプロジェクトがあります。 完全に空です。 しかし、WeatherPredictionにはネストされたディレクティブ(構造、エディターなど)があります。これらは言語の側面です 。さまざまな状況での言語の動作を記述しています。 たとえば、 構造 には言語の基本概念が含まれ、 エディターにはコードエディターでの表示方法が含まれます。 これは、特にMPSに慣れていない場合は特に、非常に抽象的に聞こえます。 わかった。 まっすぐに戦いに行きましょう。



まず、 ルート言語の概念を宣言する必要があります。 ロシア語に翻訳すると、他のすべての構造を一般化する何らかの構造を作成しています。 Javaでは、それは



Javaルートコンセプトの例
public class Weather{ }
      
      





コンセプトを作成するには、WeatherPrediction-> New-> ConceptでLMCをクリックします。



画像






コンセプトには、含めることができる3種類のデータがあります。



  1. プロパティ -ここでは、任意のプリミティブデータ、ala文字列、数値、およびブール値を格納できます。抽象例- 名前が必要な整数変数:文字列値:整数最終:ブール値



  2. -他の概念の要素がここに保存されます。 プログラムの概念の抽象的な例として、そこにステートメントの配列を突き出すことができます



  3. 参照 -現在のスコープ内にあるASTの他の実装された概念へのリンクがここに保存されます。 抽象例は、値が名前による別の変数への参照である変数です(実際には、これは完全に真実ではありませんが、これは抽象例です)。


PredictionListと呼び、それをルートコンセプトとして定義し、 INamedConceptインターフェイスを継承します。



画像






ここで何が起こるか:概念を定義し、それをPredictionListと呼び、それをルート概念として実装し、INamedConceptから継承できると言います。 定義を見ると(Ctrl + B)



画像






次に、これがプロパティ名を持つインターフェイスの概念であることがわかります。文字列は、実際には名前から論理的です



構文はプログラミング言語に似ていることに注意してください。 そのため、このコードはjetbrains.mps.lang.structure言語で記述されており、言語の概念を説明しています。



ここでプロジェクトをアセンブルし、何が起こったかを見たい場合、WeatherPrediction.sandboxモジュールでモデルを作成する必要があります。



画像






サンドボックス上のLMB (生成が必要) ->新規-> PredictionList



画像






サンクトペテルブルクの名前を置き換えない



ブーム! コンセプトのデフォルトの視覚化があります。 ASTを表示するには、エディターの任意の場所をクリックし、 Alt + Xホットキーを押します。



画像






ここでは、すべての構造を確認できます。ツリーの状態を監視するのは非常に便利で便利です。 すぐに、PredictionListの名前= Saint Petersburgであることがわかります。 とてもクールですが、すべてを美しくしたいので、PredictionListコンセプトエディターを開き、そのエディターアスペクトを作成します。 コンセプトのコードのすぐ下にある下のリストの緑色のプラス記号をクリックし、[ エディター] -> [ コンセプトエディター]を選択します。



画像






ここでは、コードエディターでPredictionListがどのように表示されるかを説明できます。

ここでこれがどのように行われるかについて詳しく説明するまで、 [-と書くだけで、セルの配列ができます。 簡単です:各セル-ある種の定数テキスト/プロパティ/参照/子。 そして、はい、マッピングは別の言語-jetbrains.mps.lang.editorで記述されています。

天気予報リストは次のようになります。

%name%の天気予報ルール



だから書く。



画像






最初のセル-定数テキスト、2番目- {name}で、キー名でプロパティにアクセスします。



言語を再構築し(Ctrl + F9)、Sandboxソリューションを確認します。この前に、Saint Petersburgという名前の空のPredicitonListを作成しました。



画像






すべてが機能し、ASTは変更前と同じです。



フィードバックを得るために、今のところここでやめるつもりです。 次の投稿では、Javaでコードを生成するだけでなく、さらに2つの概念を追加する予定です。



ご清聴ありがとうございました! コメントにあなたの願い、誤解、質問をすべて書いてください。 質問が具体的で簡単な場合はコメントで回答し、そうでない場合は次の投稿に追加します。



All Articles