よくある質問 (FAQ)
ドメイン固有言語、プロジェクショナルエディターおよび MPS
ここでは、MPS に関して最もよくある質問に対する答えを見つけることができます。
ドメイン固有言語(DSL)とは何ですか? それらは「実際の」プログラミング言語とどう違うのですか?
DSL は、特定の問題領域向けに最適化された言語です。通常、Java、C、Ruby などの汎用言語ほど複雑ではありません。DSL は通常、DSL が設計されているドメインまたはフィールドの専門家と緊密に連携して開発されます。
多くの場合、DSL は、DSL が対象とするドメインに精通しているプログラマー以外の人が使用することを目的としています。つまり、言語の表記法とツールのサポートは、プログラマー以外の人向けに最適化する必要があります。そのため、プログラマーは、サブジェクト Matter Expert(SME) とも呼ばれるドメインに関連する要素と言語の側面のみを見ることができます。
通常のプログラミング言語と比較して DSL を使用する利点は何ですか?
DSL を使用する利点はたくさんあります。
DSL のエンドユーザーは、抽象化のレベルが高く、システム全体ではなく、システムのドメイン固有の部分のみを理解する必要があるため、ドメインでの作業がより効率的になります。
DSL プログラムからソースコードを生成する場合(解釈させるのではなく)、実行時のオーバーヘッドを支払うことなく、ドメイン固有の優れた抽象化を使用できます。これは、ジェネレーターがコンパイラーと同様に、抽象化を削除して効率的なコードを生成できるためです。
DSL を使用すると、ドメインの重要な要素をコードの複雑さから分離できます。これにより、ドメインの専門家とプログラマー間のコミュニケーションが向上します。
DSL と実行エンジンを使用すると、DSL コードで表現されたアプリケーションロジックがターゲットプラットフォームから独立します。
DSL を使用すると、バグの減少、アーキテクチャへの適合性の向上、コードの保守が容易になるなど、コードの品質を向上させることができます。これは、ユーザーがコードの特定のコンポーネントのみを変更するように制限し、コードの重複を回避し、反復作業を自動化した結果です。ライブラリやフレームワークとは対照的に、DSL にはツールのサポートが付属しています。コード補完、ビジュアライゼーション、デバッガー、シミュレーター、その他の優れた機能を提供して、ユーザーエクスペリエンスを向上させることができます。
DSL と通常のコードはどのように組み合わされますか?
従来のコードと DSL コードを統合する方法には、基本的に異なる 2 つの方法があります。これらは、内部 DSL と外部 DSL として知られています。MPS は両方のアプローチをサポートします。
外部 DSL:
外部の方法では、DSL コードと通常のコードを別々のファイルに保存します。次に、DSL コードは、コードジェネレーターによってプログラミング言語コードに変換されます。または、プログラムがドメイン固有コードをロードして実行します。SQL を外部 DSL の例と考えてください。
内部 DSL:
内部アプローチでは、同じプログラムファイルに両方のタイプのコードが混在しているため、DSL コードとプログラミング言語コードがより緊密に統合されます。DSL は、GPL(汎用言語)の文法とパーサーを再利用し、ホスト言語の利用可能な拡張オプションを活用します。一部の GPL は、他の GPL よりも拡張に適していることに注意してください。
言語指向プログラミングとは何ですか?
言語指向プログラミングという用語は、JetBrains の CEO であり MPS の創設者であるセルゲイドミトリエフが 2004 年の記事言語指向プログラミング: 次のプログラミングパラダイム(英語)で作り出したものです。その他の関連するアプローチには、チャールズシモニーのインテンショナルプログラミング、および 2005 年の記事言語ワークベンチ: ドメイン固有言語用のキラーアプリ? (英語) で説明されているマーティンファウラーのアプローチが含まれます。
核となる考え方は、ソフトウェアを開発するときに常に同じ言語を使用するわけではなく、それぞれの特定のタスクに最適な言語を選択することです。表面上同様のアプローチを提唱する多言語プログラミングとは対照的に、言語指向プログラミングは、開発者が独自の DSL を構築するか、アプローチの一部としてドメイン固有の概念で既存の言語を拡張することを明示的に奨励します。新しい言語の開発は、ソフトウェア開発の不可欠な部分になるはずです。これを実現可能にするために、MPS などの言語ワークベンチは言語指向アプローチの重要な要素です。
なぜ言語を拡張するのですか? ライブラリは十分ではありませんか?
ライブラリと言語拡張機能にはいくつかの違いがあります。
言語拡張には、独自の構文を含めることができます。MPS のプロジェクティブエディターでは、この構文は任意であり、拡張言語の構文によってまったく制限されません。
言語拡張には独自の制約と型システムが付属しているため、IDE は静的にエラーを報告できます。
MPS で作成された言語拡張機能は IDE に完全に統合されているため、コード補完、構文のハイライト、新しい言語構造のリファクタリングサポートを利用できます。
言語拡張は、コンパイル時の変換によって実行され、ターゲットプログラミング言語コードに変換されるため、リフレクションや間接参照のスタックが課す実行時のオーバーヘッドはありません。これは、リソースに制約のあるシステムを対象とする場合に特に重要になる可能性があります。
射影編集
射影編集とは何ですか?
パーサーベースのアプローチでは、ユーザーはテキストエディターを使用して、プログラムを表す文字シーケンスを入力します。次に、パーサーはプログラムの構文が正しいかどうかをチェックし、文字シーケンスから抽象構文木(AST)を構築します。AST には、プログラムによって表現されるすべてのセマンティック情報が含まれています。つまり、キーワードと純粋に構文的な側面は省略されています。
射影エディターでは、プロセスは逆に行われます。ユーザーがプログラムを編集すると、AST が直接変更されます。これは、編集アクションごとに AST の変更がトリガーされる MVC パターンに似ています。次に、射影エンジンは、ユーザーが操作できる AST の表現を作成します。このアプローチは、さまざまなグラフィカルエディターでよく知られています。たとえば、UML ダイアグラムを編集する場合、ユーザーは「イメージパーサー」がそのダイアグラム面を読み取って解析し、AST を作成するためにキャンバス上にピクセルを描画しません。これでは、エンジンが理解できるように描画できる内容が制限されすぎます。むしろ、クラスをパレットからキャンバスにドラッグすると、エディターによって Class のインスタンスが作成されます。射影エンジンはダイアグラムをレンダリングし、この場合はクラスの四角形を描画します。その後、ダイアグラムの意味を変えることなく、画面上の視覚要素を再配置できます。
このアプローチは、テキストエディターでも機能するように一般化できます。すべてのプログラム要素は、AST に一意の ID(UID) を持つノードとして保存されます。参照は実際のポインター(UID への参照)に基づいています。相互参照は解析後に解決されるのではなくファーストクラスであるため、AST は実際には抽象構文グラフ(AGT)です。その後、プログラムは XML としてディスクに永続化されますが、このプロセスはユーザーに対して透過的です。
射影編集を使用する理由テキストエディターは十分ではありませんか?
射影エディターでは解析が使用されないため、グラフ、数学表記、ダイアグラム、フォームなど、テキスト以外の表記をエディターで使用できます。これらの非テキスト表記はテキスト表記と同じ方法で処理されるため、簡単に組み合わせることができます。テーブルをテキストソースに埋め込んだり、テキスト言語をテーブルセル内で使用したりできます。テキスト表記は、ボックス内またはダイアグラムの接続ラベルとしても使用できます。
異なる言語を組み合わせると、ほとんどの文法形式が構成で閉じられないため、パーサーベースのシステムでは結果の言語があいまいになる可能性があります。射影システムでは、これは起こり得ません。言語の任意の組み合わせは構文的に有効です(セマンティクスは別の問題ですが)。
解析された言語の代わりにプロジェクティブエディターを使用する主な利点は何ですか?
プロジェクティブエディターは、コード操作において抽象構文木(AST)に重要なロールを与えます。コードは AST 形式で永続化、バージョン管理、リファクタリング、編集されるため、テキストからモデルへの変換とその逆の変換を繰り返す必要がありません。AST はコードのはるかに豊富な表現であり、あいまいさを回避します。AST は、言語設計者が望む任意の方法で編集するために画面に射影できます。プロジェクティブエディターを使用すると、言語で次のことができます。
解析不可能な表記を許可します。これにより、テーブル、イメージ、GUI コンポーネントが言語構文の一部になる可能性があります。AST はこのような言語要素に簡単に対応でき、射影エディターは必要に応じて画面上に任意のグラフィック形状を描画できます。
異なるベンダーによって開発された可能性のある複数の言語を 1 つのコードに結合します。パーサーが解決できない可能性のあるあいまいさは、射影エディターにとっては問題ではありません。
状況依存および位置文法を処理します。
フォームのような表記法を提供する – 非プロの開発者やドメインの専門家を対象とする場合、通常は、ユーザーが値を指定する必要がある「移動」部分を明確に示す厳密な表記法を提供する言語を使用することが優先されます。
1 つの言語に複数の表記法を提供する – ユーザーは、それぞれが異なるタスクに適した複数の異なるエディターを使用して、同じコードを表示および編集できます。一部のエディターは、グラフィックまたは表形式の表記を使用する場合があり、他のソースからの追加情報を表示する場合もあれば、視覚的な混乱の量を減らす場合もあります。それでも、すべてを同じコード(AST)に関連付けることができます。開発者は、特定のタスクに最適なコードの視覚化を選択できます。
テキストと組み合わせてダイアグラム式表記を使用します。たとえば、電気回路は、スキームの個々の要素に起因するコードが埋め込まれたグラフィカルスキームとしてモデル化されていると考えてください。
テキストでない場合、バージョン管理との統合はどのように機能しますか? バージョンをマージしたり、ファイル間の違いを表示したりできますか?
インフラストラクチャの統合には特別なサポートが必要です。具体的な構文は純粋なテキストではないため、一般的な永続化形式を使用する必要があります。差分およびマージ機能用に特別なツールを提供する必要があります。MPS は、SVN や Git などのバージョン管理システムとの統合を提供し、具体的な投影構文を使用して、ツールの差分およびマージ機能を処理します。すべてのプログラム要素には UUID があるため、移動は削除 / 作成と区別できます。これにより、差分とマージでより使いやすいセマンティクスが提供されます。次の図は、MPS の VCS がどのように見えるかを示しています。

射影エディターに慣れるのにどのくらい時間がかかりますか?
MPS プロジェクショナルエディターを初めて使用すると、テキストエディターとは異なるため、奇妙に感じることがあります。私たちの広範な UX 調査によると、ほとんどのユーザーが射影エディターに慣れて不快感を感じるまでには数日かかります。実際、多くのユーザーは、MPS の編集方法を好むと主張しています。これは、多くのコンテキストで、構文ツリーに基づいて要素を選択しているためです。
MPS の詳細
MPS はどのようにライセンスされていますか?
MPS は、Apache 2.0 ライセンス(英語)のオープンソース製品です。
MPS をすぐに使い始めるにはどうすればよいですか?
ファストトラックチュートリアルの使用を開始することをお勧めします。MPS の簡単な紹介については、クイックスタートチュートリアル(英語)をお試しください。
コミュニティはどのくらい活発ですか?
コミュニティは他のテクノロジーに比べて小さいですが、非常に活発です。何年にもわたって、コミュニティのメンバーはさまざまな方法で関わってきました。
MPS ユーザーがプロジェクトを発表し、MPS チームがその進捗状況と計画について話し合うコミュニティミートアップを開催します。2018(英語)、2019(英語)、2021(英語) からの以前のイベントを参照してください。
MPS.rocks(英語) は、コミュニティによって作成および保守されている素晴らしい MPS 拡張機能、ライブラリ、リソースの厳選されたリストです。
MPS は、さまざまな学術論文、書籍、会議のトピックとなっています。アカデミアの MPS(英語) ページをチェックして、行われているすばらしい作業のいくつかを参照してください。
Slack ワークスペース(英語)に参加して、コミュニティの他のメンバーとやり取りしたり、質問を投稿したりすることはいつでも大歓迎です。
拡張するために、MPS にはすぐに使用できる言語が含まれていますか?
MPS には、Java(バージョン 1.8)と XML の実装がすぐに付属しています。AC 実装は利用可能であり、公式パートナー itemis(英語) によってサポートされています。他の言語は、サードパーティによってオープンソースプロジェクトとして開発されています。詳細については、MPS 言語リポジトリ(英語)ページを参照してください。
言語リポジトリはありますか?
言語は jar ファイルとしてパッケージ化して配布できるため、ライブラリと同じように言語を共有できます。MPS 用の言語プラグイン (JetBrains およびサードパーティによって提供) は、JetBrains マーケットプレイスで公開されています。
ドキュメントの MPS 言語リポジトリ(英語)ページ
MPS に関する本はありますか?
はい、過去数年間に多くの本や学術論文が執筆され、出版されてきました。それらすべてを収集して、アカデミアページの MPS(英語) に表示しようとしています。
MPS で成功したプロジェクトはありますか?
MPS は、電気工学、保険、税法、ヘルスケアなど、さまざまな業界で使用されている成熟した製品です。シーメンス、ボッシュ、キャノンなどの企業は、MPS を使用して、それぞれのドメインに強力な DSL を実装しています。
詳細については、当社 Web サイトのケーススタディを参照するか、年次コミュニティミートアップ(英語)のビデオを参照してください。
MPS はどの程度スケーリングしますか?
mbeddr(英語) によって実行された負荷テストでは、シングルルート要素(従来の IDE のファイルに相当)は、深刻なパフォーマンスの問題なしに 4.000 行まで上がる可能性があります。彼らはまた、最大 100.000 行の C コードを備えた C システムが正常に機能するはずであることを測定しました。
MPS はオープンソースですが、それでも JetBrains によって開発されています: それはどのように機能しますか?
JetBrains は MPS プロジェクトの主なコントリビューターであり、10 人以上のフルタイムの開発者を提供しています。ただし、フォーラム (英語) を通じて共有されたアイデア、トラッカー(英語)でのリクエストとバグレポート、またはコード(英語)へのパッチのいずれかとして、外部からの貢献を歓迎します。定期的なコントリビューターは、プロジェクトのコミッターになり、プロジェクトの計画と実装のプロセスに参加できます。
Java コードを MPS にインポートできますか?
MPS は、Java の相互運用性を容易にします。例: MPS の任意の Java ライブラリを問題なく使用できます。同じプロジェクトで Java コードと MPS コードを組み合わせて使用できるため、MPS コードで Java コードを表示して使用できます。逆に、Java では MPS から生成されたコードを使用できます。また、MPS は、MPS に貼り付けた Java コードのスニペットを解析し、有効な BaseLanguage コードに変換できます。
どの Java バージョンがサポートされていますか?
MPS は JDK 17 以降で実行できます。詳細については、MPS Java との互換性ページを参照してください。
Eclipse の統合はどうですか?
技術的には実現可能ですが、現時点では Eclipse との統合は積極的に進められていません。MPS ユーザーの関心と、そのような活動に貢献または後援する機能に応じて、JetBrains は Eclipse 統合の実装を検討する用意があります。
どうすればサポートを受けることができますか?
サポートを受けることができる MPS コミュニティフォーラム(英語)と Slack コミュニティ(英語)があります。バグの送信と追跡には、課題追跡システムを利用(英語)できます。大事なことを言い忘れましたが、MPS を実際に体験した人から専門的なサポートを受けることもできます。
MPS は他の言語のワークベンチと比べてどうですか?
他のほとんどの言語ワークベンチとは異なり、MPS はプロジェクティブエディターを使用します。
また、MPS は、言語構造、構文、型システム、制約、リファクタリング、変換、コード生成をすべて 1 つの統合パッケージでサポートするため、最も包括的なシステムの 1 つです。
より良いアイデアを形成する唯一の方法は、さまざまな言語のワークベンチを試して、特定のプロジェクトのコンテキストでそれぞれの機能と利点を検討することです。そうは言っても、したいかもしれません:
MPS について発表(英語)された学術論文のいくつかを参照してください。
経験豊富なコンサルタントに連絡してください。
関連ページ:

MPS へのファストトラック
ようこそ ! このチュートリアルは、MPS にまったく慣れておらず、MPS の風景を見ながらのガイドツアーを好む開発者のために特別に設計されます。次に進むべき場所を示す明確なマークに従って、殴打された道を一度に 1 歩歩きます。情報は、より単純な概念からより複雑な概念へと進み、旅の終わりに MPS を理解し、あなたのプロジェクトでそれを効果的に使用できるようになるように構成されています。私達は MPS を学ぶことよりも世界に簡単な作業があることを認めます。言語設計は複雑な領域であり、射影編集は慣...

MPS Java との互換性
構成:環境設定ウィンドウの Java コンパイラー構成タブには、プロジェクトのバイトコードバージョンという 1 つの設定しかありません。この設定は、MPS によってコンパイルされたすべての Java クラスのバイトコードバージョンを定義します。これらのクラスには、言語の側面から生成されたクラス、ランタイムソリューションのクラス、サンドボックスソリューションのクラスなどがあります。デフォルトでは、バイトコードのバージョンは JDK Default に設定されています。これは、コンパイルされたクラス...

MPS スクリーンキャスト
このページでは、JetBrains TV の MPS チャンネルで公開された MPS 関連のスクリーンキャストを一覧表示して分類しています。カスタマーストーリー:誰がどのように MPS を使用します。MPS の MPS の使用方法を紹介しています。なぜ JetBrains MPS- MPS についての概要ビデオ。誰が気にするべきか、なぜか。音声メニュー IDE- MPS ができることのより徹底的な例。音声メニュー定義言語は、MPS の可能性を説明するためのサンプルドメインとして使用されています...

基本的な考え方
この章では、基本的な MPS の概念であるノード、概念、言語について説明します。これらは、MPS の仕組みを正しく理解するための鍵となります。これらはすべて、他の要素と組み合わせることで初めて意味を成すため、すべて一緒に説明する必要があります。このセクションの目的は、各要素の本質を説明することです。詳細については、ノード、概念 (構造言語)、言語 (プロジェクト構造) に関するセクションを確認することを検討してください。抽象構文木 (AST):MPS は、テキスト形式を避けることによって他の多く...