MPS JAVA言語の単純な拡張機能を作成する

はじめに
Habréの視聴者は非常に異質であり、経験豊富なDSLアーキテクトに等しく適したテキストを書くことは困難であると同時に、興味のある学生の好奇心mind盛な人がアクセスできます。 読者を単純なものからより複雑なものに一貫して導くために、MPSに関する一連の記事を想定しています。



MPSユーザーには、「 言語開発 」と「 言語開発者 」という2つのまったく異なる役割があることに注意してください。 「言語の開発者」にとって、MPSは単なるIDEであり、使い慣れたプログラミング言語のほとんどのIDEと動作が非常に似ています。 さらに、「言語の開発者」には、IntelliJ IDEAから直接MPSで作成された言語でプログラムできるプラグインがあります。 次に、「言語開発者」の役割に焦点を当てます。



これは、MPSで既存の言語(この場合はJava)を新しいデザインで拡張する方法を示す最初の記事です。 まず、MPSの基本原則について少しお話しし、いくつかの特別な概念を紹介します。 記事の最後に、私たちが独自のJava言語の拡張機能を作成するスクリーンキャストがあります。 さらに記事を理解するには、これらの手順を自分で繰り返すことをお勧めします。 私たちはコメントとダイレクトメッセージで困難を抱えているすべての人を助けることを約束します。



この記事を読む前にコンスタンチン・ソロマトフの記事を読むことをお勧めします。コンスタンチン・ソロマトフは、DSLとは何か、誰がそれを必要としているのかについて説明しています。 また、MPSアプローチがDSLの開発に対する以前のアプローチ(レクサーおよびパーサーに基づく)とどのように異なるか、およびプロジェクションエディターとの関係についても説明します。



MPSの概念
AST

前の記事ですでに理解したように、MPS プログラム構文ツリー 、またはAST (Abstract Syntax Tree)で動作します。



このツリーはノードで構成され、各ノードには次のものがあります。





MPSのノードはモデルに結合されます 。 MPSのモデルは、Java言語のパッケージに類似しています。



コンセプト

各ASTノードには、このノードの構成、編集中、生成中などの動作を決定するタイプがあります。 MPSのこのタイプは概念と呼ばれます。 大まかな概算では、概念とノードはJava言語のクラスとオブジェクトと同じ関係にあります。



MPSの概念宣言は、この概念のノードに保存されるデータを記述します。 コンセプトの残りの動作(エディター、型制限、ジェネレーター)はコンセプトの同じ側面 -エディター、タイプシステム、ジェネレーター...



言語は、概念とその側面の単なるコレクションです。



世代

MPSでのコンパイルの類似物は世代と呼ばれます。 モデルから生成された結果、ディスク上のファイルが取得されます。



生成には2つの段階があります。

モデル間変換 。 この段階で、MPSは、言語のジェネレーターの側面で説明されている規則に従って、元のASTを変換します。 結果は、低レベル言語の別のASTです。

モデルからテキストへの変換 。 この段階で、MPSは最初のステップで取得したモデルを取得し、各ノードをテキストに変換します。その後、このテキストをディスク上のファイルに書き込みます。



基本的な概念が終了したら、次のタスクの例でMPSを理解しましょう。



問題の声明
実際には、次の形式で条件ステートメントを記述する必要があります。



if (condition) { statement; }
      
      







この例では、このような構成のためにMPSに特別な表記法を実装します。これにより、同じコードをより短く書くことができます。



 ? condition : statement;
      
      







新しい構成はJava言語の拡張であり、条件演算子の使用が許可されているコード内の任意の場所に適用できます。 もちろん、この拡張機能なしでも実行できますが、この記事の目標は新しい言語を発明することではなく、MPS環境で言語拡張機能を作成する方法を示すことです。



コンピューターにMPSを配置します
これが最も簡単な手順です。 JetBrainsの公式Webサイトにアクセスして、MPSディストリビューションをダウンロードする必要があります 。 インストールプロセスは、すべてのハブブラウザーで利用できます(利用できない場合、そのユーザーは明らかにハブユーザーではありません)。 この記事では、MacOS XにインストールされたMPS 3.0の例を挙げますが、他のオペレーティングシステムでもすべて同じように見えます。



さらに、MPSでJava言語の簡単な拡張を作成する方法の小さなスクリーンキャストをご覧ください。







まとめ
この例では、言語を拡張するために約10行のコードを記述しましたが、プロセスの説明は非常に膨大であることが判明しました。 もちろん、独自の言語や拡張機能をゼロから作成することは非常に困難ですが、プロジェクトの開発には将来的にはよりシンプルなアプローチが伴います。

この記事では、MPS環境を詳しく見てきたので、誰もがJavaマグに少し構文上の砂糖を追加できるようになりました。



関連リンク

habrahabr.ru/post/66178

habrahabr.ru/post/122358

habrahabr.ru/post/122650

habrahabr.ru/post/68313

habrahabr.ru/post/169711

habrahabr.ru/post/74367



confluence.jetbrains.com/display/MPSD2/Basic+notions

www.jetbrains.com/mps/documentation/index.html

confluence.jetbrains.com/display/MPS/Welcome+to+JetBrains+MPS+Space

confluence.jetbrains.com/display/MPSD2/MPS+User%27s+Guide



All Articles