JetBrains MPSシステムがDSL(ドメイン固有言語)の使用を強化する方法

DSL(ドメイン固有の言語または特定の領域の言語)は、長い間プログラマーに知られています。 それにもかかわらず、実際のシステムではほとんど使用されません。 この記事では、DSLの概要と、DSLが広く使用されていない理由について説明します。 また、JetBrains MPSがその普及を妨げる問題をどのように解決するかについても説明します。





では、DSLとは何ですか? DSLは、特定の分野の問題を解決するために作成された言語です。 DSLは、狭い分野の問題を解決する最も宣言的な言語です。 たとえば、SQL、正規表現、XPath、プロローグ、Excelの数式。 残念ながら、ここで一般的に使用されるDSLのリストが終わります。 このような言語の主な利点は、サブジェクト領域に構造が近接しているため、これらの言語のコードが非常に明確で簡潔であることです。 さらに、そのような言語でコードを編集するために、プログラマである必要はありません。 対象分野を理解している人は、知識のおかげでそのような言語で簡単にコードを書くことができます。



理論的には、すべてが単純に見えます。たとえば、会計などの主題分野を取り上げ、言語を作成して専門家に提供するか、主題分野の簡単な説明のために自分で使用します。 残念ながら、このアプローチは広く普及していません。 理由を見てみましょう。

DSLが普及していないのはなぜですか?



DSLが広く使用されない理由を見てみましょう。 1つ目の理由は、そのような言語の作成者は、Java、PHP、JavaScriptなどの既存の汎用プログラミング言語を拡張するのではなく、特定の1つの問題だけを閉じる言語に焦点を当てているためです。 これには理由があります。そのような拡張機能を互いに組み合わせると、あいまいさが現れる可能性があります。 もう1つの理由は、言語の実装に必要な言語インフラストラクチャを作成するのが難しく、快適に作業できることです。



DSLコミュニティでのほとんどの取り組みは、閉じられた言語での作業に集中しています。 多くの場合、Javaなどの既存の言語に新しいコンストラクトを追加すると便利です。 ライブラリを使用するのと同じように、言語拡張機能を使用できると想像してください。 このアプローチにより、開発者はDSLの表現力とJavaなどの言語の汎用性を同時に使用できますが、これは既存のテクノロジーでは不可能です。



拡張機能を作成する場合、現在ライブラリを使用しているのと同じ方法で拡張機能を使用するには、言語を相互に互換性のあるものにする必要があります。 つまり、お金のサポートなどの拡張機能を言語に追加すると、金銭の種類、$ 10や100rなどのリテラル、および言語に数学表記を追加する別の拡張機能(合計、作品など)を使用できます。異なる著者によって作成された場合でも、一緒に。



残念ながら、一般的な汎用プログラミング言語はすべてテキスト文法に基づいています。 これらの文法には、1つの不快な特性があります。曖昧になる可能性があり、同じ行の複数の解釈がある場合があります。 さらに、拡張機能Aを使用してJavaに新しいコンストラクトを追加し、文法の一意性を達成し、拡張機能Bで同じことを行うと、Javaと両方の拡張機能を使用すると、結果の文法があいまいになることがあります。



例を見てみましょう。 2社がJavaで文字列補間(文字列補間により文字列リテラル内に式を記述できるようにする)のサポートを追加することにしたとしましょう。 最初の会社がこの構文を使用しているとしましょう:

「{2 + 3}」

そして2つ目は:

「$ {2 + 3}」

両方の拡張機能を同時に使用し、次のプログラムを導入する場合:

「口座残高は$ {account.getBalance()}です」

その解釈はあいまいです。 $は補間構文の一部ですか、それとも文字列リテラルの一部ですか? この例はやや人為的なものですが、さまざまな構成に類似した構文がある場合に生じる一般的なあいまいさの問題を理解することができます。



開発者の生産性を高めるには、インテリジェントな開発ツールが必要です。 IntelliJ IDEAやEclipseなどのインテリジェントエディターの出現により、開発者は通常のエディターでテキスト編集に切り替えることが困難になる可能性があります。 テキストエディタはエラーを強調表示せず、コンテキストヘルプを提供せず、使用可能なオプションを含むメニューを表示せず、リファクタリングをサポートしません。 IntelliJ IDEA Language API、XText、Osloなどのインテリジェントエディターを作成するためのフレームワークがありますが、これらのフレームワークはいずれも適切なレベルで拡張可能な言語をサポートしていません。 拡張性を必要としない場合でも、これらのツールを使用して言語サポートを作成するには、プログラミング言語に関する十分な知識が必要であり、多くの時間がかかります。 ご覧のとおり、インストルメンタルサポートは非​​常に重要ですが、実装は簡単ではありません。



要約すると、人々は間違ったタイプのDSLを行っています。 生産性を向上させるには、既存の汎用プログラミング言語を拡張する必要があります。 このような拡張機能を作成することは、広範な技術が拡張機能の相互互換性をサポートしていないという事実のために困難です。

JetBrains MPSがこれらの問題を解決する方法



MPSがこれらの問題をどのように解決するかを見てみましょう。 拡張機能の相互の互換性を維持するために、MPSはテキストと同様にプログラムでは機能しません。 代わりに、MPSはそれらを構文ツリーとして保存し、編集はテキストの中間使用なしで直接行われます。 このようなアプローチは、構文ツリーが常に存在するため、エラーの強調表示、自動追加、コンテキストプロンプトなどを簡単に実装できるため、IDEの作成を大幅に簡素化できます。



MPSは、あいまいさの問題を根本的な方法で解決します。テキストの文法がなければ、あいまいさもありません。 ただし、このアプローチは、MPSで文法が使用されないという意味ではありません。 特定の構文の代わりに、MPSの言語の定義は、抽象的な構文(構文ツリーの構造)を定義します。 XMLに精通している場合は、MPSで使用される構文記述方法に似たXMLスキーマについておそらくご存知でしょう。



このアプローチではあいまいさは不可能なので、言語を簡単に組み合わせることができます。 新しい構文を使用して、言語の構文を拡張できます。 ある言語のコードを別の言語のコードに挿入したり、比較的閉じられたDSL内の汎用プログラミング言語のコードを挿入することもできます。 これは、言語が相互に互換性があることを意味します。これにより、言語とその部分を再利用できます。これは、従来の技術の場合に大きな問題が発生する可能性があります。 JetBrainsでは、このような再利用を多数試行しました。 MPSディストリビューションには、多数のJava拡張機能が含まれています。



言語の定義に使用する言語のほとんどは、拡張可能であり、Javaを含んでいます。 たとえば、型システムの言語構成の1つである出力規則は、通常のDSLのように見えます。 同時に、このルール内では、型システムに固有の構造によって拡張されたJavaで記述できます。







テキストビューを削除したため、通常のテキストエディターを使用できません。 コードを操作するには、特別なプロジェクションエディターを使用します。 構文ツリーのノードごとに、投影が作成されます。これは、ユーザーが対話できる画面の一部です。 MPSを開発する際、そのようなエディターがテストエディターに可能な限り近い動作をするように多大な努力が払われました。 たとえば、MPSに1 + 2 + 3を入力すると、Javaでこの行を解析することで取得されるのと同じ構文ツリーが取得されます。 もちろん、プロジェクションエディターはテキストエディターとは異なり、一方では可能、他方では不可能なことがあります。逆の場合も同様です。 それにもかかわらず、パフォーマンスを損なうことなくこれらの違いに慣れることができます。 私たちの経験では、プロジェクションエディターで生産性を上げるには約2週間かかります。



構文ツリーを直接操作する際のスマート編集のサポートの作成が大幅に簡素化されました。 さらに、多くの場所で、MPS IDEによって、言語の作成者の努力なしに知的機能が提供されます。 自動追加、使用の検索、名前の変更、自動動作などの機能。 IntelliJ IDEAの開発時に、多くの言語でインテリジェントな編集サポートが実装されました。 このようなサポートの実装には多くの労力が必要でした。1人で数か月かかりました。 MPSを使用すると、同様の機能を数日で実現できます。 これは、既存の言語インフラストラクチャを構成する言語を開発するために特別な言語が使用されるため可能です。 MPSは単なるエディターではありません。 それで本格的なIDEを作成できます。



JetBrainsの内部では、MPSを使用して商用プロジェクトを開発しています。 Charismaというコードネームの新しいバグ追跡システムは、すべてMPS上にあり、これはほんの始まりに過ぎません。

おわりに



DSLの普及は、2つの問題によって防止されています。テキストベースの文法システムでDSLを再利用できないことと、DSLを操作するためのインテリジェントツールを作成する難しさです。 MPSは、中間のテキスト表現なしで構文ツリーを直接操作し、そのような言語を操作するためのインテリジェントツールを作成するためのインフラストラクチャを提供することにより、これらの問題の両方を解決します。



MPS 1.0は7月にリリースされました。 ほとんどのコードは、Apache 2.0ライセンスで利用できます(JetBreains IDEフレームワークを除き、JetBrainsからライセンスを購入することなくMPSベースの製品でMPSを使用できます)。



ここからMPSをダウンロードできます: www.jetbrains.com/mps今すぐ言語の作成を開始してください。



PSプロジェクトの上級開発者を探しています。 私のプロフィールの空席の詳細。



All Articles