MPS 2020.1 ヘルプ

よくある質問 (FAQ)

DSL、LOP、プログラミング

ここでは、MPS に関して最もよくある質問に対する答えを見つけることができます。

DSL とは何ですか? 「本物の」プログラミング言語とどう違うのですか。

DSL は特定の種類の問題に最適化された言語です。通常、Java、C、Ruby などの汎用言語よりも複雑さは少なくなります。DSL はチューリング完全ではないかもしれず、関心のあるフィールドについての事実だけを述べています。通常 DSL は、DSL が設計されているフィールドの専門家である人々と密接に連携して開発されています。多くの場合、DSL はソフトウェア関係者ではなく DSL が扱うドメインに精通しているプログラマではない人々によって使用されることを意図しています。そのためには、数学記号、テキスト表記とグラフィカル表記の組み合わせ、または DSL ユーザーを複雑な IDEA または Eclipse に晒さない単純な IDE を使用するなど、言語の表記とツールのサポートを非プログラマ向けに最適化する必要があります。

DSL の利点は何ですか?なぜ気にする必要がありますか?

DSL を使用すると、さまざまなメリットがあります。DSL を使用することの最も明白な利点は、言語と変換エンジンを入手した後は、DSL の対象となるソフトウェア開発の特定の側面での作業がはるかに効率的になることです。不機嫌そうな作業を手動で行います。比較的小さな DSL プログラムからトラック全体のコードを生成する場合、これは最も明白です。DSL プログラムから(解釈するのではなく)ソースコードを生成している場合は、ランタイムオーバーヘッドを支払うことなく * ドメイン固有の優れた抽象化 * を使用できます。これは、コンパイラーと同様にジェネレーターが抽象化を削除して効率的に生成できるためです。コード。ドメインと緊密に連携した言語でドメインの懸念を表現する方法がある場合は、作成したコードが実装の詳細に散らばっていないため、* 思考がより明確になります *。言い換えれば、DSL を使用すると、本質的なものと付随的な複雑さを区別することができます。ドメイン、抽象化、表記法が、ドメインの専門家(つまり、プログラマではない人)が自分たちを表現する方法と密接に連携している DSL は、技術とドメインの人々の間の非常に良い統合を可能にします。DSL と実行エンジンを使用すると、DSL コードで表現されたアプリケーションロジックは、ターゲットプラットフォームとは無関係になります。DSL を使用すると、作成される製品の * 品質 * が向上します。バグが減り、アーキテクチャへの適合性が向上し、保守性が向上します。これは、(不要な)自由度の排除、コードの重複の回避、繰り返し作業の自動化の結果です。ライブラリやフレームワークとは対照的に、DSL には言語を認識している * ツール *、つまり IDE が付属しています。これにより、ユーザーエクスペリエンスが大幅に向上します。コード補完、ビジュアライゼーション、デバッガー、シミュレータ、その他あらゆる種類の機能を提供できます。

DSL と通常のコードはどのように連携していますか?

従来のコードと DSL コードを統合する方法には、根本的に 2 つの異なる方法があります。最初のものは DSL コードと通常のコードを別々のファイルに保存します。DSL コードは、コードジェネレーターによってプログラミング言語コードに変換されます。あるいは、プログラムはドメイン固有のコードをロードして実行します。分離された汎用言語(GPL)と DSL コードを使用したこの最初のアプローチは、外部 DSL と呼ばれます。外部 DSL の例として SQL を考えてください。別の方法では、DSL コードと汎用コードを同じプログラムファイルに混在させることで、DSL コードとプログラミング言語コードとの間の統合が大幅に強化されます。DSL は GPL の文法とパーサを再利用し、ホスト言語の利用可能な拡張オプションを利用します。ある GPL が他のものより拡張に適していることをメンションする価値があります。
状況に応じて、どちらのアプローチも理にかなっており、MPS は両方をサポートしています。

伝統的に、DSL はホスト言語のメタプログラミング機能を使ってプログラミング言語コードに埋め込まれてきました。DSL の構造と構文は、DSL コードが埋め込まれる言語でコードを書くことによって定義されました。通常、IDE は DSL について知らなかったため、サポートを提供しませんでした(コード補完、カスタムエラーチェックなど)。MPS を使用すると、言語開発用の特殊な DSL と一緒に MPS フレームワークを使用して言語拡張を定義できます。IDE はそれらを知っているため、システムはドメイン固有の埋め込み言語に対して完全な IDE サポートを提供できます。

言語指向プログラミングとは

言語指向プログラミングという用語は、言語指向プログラミング: 次のプログラミングパラダイム(英語)と呼ばれる 2004 年の記事で、JetBrains の CEO であり MPS の「父」であるセルゲイドミトリエフによって作られました。他の人々は、通常は異なる名前で、関連するアプローチを考え出しました。主な例はチャールズシモニーと彼の意図的なプログラミングのアプローチであり、マーティンファウラーは彼の 2005 年の記事言語ワークベンチ: ドメイン固有言語用の Killer-App(英語) ?でアプローチを説明しています。

基本的な考え方は、ソフトウェアを開発するときに 1 つの言語を使用するだけでなく、各タスクに最も適した言語を使用することです。表面的には同様のアプローチを提唱するポリグロットプログラミングとは対照的に、言語指向プログラミングは開発者に独自の DSL を構築すること、またはアプローチの一部としてドメイン固有の概念で既存の言語を拡張することを明示的に奨励します。新しい言語を開発することはソフトウェア開発の不可欠な部分になるべきであり、ユーバーギークに任されるべきではない。これを実現可能にするために、MPS のような言語ワークベンチは言語指向アプローチの重要な要素です。

なぜ言語を拡張したいのですか?ライブラリは十分ではないですか?

ライブラリと言語拡張の間にはいくつかの違いがあります。言語拡張には独自の構文があります。MPS の射影エディターでは、この構文は任意のものにすることができ、拡張言語の構文によって制限されることはまったくありません。言語拡張にも独自の制約と型システムが付属しているため、IDE はエラーを静的に報告できます。より一般的には、MPS がサポートするように、言語拡張機能は IDE に完全に統合されています。コード補完、構文のハイライト、新しい言語構造のリファクタリングのサポートが得られます。最後に、言語拡張はコンパイル時変換によって実行され、目的のプログラミング言語コードに変換されるため、間接的な反映や間接的なスタックが課すような実行時のオーバーヘッドはありません。これは、リソースに制約のあるシステムをターゲットにしている場合は特に重要です。

投影編集

投影編集とは何ですか?

パーサーベースのアプローチでは、ユーザーはテキストエディターを使用してプログラムを表す文字シーケンスを入力します。次に、パーサーがプログラムの構文上の正確さをチェックし、文字シーケンスから抽象構文木(AST)を作成します。AST には、プログラムによって表現されたすべての意味情報が含まれています。つまり、キーワードと純粋に構文上の側面は省略されています。

プロジェクションエディターでは、このプロセスは逆に行われます。ユーザーがプログラムを編集すると、AST が直接変更されます。これは、すべての編集操作が AST の変更を引き起こす MVC パターンと似ています。次に、投影エンジンは、ユーザーが対話するための AST の表現をいくつか作成します。このアプローチは様々なグラフィカルエディターからよく知られています。たとえば、UML ダイアグラムを編集する場合、ユーザーは、「イメージパーサー」が絵を読んでそれを解析してから AST を作成するために、キャンバスにピクセルを描画することはしません。エンジンが理解するように、描くことができるものをあまりにも制限することでしょう。そうではなく、パレットからキャンバスにクラスをドラッグすると、エディターによって Class のインスタンスが作成されます。プロジェクションエンジンがダイアグラムをレンダリングします。この場合はクラスの長方形を描画します。ダイアグラムの意味を変えることなく、画面上の視覚要素を並べ替えることができます。

このアプローチは、テキストエディターでも機能するように一般化できます。すべてのプログラム要素は、AST に一意の ID(UID)を持つノードとして格納されています。参照は実際のポインタ(UID への参照)に基づいています。相互参照は解析後に解決されるのではなく最上級クラスであるため、AST は実際には最初から ASG(抽象構文グラフ)です。プログラムは XML としてディスクに永続化されますが、このプロセスはユーザーには見えません。

投影編集を使用する理由テキストエディターは十分ではありませんか?

投影エディターでは構文解析は使用されず、メカニズムは基本的にグラフィカルエディターのように機能するため、エディターではテキスト以外の表記法を使用できます。例:MPS はテーブルと簡単な図をサポートします。これらの非テキスト表記はテキスト表記と同じ方法で(おそらく他の入力ジェスチャーでも)扱われるため、簡単に混在させることができます。テーブルをテキストソースに埋め込むことができ、テキスト言語をテーブルセル内で使用できます。テキスト表記は、ボックス内や図の接続ラベルとしても使用できます。

別々に開発された言語を作成した後、ほとんどの文法形式は合成で閉じられないため、結果として生じる言語はパーサーベースのシステムであいまいになるかもしれません。投影システムでは、これは起こり得ません。どのような言語の組み合わせでも構文的には有効です(意味は別の課題です)。合成言語があいまいな場合は、プログラムの構築時にユーザーは曖昧さを排除する決定を下す必要があります。例:MPS で、同じエイリアスで 2 つの言語の概念が同じ場所にある場合、そのエイリアスを入力してもバインドされず、ユーザーはコード補完メニューから 1 つの選択肢を選択して手動で決定する必要があります。

解析済み言語の代わりに投影エディターを使用することの主な利点は何ですか

プロジェクションエディターは抽象構文ツリー (AST) にコード操作における重要なロールを与えます。コードは AST 形式で永続化、バージョン管理、リファクタリング、編集されるため、テキストからモデルおよびバックへの繰り返し変換が不要になります。AST はコードの表現がはるかに豊富で、あいまいさを避けられます。AST は、言語設計者が望む方法で編集するためにスクリーンに投影することができます。プロジェクションエディターであなたの言語は次のことができます。

  • 解析できない表記法(表、イメージ、GUI コンポーネント)は言語構文の一部になる可能性があります。AST はそのような言語要素に容易に対応でき、投影エディターは必要に応じて画面上に任意のグラフィック形状を描くことができます。

  • 異なるベンダによって開発される可能性がある複数の言語を 1 つのコードにまとめます。パーサが回復するのに課題があるというあいまいさは、プロジェクションエディターにとって課題ではありません。

  • 文脈依存文法と位置文法を処理する

  • フォームに似た表記法を提供する - 通常、非専門の開発者やドメインの専門家を対象とする場合、ユーザーが価値を提供すると思われる「動く」部分を明確に示した厳密な表記法を提供する言語を使用するのが好ましいでしょう。

  • 単一の言語に複数の表記法を提供 - ユーザーは、それぞれ異なるタスクに適した複数の異なるエディターを使用して、同じコードを表示および編集できます。グラフィカルまたは表形式の表記を使用しているエディターや、他の情報源からの追加情報を表示しているエディター、視覚的な雑然とした量を削減しながらもすべて同じコード(AST)に結び付けられているエディターがあります。開発者はこのように与えられたタスクのために cdd の最も良い視覚化を選ぶことができます。

  • テキストと組み合わせて図表表記法を使用する - たとえば、回路図の個々の要素に起因するコードの埋め込まれた部分を含むグラフィカルな図式としてモデル化された電気回路を考える

テキストではない場合、バージョン管理との統合はどのように機能しますか?差分、マージ?

インフラストラクチャの統合には特別なサポートが必要です。具体的な構文は純粋なテキストではないため、一般的な永続化形式を使用する必要があります。diff と merge には特別なツールを提供する必要があります。MPS は、SVN や Git などの通常の VCS システムとの統合を提供し、具体的な投影構文を使用して、ツールでの差分とマージを処理します。すべてのプログラム要素には UUID があるため、移動は削除 / 作成と区別でき、差分とマージでより使いやすいセマンティクスを提供することに注意してください。下の写真は例を示しています。

mps diff

エディターに慣れるまでどのくらいかかりますか?

2010 年初頭には、トレーニングの一環として実験を行いました。これまで MPS を使用したことのない 10 人が MPS 開発の原則を教えられました。2 日後、編集の経験は最初は少し変わっていましたが、実際のところエディターはテキストエディターより悪くはないということに、全員が同意しました。それは単なる違いです。2 日後、それに慣れ、不快感を感じません。実際、驚くことではありませんが、MPS による編集方法を好むと主張する人もいます。これは、多くの場合、構文ツリーに基づいて要素を選択 / 変更 / 削除する方法です。この点でベースの IDE。

MPS の詳細

MPS はどのようにライセンスされていますか?

MPS は Apache 2.0 ライセンス(英語)でライセンスされています。Apache 2.0 は非常に寛大で、基本的に好きなコンテキストでシステムを使うことを可能にします。のような会社。レラクシー(英語)は MPS を使って有償アプリケーションを構築しました。

拡張できるように、どの言語が既に MPS に含まれていますか?

MPS には、BaseLanguage と呼ばれる言語が付属しています。これは、本質的に Java 6(Java 7 および 8 の構文のオプション拡張機能)と、クロージャー、コレクション API、正規表現、拡張メソッド、タプル、ビルダーサポートなどのカスタム拡張機能の山です。この言語は、MPS の言語開発の多くの側面にも使用されます。その場合、プログラムツリーを操作するためにいくつかの追加の拡張機能を使用します。MPS には、使用および拡張可能な XML の実装も付属しています。追加のベース言語として利用可能な C の実装もあります。mbeddr.com(英語) を参照してください。他の言語はサードパーティによって徐々にオープンソースプロジェクトとして開発されています(例:JavaScript(英語))。詳細については、MPS 言語リポジトリ(英語)ページを参照してください。

言語リポジトリはどこかにありますか?

言語は jar ファイルとしてパッケージ化および配布できるため、ライブラリと同じように言語を共有することを妨げるものはありません。MPS および IntelliJ IDEA 用の少数の言語プラグイン(JetBrains およびサードパーティの両方)が JetBrains プラグインリポジトリで公開されています。

MPS に関する本はありますか?

はい、あります:

MPS に新しい基本言語を追加するのにどのくらいの労力がかかりますか?

新しい言語を追加するのにかかる時間は、明らかに言語の複雑さに大きく依存します。MPS に精通していれば、数分から数時間で小さな DSL を追加できます。MPS に追加された任意の言語は、ベース言語として使用でき、ユーザーまたは他のユーザーが簡単に拡張できます。しかし、おそらく知りたいことではありません。実際のプログラミング言語を新しいベース言語として追加するのは少し手間がかかります。なぜなら、汎用言語は一般にかなり大きいからです(Lisp のような追加が簡単な言語を除く)。良いベンチマークは、最近 mbeddr.com(英語) の人々によって実装された C ベース言語です。彼らは、MPS ですべての C を実装するために、2 〜 3 人月の作業を報告しました。

投影がそれほどクールだとしたら、テキスト以外の表記法はいつできますか。

MPS は、パーサーベースのシステムでは不可能な表記法を既にサポートしています。例:MPS には、分数バーや大きな数学記号(大きな記号記号など)を実行できる BaseLanguage の拡張機能が付属しています。さらに、MPS は、mbeddr(英語) プロジェクトの決定テーブル(英語)の例で示されているように、テーブル(英語)をサポートしています。Swing ウィジェットをエディターに埋め込むこともできます。MPS 3.1 リリースでは、すぐに使用できるグラフィカル表記のサポートが追加されました。

MPS で成功したプロジェクトはありますか?

MPS はもともと JetBrains の社内プロジェクトとして開発されたため、JetBrains にはいくつかのユースケースがあります。よく知られている例は mbeddr.com(英語) プロジェクトで、組み込みソフトウェア開発用の拡張可能な C ベースの IDE を提供します。Siemens Healthcare、Oce Technologies、またはオランダ税務署は、MPS ベースの DSL を本番に成功させた企業の他の例です。
MPS は、電気工学、保険、税法、医療などのさまざまな業界で徐々に採用され、それぞれのドメインに強力な DSL を実装しています。

MPS の大きさは?

mbeddr(英語) の人々は、少し負荷テストを行いました。彼らは、単一のルート要素(従来の IDE のファイルに相当)が深刻なパフォーマンスの課題なしに 4.000 行に簡単に到達できることを発見しました。また、最大 100.000 行の C コードを含む C システムが正常に動作することを測定します。

MPS はオープンソースですが、それでも JetBrains によって「所有」されています: え?

はい、JetBrains は 10 人以上の常勤開発者を提供するプロジェクトの主要なコントリビューターです。ただし、フォーラム(英語)でアイデアが細かく分けられたり、トラッカー(英語)でのリクエストやバグ報告が行われたり、コード(英語)へのパッチが加えられたりすると、外部からの貢献を歓迎します。定期的なコントリビューターはプロジェクトのコミッターとなり、実装プロセスを計画するプロジェクトに参加できます。

Java コードを MPS にインポートできますか?

MPS は Java の相互運用性を容易にすることに懸命に取り組んでいます。例:MPS の Java ライブラリは問題なく使用できます。同じプロジェクト上で Java と MPS のコードを組み合わせて使用することで、MPS のコードが Java のコードを参照して使用できるようにすることができます。Java では、MPS から生成されたコードを使用できます。また、MPS は、MPS に貼り付けることにした Java コードの断片を解析して、有効な BaseLanguage コードに変換することもできます。

どの Java バージョンがサポートされていますか?

MPS は JDK 1.8 以降で実行できます。詳しくは MPS Java との互換性のページを参照してください。

Java IDE 統合はどうですか。

現在、MPS はスタンドアロンのアプリケーションで、Java で実装されているため、すべての主要プラットフォームで動作します。3.0 バージョンでは、MPS は IntelliJ IDEA に言語をデプロイするためのサポートを追加しました。言語 * 開発 * は MPS スタンドアロンアプリケーションでまだ行われていますが、言語 * 使用 * は IntelliJ IDEA で可能になりました。これにより、MPS ベースの DSL を Java や他のアプリケーションに統合する際の選択肢が大幅に増えます。

Eclipse 統合はどうですか?

技術的には可能ですが、Eclipse との統合は現在積極的に追求されていません。MPS ユーザーの関心と、そのような活動に貢献または支援する機能に応じて、JetBrains は Eclipse 統合の実装を検討する準備ができています。

どうすればサポートを受けることができますか?

サポートが得られる MPS コミュニティフォーラム(英語)があります。バグの送信と追跡には、課題追跡ツール(英語)を使用できます。最後になりますが、MPS を実際に実際に使用した経験のある人から専門的なサポートを受けることもできます。

MPS は他の言語のワークベンチと比べてどうですか?

もちろん、これを客観的な方法で言うのは難しいですが、試してみましょう:-) 他のほとんどの言語ワークベンチとは異なり、MPS はプロジェクションエディターを使用します。このアプローチの利点については、上記の FAQ で既に説明しました。また、MPS は、言語構造、構文、型システム、制約、リファクタリング、変換、コード生成をすべて単一の統合パッケージでサポートするという点で最も包括的なシステムです。現在のところ、メタエディット +(英語) などの他の代替手段は、文法構文のより良いサポートを提供し、Xtext(英語) は、Eclipse 統合をより良く提供し、それを取り巻くより大きなコミュニティを持っています。より詳細な比較を行うには、自分の心を決め、自分のプロジェクトのニーズに照らしてすべての事実を考慮する必要があります。詳細については、言語ワークベンチのコンテスト(英語)を参照してください。また、MPS のケーススタディを確認し、MPSついて公開されて(英語)いる学術論文(英語)の一部を読んで、経験豊富なコンサルタントと連絡を取ることも検討してください

MPS の使用方法はどうすればわかりますか?

新しく改装された MPS ページを学ぶを参照してください。それは概要記事への論理的に組織された参照、MPS 基本的で先進的な概念に関するチュートリアル、ならびにスクリーンキャストと興味深い事例研究へのポインターを保持します。