MPS 2019.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の「父親」であるセルゲイ・ドミトリエフ(英語)によって造られました。他の人々は、通常は異なる名前で、関連するアプローチを考え出しました。主な例はCharles Simonyiと彼の意図的プログラミングアプローチであり、Martin Fowlerは彼の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を持っているため、移動はdelete / createと区別することができ、diffとmergeのためにより有用なセマンティクスを提供します。下の写真は一例です。

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に追加された言語はすべて基本言語として使用でき、あなたや他の人が簡単に拡張することができます。しかし、おそらく知りたかったことではありません:)新しいベース言語として* real *プログラミング言語を追加することはもう少し作業が必要です。汎用言語は通常かなり大きいからです(Lispのような言語は例外ですが)。-)).最近mbeddr.com(英語)によって実装されたCベース言語が、MPSでCのすべてを実装するための作業を2〜3人月実施したことを報告しています。

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

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

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

MPSはもともとJetBrainsの社内プロジェクトとして開発されたため、JetBrainsにはいくつかの使用例があります。よく知られている例はmbeddr.com(英語)プロジェクトです。これは、組み込みソフトウェア開発のための拡張可能なCベースのIDEを提供します。Siemens Healthcare、Océ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コミュニティフォーラム(英語)があります。バグの送信と追跡には、issue tracker(英語)が利用可能です。大事なことを言い忘れましたが、MPSを実際に体験したことのある人からもプロのサポート(英語)を受けることができます。

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

客観的に言っても、これは言うまでもないことですが、試してみましょう。-)他のほとんどの言語ワークベンチとは異なり、MPSは投影エディターを使用します。上記のFAQでこのアプローチの利点については既に説明しました。また、MPSは、言語構造、構文、型システム、制約、リファクタリング、変換、およびコード生成をすべて単一の統合パッケージでサポートするという点で最も包括的なシステムです。今のところ、メタエディット+(英語)のような他の選択肢はグラフィック構文をよりよくサポートし、Xtext(英語)はより良いEclipse統合を提供し、それを取り巻くより大きなコミュニティを持っています。より詳細な比較のために独自の決心をしなければなりません。そして独自のプロジェクトのニーズの文脈ですべての事実を考慮しなければなりません。さらに学ぶために言語ワークベンチの競争(英語)を参照してください。MPSのケーススタディ(英語)を調べたり、MPS(英語)ついて発表(英語)された学術論文(英語)を読んだり、経験豊富なコンサルタント(英語)と連絡を取ったりすることを検討することもできます。

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

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

最終更新日: 2019年6月7日