MPS 2019.2ヘルプ

よくある質問 (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を持っているため、移動は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に追加された任意の言語は、ベース言語として使用でき、ユーザーまたは他のユーザーが簡単に拡張できます。しかし、おそらく知りたいことではありません。実際のプログラミング言語を新しいベース言語として追加するのは少し手間がかかります。なぜなら、汎用言語は一般にかなり大きいからです(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基本的で先進的な概念に関するチュートリアル、ならびにスクリーンキャストと興味深い事例研究へのポインターを保持します。

最終更新日: 2019年8月30日