MPS 2020.3 ヘルプ

よくある質問 (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 つの方法があります。1 つ目は、DSL コードと通常のコードを別々のファイルに保存します。次に、DSL コードは、コードジェネレーターによってプログラミング言語コードに変換されます。または、プログラムがドメイン固有コードをロードして実行します。分離された汎用言語(GPL)と DSL コードを使用するこの最初のアプローチは、外部 DSL と呼ばれます。SQL を外部 DSL の例と考えてください。別のアプローチでは、DSL コードと汎用コードを同じプログラムファイルに混合し、DSL コードとプログラミング言語コードをより緊密に統合します。DSL は GPL の文法とパーサーを再利用し、ホスト言語の利用可能な拡張オプションを利用します。一部の GPL は、他の GPL よりも拡張に適していることに注意してください。
状況に応じて、両方のアプローチが理にかなっている可能性があり、MPS は両方をサポートします。

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

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

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

核となる考え方は、ソフトウェアを開発するときに 1 つの言語を使用するだけでなく、各タスクに最適な言語を使用することです。表面上同様のアプローチを提唱する多言語プログラミングとは対照的に、言語指向プログラミングは、開発者が独自の DSL を構築するか、アプローチの一部としてドメイン固有の概念で既存の言語を拡張することを明示的に奨励します。新しい言語の開発は、ソフトウェア開発の不可欠な部分になるべきであり、Ü bergeeks に任せるべきではありません。これを実現可能にするために、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 は、本質的に(Java 7 と 8 の構文については、オプションの拡張機能付き)Java 6 プラスなどの閉鎖、コレクション API、正規表現、拡張メソッド、タプルとビルダーのサポートなどのカスタム拡張の山である BaseLanguages と呼ばれる言語、付属しています。この言語は、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 の拡張機能が付属しています。さらに、mbeddr(英語) プロジェクトのデシジョンテーブル(英語)の例で示されているように、MPS はテーブルをサポートしています。スイングウィジェットをエディターに埋め込むこともできます。MPS 3.1 リリースでは、すぐに使用できるグラフィック表記のサポートが追加されました。

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

MPS は、もともと JetBrains の社内プロジェクトとして開発されたものであるため、JetBrains にはいくつかのユースケースがあります。よく知られている例は mbeddr.com(英語) プロジェクトです。これは、組み込みソフトウェア開発用の拡張可能な C ベースの IDE を提供します。Siemens Healthcare、Oce Technologies、または Dutch Tax Office は、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 は、言語構造、構文、型システム、制約、リファクタリング、変換、コード生成をすべて 1 つの統合パッケージでサポートするという点で最も包括的なシステムです。現在のところ、メタエディット +(英語) などの他の代替手段は、文法構文のサポートを向上させ、Xtext(英語) は Eclipse の統合を向上させ、それを取り巻くコミュニティが大きくなっています。より詳細な比較を行うには、自分で決心し、自分のプロジェクトのニーズに照らしてすべての事実を考慮する必要があります。MPS のケーススタディを確認し、MPS について公開されて(英語)いる学術論文のいくつかを読み、経験豊富なコンサルタントに連絡することを検討してください

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

新しく改装された 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 は、テキスト形式...