web-dev-qa-db-ja.com

ドメイン固有言語とは何ですか?使用している人はいますか?そして、どのように?

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

ウィキペディア:

ドメイン固有言語(DSL) は、特定の問題ドメイン、特定の問題表現手法、および/または特定の解決手法専用のプログラミング言語または仕様言語です。

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

97
Srikar Doddi

ドメイン固有の言語は、特定のドメインまたは一連の懸念に対処するために記述された言語です。ソフトウェアビルドを記述するためのmake、ant、rake、または言語構築のためのlexxとyaccなど、それらの多くが存在します。近年、いくつかのものが組み合わされて構築しやすくなり、人気を博しています。それらの中で大きなものは、新しいDSLを簡単に構築できるいくつかの機能を備えたRubyの人気の高まりです。

here のように、Martin Fowlerはこのアイデアの大きな支持者です。

105
Charlie Martin

DSLは、より一般的なプログラミング言語で記述された関数の過度に複雑な引数と考えることができます。実際のプログラミング言語はDSLコードを解析してそれを処理します。通常、DSLコードはwhatしたいことだけに焦点を合わせ、より大きなシステムはhow =。

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

TCLやLISPなどの非常に柔軟な構文を持つ一部の言語では、可能であれば、DSLを直接言語に組み込みます。大部分の言語は、通常外部ファイルからロードされる文字列を使用します。

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

あなたが必要とするかもしれないどんな種類のアプリケーションに対しても十分なDSLがあることをあえて言うつもりです。ほぼ間違いなく、独自のコードの書き方を学ぶ必要はありません。

56
rgz

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

私が初めて見たのは [〜#〜] dsl [〜#〜] どこかとその「ドメイン固有言語」としての定義具体的には、今まで聞いたことのない具体的な言語ですが、特定のアプリケーション領域に合わせた言語の一般的な用語です。

皮肉なことに、 [〜#〜] tcl [〜#〜] について聞いたことがあれば、DSLのように、さまざまなツール用のTCLがたくさんあると思うかもしれません-しかし、いや、特定のスクリプト言語の特定の名前。

12
rndmcnlly

すべてがDSLです...

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

特定のプロセスを記述するために使用する言語はすべてDSLです。残念ながら、最も基本的なプロセスを記述するためのドメイン固有の言語が不足しているため、私たちが行うすべてを記述するために必要ないくつかの言語を使用しています。 「私のWebサイトのすべてのhtmlファイルを圧縮する」には、300または3行または4行の異なる言語の行が必要です。

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

便利かもしれないが、データ(XML)を定義するために使用されたHTMLなどの問題に適合しない他のソリューションの使用は避けます。 CSVは非常に便利で、ほとんどの問題に適合します。 JSONは使いやすさの部分に適合せず、ほとんどの問題でCSVが機能するのに不要な複雑さを追加するのはやり過ぎです。 ExcelはDSLによく使用されます。ツリー構造やメニューなど、65K〜1Mの行、列Aはレベル、他の列はアイコン、色、ラベルなど(Excelは編集可能なCSV)。

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

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

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

リソースマイメインメニュー
* define:menu、m、Level、Label、Icon、Action;
m、0、file;
m、1、open、open.gif、Dialog Open File;

それぞれの問題は独特であり、コンピューターは任意の形式を使用できます。DSLは人間によって設計されているので、人間が理解できるようにします。なぜなら、それは私たちが説明している実際の人々、場所、そしてものだからです。

9
Clif

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

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

9
Michael Damatov

DSLは、非プログラマーが使用する言語を開発するための良い方法です。たとえば、会社の財務担当者向けのDSLがある場合、仕様に合わせてプログラミングするのではなく、やりたいプログラムを作成させることができます。そして、遅すぎる場合は、彼らが書いたものを望み通りに動作させることができ、コンパイルされた言語で書いて速度を上げることができます。

8
James Black

DSLの使用が好きな理由を説明する短いブログ記事を書きました。

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

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

特定の問題領域のソリューションを通信するために特別に設計された小さなプログラミング言語。

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

DSLを使用するのが好きなのは、特定の問題空間に対するソリューションの通信を促進することに焦点を当てており、ドメインエキスパートの参加を促進する方法でそれを行うからです。

4
AdamJonR

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

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

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

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

4
Abdul Rehman

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

3
Anil Kumar

私は最近DSLを聞いたことがありますが、本当に役立つ例を見つけます:LUNA(以前のlunascript)。

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

さらに、多くの企業が適切な競争上の優位性を生み出すために独自のフレームワークと言語を作成していることがわかりました。いくつかの例を次に示します。

  • AbApを使用したSAP
  • PeopleCodeとPeopleCode
  • Objective-Cを搭載したApple
  • FacebookにはFBMLやFQLなどがあります

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

この答えがコンセプトの明確化に役立つことを願っています。

3
Abraham Romero

Machine Learningで使用されるDSLの例は、Pythonのpatsyです。 https://patsy.readthedocs.io/en/latest/formulas.html#

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

hadleyには、DSL w/Rを構築する方法を説明した高度なR本のNiceセクションがあります。 http://adv-r.had.co.nz/dsl.html

ディープラーニングフィールドがある程度安定したら(または今でも)、Apache MXnetプロジェクト内で同様のことが起こるのを楽しみにしています。ただし、 提案ページはまだ でその提案は見ていません。

2
Lucas Roberts

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

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

ほとんどの場合、DSLは企業内の生産性を向上させるために作成されるため、DSLはプライベートに保ち、結果や洞察を共有しません。

以下は、講演者が JetBrains MPS を使用してDSLのいくつかの例を提供し、Projectional編集のテクノロジーを使用した会議です。 https://vimeo.com/19738145

1
Oscar Rodriguez

DSL-DomainSpecificLanguage

DSLは、あらゆる種類のソフトウェアの問題を対象とした汎用言語ではなく、特定の種類の問題を対象としたコンピューター言語です。

ここで、構成(TravisCI .yaml)、ビルドスクリプト( gradle )、Podライブラリのバージョンについて説明します( Podspec )、UIプログラミング(- Anko =)など.

DSLは宣言型プログラミングです-What代わりに行うhow行う

外部DSLには独自のカスタム構文があり、それらを処理する完全なパーサーを作成します(XML、RegExp、SQL、HTML、CSS、UMLなど)。

内部DSLは、ホスト言語を使用して特定の言語の感覚をホスト言語に与える特定の方法です(たとえば、LISP、Ruby、Javaアノテーション、マクロ)。

続きを読む herehere

0
yoAlex5