ドメイン固有言語とは何ですか?誰かそれを使っていますか?そして、どのように?


107

私はある種のイントロを探していて、誰かがそれを使用したかどうかを確認していると思います。それを使用することの特別な利点はありますか?

ウィキペディア:

ドメイン固有言語(DSL)は、特定の問題ドメイン、特定の問題表現手法、および/または特定のソリューション手法に特化したプログラミング言語または仕様言語です。

誰かがあなたがそれをどのように実装したか、または特定のシナリオでどのように役立つかについて、具体的な例を誰かに与えることはできますか?


実際、ドメイン固有の言語は、プログラミングにおいて明確に定義された意味を持つ用語です-ウィキペディアの記事をチェックしてください
1800情報

以下で述べるように、DSLは1つの言語ではなく、特殊目的言語のクラス全体の名前です。
dmckee ---元モデレーターの子猫

RはDSLと言えるでしょうか?
Srikar Doddi、2009年

2
それの端に、しかし私はしません。Rはすべての汎用構造を持ち、広範囲の計算に使用されます。数値の計算と統計は、非常に狭い領域ではありません。それは定義の良いテストです。
チャーリーマーティン

回答:


114

ドメイン固有言語は、特定のドメインまたは一連の問題に対処するために作成された言語です。ソフトウェアビルドを記述するためのmake、ant、rake、言語構築のためのlexxやyaccなど、それらはたくさんあります。近年では、それらを組み合わせて構築を容易にするために、それらが人気を博しています。これらの中で最も重要なのは、Rubyの人気が高まっていることです。Rubyには、新しいDSLを簡単に構築できるいくつかの機能があります。

マーティン・ファウラーは、ここにあるように、アイデアの大きな支持者です


3
Rubyには、新しいDSLを簡単に作成できる機能がありますか?
Lernkurve 2012

2
@Lernkurve-Rubyにはメタプログラミングがあり、それが役立ちます。rubylearning.com/blog/2010/11/23/...
ジェームズ・ブラック

@CharlieMartin「グルーヴィー」について教えてください。どのタイプの言語ですか?ここでアシストを知りたいのですが..
G dangi '27 / 07/27

2
Groovyは、JVMで実行されるスクリプト言語です。基本的には、Rubyに対するJavaの回答を意図しています。汎用言語ですが、DSLの作成に使用できます。docs.groovy-lang.org/docs/latest/html/documentation/…–
チャーリーマーティン

1
Gradleのグルーヴィーを追加したいと思います。間違いがない場合は、ビルドを説明する独自の言語があります。
ネオンワージ2016

67

DSLは、より一般的なプログラミング言語で記述された関数の過度に複雑な引数と考えることができます。実際のプログラミング言語はDSLコードを解析して何かを行います。通常、DSLコードは、やりたいことだけに焦点を当てており、大規模なシステムではその方法がわかります

DSLの例には、すべてのクエリ言語(SQL、XPathなど)、すべてのテンプレート言語(Django、Smartyなど)、シェルスクリプト、特にツイルなどのコマンド、コマンド駆動のWebブラウザー(主に自動テストに使用)が含まれます。 )、データストレージおよび交換言語(XML、YAMLなど)、およびLaTex、HTML、CSSなどのドキュメント言語。

TCLやLispのような非常に柔軟な構文を持つ一部の言語は、DSLを直接言語に組み込みます(可能な場合)。言語の大部分は文字列を使用し、通常は外部ファイルからロードされます。

それらを使用することの特別な利点はありますか?意図した目的でそれらを使用することは、DSLとは考えずにSQLまたはHTMLを使用している(私は推測する)のと同じように、知らないうちにそれらに目を向ける点で非常に有利です。

あえて言うと、あなたが必要とするかもしれないあらゆる種類のアプリケーションのために十分なDSLがそこにあるということです。ほとんどの場合、独自の方法を学ぶ必要はありません。


1
おかしいのに十分な、あなたはリストは私が考える最初のものではありませんでした1例:正規表現
CoffeeTableEspresso

12

(問題の核心に対処する)

初めてDSLをどこかで見たとき、その定義を「ドメイン固有の言語」として見たと思います。これは、今まで聞いたことがなかった具体的で具体的な言語と思いましたが、そうではありません。特定のアプリケーション領域に合わせて調整。

皮肉なことに、「ツールコマンド言語」としてTCLについて聞いたばかりの場合、DSLのように、さまざまなツールには多数のTCLがあると思うかもしれませんが、特定のスクリプト言語の特定の名前です。


10

特定のドメインの問題を解決するのに適した言語だと思います。ルール処理言語またはサービス記述言語の可能性があります。

ドメイン固有言語(DSL)の反対は、汎用言語です。


10

すべてがDSLです...

アセンブラー:MOV R1からR2
コンパイラー:割り当てステートメント-A = A + 1、条件-IF(TRUE)...、ブランチ-RETURN
HTML:...ネストされた構造を記述
TCP / IP:記述/変換アドレス
PDF:紙のテキスト/画像配置の
説明フォント:文字の説明

特定のプロセスを説明するために使用する言語はすべてDSLです。残念ながら、最も基本的なプロセスを説明するためにドメイン固有の言語が不足しているため、すべてのことを説明するために必要ないくつかの言語を使用しています。「私のウェブサイトのすべてのhtmlファイルを圧縮する」には、3行または4行の300行を完了する必要があります。

DSLを構築するには、覚えておくことができ、ドキュメントを必要としないプロセスを説明するために必要な最小文字数を決定します。速度と使いやすさが主要な設計基準であることを忘れないでください。構文解析は非常に高速で、使用する構文は問題ありません。ほとんどの場合、構文として自然言語を使用します。「月初に従業員に支払う」ですが、ドメイン固有のものは、ドメイン固有のものであり、最適な構文を決定します問題に適合します。

便利かもしれないが、データ(XML)の定義に使用されたHTMLなどの問題に適合しない他のソリューションの使用は避けます。CSVは非常に便利で、ほとんどの問題に適合します。JSONは使いやすさの部分に適合しません。CSVがほとんどの問題で機能していれば、不必要な複雑化を追加するのはやり過ぎです。私たちはDSLにEXCELをたくさん使用します。これは、ツリー構造やメニューなどの65Kから100万行未満の小さな問題を説明するのに最適です。列Aはレベル、他の列はアイコン、色、ラベルなどです(EXCELは編集可能なCSV)。

HTMLはページレイアウトの問題を実際には解決しないことがわかったので、HTMLを削除して、適切なDSLを定義しました。ページ上で、HEADER、BODY、FOOTER、LEFT / RIGHT MARGINS、およびLEFT / RIGHT FULL MARGINSの6つの領域を定義しました。次に、ページジェネレーターにタイトルバー、ステータスバー、メニュー、テーブル、フォームなどを特定のセルに追加するように指示できます。これらの各セルは、行と列に任意の深さに分割できます。ページレイアウトは、どのスタイルでも数秒かかります。

BODYには従業員のテーブルが含まれています
HEADERにはタイトルバーのキャプション「Hello World」が含まれており、Collins Softwareにログインしています

メニューDSLはページレイアウトDSLに適合しないため、メニュー用に独自のDSLを作成しました。

リソースMy Main Menu
* define:menu、m、Level、Label、Icon、Action;
m、0、file;
m、1、open、open.gif、Dialog Open File;

それぞれの問題は固有であり、コンピューターは任意の形式を使用できます。DSLはそのために設計された人間です。したがって、人間が理解できるようにし、DSLが入力できるようにし、実際の単語から言語を作成します。なぜなら、それは私たちが説明している実際の人、場所、物事です。


8

DSLは、非プログラマーが使用する言語を開発するための良い方法です。たとえば、会社の金融関係者向けのDSLがある場合、仕様に合わせてプログラミングするのではなく、やりたいプログラムを書かせるだけです。次に、遅すぎる場合は、彼らが書いたものを彼らが望むように機能させることができます。コンパイルされた言語でそれを書いてスピードアップします。


5

上手!上記で説明したことはたくさんあります。私のような誰かが理解するように、私はこれをはるかに簡単な方法で説明しようとします。

汎用言語は広範な目的で使用されるため、DSLは特定のドメインに対してのみ作成されます。HTMLやCSSのように。

ある人またはあなたの親友だけが理解でき、他の誰も理解できないような文書に指示を書いたかどうかを言うことができます。それからそれはDSLかもしれません。しかし、多くの人々が理解し、従うことができるような言葉で説明を書いた場合、これはDSLではありません。

コンピュータのシリアルポートを介して操作できるユーザー用のスイッチボードを作成しました。ユーザーはそのボードで実行できるプログラムをそのボード上で実行したいとし、それに応じてリレースイッチがオン/オフされます。だから私はいくつかの指示を書いて、ユーザーにこれらの指示に従ってそのボードをプログラムするように言いました。これはDSLの例です。私は新しい言語を発明したのではなく、マイクロコントローラーがEEPROMから読み取り、それに応じて解析し、特定のタスクを実行できる一連の文字列を作成しました。


4

DSLを使用する理由を説明する簡単なブログ投稿を書きました。

ドメイン固有言語(DSL)を使用したい

その中で、DSLを次のように定義しています。

問題の特定のドメインに対するソリューションを伝達するために特別に設計された小さなプログラミング言語。

使用に関しては、Ant、構造化照会言語(SQL)、またはカスケードスタイルシート(CSS)を使用したことがある場合は、DSLを使用したことがあります。

私はDSLを使用するのが好きです。DSLは特定の問題空間に対するソリューションのコミュニケーションを促進することに重点を置いており、ドメインの専門家の参加を促進する方法でそうするためです。


3

ドメイン固有言語(DSL)の簡単な例の1つは、Webベースのアプリケーションと呼ばれる特定のドメインに使用されるHTMLです。


3

私はDSLを最近聞いたばかりですが、本当に役立つ例、LUNA(旧lunascript)を見つけました。

Asanaチームが独自のプラットフォーム用に作成したカスタムメイドのプログラミング言語/フレームワークです。

さらに私が見つけたように、多くの企業は適切な競争上の優位性を生み出すために独自のフレームワークと言語を作っています、いくつかの例は:

  • AbApを使用したSAP
  • PeopleSoftとPeopleCode
  • Objective-Cを搭載したApple
  • FacebookはFBMLやFQLのようなものを持っています

これらは、これらのプラットフォームでの作業にほぼ排他的に使用するため、ドメイン固有です。

この回答が、概念を明確にするのに役立つことを願っています。


3
Objective-Cはドメイン固有の言語ではありません
boraseoksoon

それはまた、Appleによって(そしてそのために)作られたものではありません。
アレクサンダーロッサ2017

2

機械学習で使用されるDSLの例は、Pythonのpatsyです。 https

Rからの式DSLに基づいていますhttps : //stat.ethz.ch/R-manual/R-devel/library/stats/html/formula.html

https://cran.r-project.org/web/packages/Formula/vignettes/Formula.pdf

そして、ハドリーは彼の高度なRの本の素晴らしいセクションで、R / DSLを構築する方法を説明しています: http://adv-r.had.co.nz/dsl.htmlを

深層学習の分野がある程度安定したら(または今でも)、Apache MXnetプロジェクト内で同様のことが発生するのを見てみたいと思います。しかし、私はまだ提案ページでそのための提案を見ていません。


1

ドメイン固有の言語は、ドメインプロセスと知識を、特定の分野の概念とロジックを直接使用する言語で表現します。

コミュニティは確実に成長していますが、それでも他の「主流」のテクノロジーのレベルにはありません。

ほとんどの場合、DSLは企業内の生産性を向上させるために作成されているため、DSLは非公開にして結果/洞察を共有しません。

ここでは、スピーカーがJetBrains MPSを使用したDSLのいくつかの例を示し、射影編集のテクノロジーを使用した会議があります。https//vimeo.com/197381453


1

DSL-ドメイン固有の言語。ドメインとは何かを始めましょう-ドメインは、定義された領域、スコープです。このドメインはWebサイトの外観にすることができ、CSSと2番目のドメインはWebサイトの構造にすることができ、ここにHTMLがあります。

ただし、ドメインはCompany X Applicationにすることもできます。このドメインの範囲内で、いくつかの言語を作成できます。言語は意味しません-独自のグラマ、シンタックス、コンパイラー、またはランタイムを備えた完全なフレーバーのこと DSLは、ドメインの問題を解決するツールのリストにすぎません。

OOPとそのモデルを考慮して、ドメインオブジェクトをクラスとメソッドでオブジェクトの動作として表現します。そのような構造を作成し、これらのオブジェクトに動作を与えると、それらの概念を使用してコードを書くことができます。次の疑似コードの例を考えてみます。

cookie = async getCookie(cookieId)
user = async getUser(userId)
result async user.buy(cookie)
if (result.isError()) {
  error.showAlert("User has not enough money")
} else {
  confirmation.showSuccess("Cookie was bought")
}

上からどれほどの量がGPL(汎用言語)であり、どれだけ特定のドメイン用語とツールです。これは2つの組み合わせですが、すべてのコマンドはここではドメイン固有です。とは言っても、上記はドメインがアプリケーションxであるDSLで記述されていると言えます。

この例をさらに進めると、さらに抽象的なツールを作成し、ほとんどの場合それらのツールによって制御フローを実行することができます(これはより多くのFPですが、意味がわかることを願っています)。

waitForMany(getCookie(cookieId), getUser(userId)
  .andThen([cookie, user] -> user.buy(cookie))
  .andThen(showSuccess("Cookie was bought"))
  .whenError(showError("User has not enough money"))

ご覧のとおり、私はかなり抽象化でき、この抽象化を使用して制御フローを実行できました。そして、すべてがGPLに基づいており、GPLの範囲で動作します。

真実を明らかにするために、私たちはみなDSLを書いています。uが使用できるすべてのドメイン固有の抽象化は親切です。しかし、これらの抽象化のほとんどは完全な解決策ではないため、この単語をあまり頻繁に使用しないようにしています。しかし、ドメインを抽象化する一連のツールや機能がある場合、それらは一種のDSLを形成します。

DSLとは何か、たとえば、一連のルールを提供するフレームワークはDSLです。彼がReact開発者であると主張している人を見ると、ReactはまさにDSLであり、ネイティブWebプラットフォームを使用する代替手段であるため、彼はドメイン固有の開発者であることがわかります。既存のドメイン固有のツールから機能を構成できる場合は、DSLを使用して作成しています。Reactをさらに深く見て、このDSL:Dを使用していないすべての人に申し訳ありませんが、コンポーネントのセットを作成し、それらをビルディングブロックとして構成できます。そしてhurra!、DSLの上にDSLを作成しました。

申し訳ありませんが、ここではDSLを何度も繰り返しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.