18

ドメイン固有言語に興味があります。記事で何度か見たことがありますが、保証外や銀行のデータ定義の問題で使用できるようです。

だから私は具体的なインプットを得るためにSOに来ました。

DSL を使用したことがありますか? 1つ書いてください。はいの場合、どんな感じですか?

あなたのプロジェクトの 1 つが、DSL を使用することで改善 (生産性、保守性など) できると思いますか?

編集:これを後にして申し訳ありませんが、私はあなたが自分で書いた特定のDSLを意味していました。Tex、HTML、Make、SQL は除外されます。実際、質問はもっとありました:「DSLを書く」

4

12 に答える 12

8

DSLの弱い形式(流暢なインターフェースと呼ばれるもの)としての非常に読みやすいAPIと、その中間にある内部DSLと、もう一方の端にある完全な文法定義の外部DSLとの間にはかなりの連続性があると思います。

最も弱い形式は、私が常に達成しようとしているものです(つまり、APIを問題のあるドメインにできるだけ近づけます)。連続体のもう一方の端にあるDSLは、プログラマー以外の人がソフトウェアを使用する場合、たとえばデータを入力する場合に非常に意味があります。

また、Xtextのようなフレームワークを使用すると、構文の色付けとエラーチェックをサポートするエディターを含む完全な外部DSLでさえ、当初の見た目よりもはるかに簡単に実装できます。

于 2009-07-10T14:15:29.933 に答える
8

SQL は、Michael Dorfmanが示した良い例です。私が広く使用した他のものは次のとおりです。

  • UIL - GUI の構築
  • Make - プログラムのビルドとインストール
  • regexp - 文字列パターン マッチング
  • lex and yacc - 字句解析器とコンパイラの作成

それがどのように機能するかについては、言語とドメインに依存すると思います。UIL は、GUI を指定するのに非常に優れています。インライン Motif コードで同じことを行うと、UIL コンパイラがキャッチする GUI 仕様エラーは、C または Ada コンパイラにとって完全にコンパイル可能なコードのように見えます。これにより、デバッグに無駄な時間を費やすことになります。さらに、Motif API 呼び出しを使用する汎用コードでは見栄えが悪くなります。

Make は本当に悪夢になる可能性がありますが、それができるツールはそれほど多くありません。私は、それらすべてが同じ問題を抱えているのではないかと思います。

正規表現は非常に単純なタスクには必要ありませんが、非常に複雑なタスクには悪夢です。中間の人にとって、それらは素晴らしいツールです。

Lex と yacc は非常に役立ちます。ただし、自分が何をしているのかを知っている人は、ほぼ同じ量の作業で、パーサーと字句解析器を手作業で作成できます。

于 2009-07-10T13:44:29.380 に答える
7

あなたの質問は非常にタイミングが良いです。私は最近、ツールAntlrを使用してDSLを作成しました。Antlrはパーサー/レクサージェネレーターです。
DSL(および他の多くのもの)の簡単な構築を可能にし、StringTemplate(同じ人によって書かれた)と組み合わせると、コード生成で非常に強力になります。また、複数の言語をターゲットにすることもできます。デフォルトはJavaですが、パーサーとレクサーはC#(ターゲットの1つ)にあります。

Antlrの多くの利点の1つは、説明的なエラーメッセージと、文法をステップスルーしてASTツリーを視覚的に確認できるIDE /デバッガー(AntlrWorks)です。

John Saundersは、組み込みのVisualStudioDSLツールキットの使用を以下に提案しました。最終的に、私はそれらのツールが収縮にはほど遠いことに気づきました。基礎となるテキスト文法を簡単に説明する機能がないGUIを必要とすることは、私のニーズには不十分のように思われます。

DSLパーサー/レクサーに加えて、インテリセンス、エラーハイライト、コード補完、およびテンプレートアイテム/プロジェクトを提供するために、VisualStudio言語サービスも作成しました。

エクストラを実装しなくても、DSLを使用すると反復作業を簡素化できます。私のDSLは特にCSLAフレームワークを対象としており、すべての配管でビジネスオブジェクトを簡単に生成できるため、開発者はビジネスロジックについてのみ心配することができます。

DSLの小さな例を次に示します。

datadef Object1Datadef
{

   tables
   {
      MyTable:PK[MyTableID], column1, column2;
   }

}

root MyObject
{
    datadef Object1Datadef;

    read "all";
    write "admin", "superusers";

    int _Myvariable;    

}

DSLによってドメインをより速く、より簡単に記述でき、生産性が向上するのであれば、それは価値があります。

于 2009-07-10T15:17:57.820 に答える
6

私たちのほとんどが最も頻繁に使用する DSL は、データの操作と抽出のための小さな言語である SQL だと思います。

于 2009-07-10T13:34:56.787 に答える
3

私は数年間、NUnitバージョン 2.0 以降の作業を行った 1 人でした。単体テストを記述するために C# 属性を使用して記述された DSL です。これは DSL の最も明白な例ではありませんが、私はそれを DSL の 1 つと考えるようになりました。ANTLR や MGrammar を使用して、他にもいくつか書いています。経験はしばしば同じです。あなたがそれを他の人に見せるとすぐに、彼らはあなたが考えもしなかった多くのことをしたいと思っています. それは良いことですが、継続して機能を追加する準備をしておく必要があります。

私は今、かなり頻繁に DSL について考えたり書いたりする習慣を身につけています。現在使用しているオブジェクト リレーショナル マッパーは DSL です。それは新しい言語ではありません。純粋な C# ですが、ドメインの言語を考えて、ドメインは単なるビジネス ドメインではなく、オブジェクトをマップするためのミニ言語を作成しました。DSL の観点から考えると、API とフレームワークの構築に対するアプローチが変わりました。

于 2009-10-05T09:07:15.180 に答える
3

DSL の最近の 2 つの用途:

  1. コンストラクトライブラリの使用- データのバイナリ構造 (ファイル形式など) とプロトコルを記述するための DSL を基本的に定義します。
  2. ハードウェアを検証するための Python ベースの DSL の実装。この DSL は、テストを記述するために必要なすべてのインフラストラクチャを、基礎となる DSL コンポーネントを使用できる「シナリオ関数」としてレイアウトします。
于 2009-07-10T12:29:29.500 に答える
2

これは古い質問かもしれませんが、タイトルの質問(本文ではなく)は実際には誰も回答していません。

DSLを作成することが理にかなっている2つの(デュアル)インスタンスがあります。

  • 問題ドメインが非常によく理解されており、名詞(オブジェクト)、動詞(アクション、コンビネータなど)、形容詞(属性、修飾子)の既存の語彙がある場合。
  • ソリューションドメインが非常によく理解されている場合...

正規表現は最初の良い例ですが、アセンブラージェネレーターは2番目の例です。残りの部分には汎用プログラミング言語があります。問題ドメインもソリューションドメインもそれほどよく理解されていないため、一般的なツールを使用する必要があります。

于 2010-06-25T14:26:07.117 に答える
2

実際、DSL はほとんど毎日、知らないうちに使用しています... HTML、make、XML、latex、および多くの構成言語...

宣言的な DSL を使ってさまざまなものを生成するのは楽しいです...気持ちいいです...

DSL の影響は興味深いですが、評価するのは非常に困難です...あなたの DSL がターゲット コミュニティ向けに適切に設計されている場合 (ターゲット コミュニティは非常に重要なポイントです...)、このコミュニティが何を期待しているかという点でやるべき仕事をうまくこなし、気分が良くなるだろう...

ただし、コミュニティを知らずに DSL を設計したり、言語の制限と常に戦わなければならない場合 (DSL はチューリング完全である可能性があります...)、それは害になるでしょう...

于 2009-07-10T14:48:41.720 に答える
2

私の経験では、どのソフトウェア エンジニアリング組織も、繰り返し発生する問題やテンプレート コードの書きすぎに対応して DSL を作成します。私の個人的な経験からの短い抜粋:

  • コンパイラ ボトムアップ書き換えシステム ジェネレータ
  • アセンブラジェネレータ
  • オブジェクト コード ジェネレーター (演算子のオーバーロードを使用して C++ ライブラリとして実装)
  • CPUシミュレータジェネレータ
  • シミュレータ デバイス モデル ジェネレータ
  • 対話型ツールのコマンドライン言語

また、よく見ると、多くのファイル形式が DSL と見なされることにも注意してください。

この現象についても、少し前に ACM Queue に Mark Shapiroによる良い記事がありました。

さらにもう 1 つの例は、ユーザーが意図しないもので大きなプログラムを作成する方法です...古い「SNIFF」デバッガー スクリプト言語を使用するテスト ベンチなどです。

于 2009-10-05T07:23:59.347 に答える
0

BNF をパーサー ジェネレーターの DSL として使用するのはどうですか?

于 2009-07-10T13:48:07.330 に答える
0

Visual Studio DSL Toolkitで作成された DSLを使用して、DSL によって定義されたドメイン モデルのインスタンスから任意のテキスト ベースのアーティファクトを生成できます。もちろん、その時点で Visual Studio 内にいて、テキスト アーティファクト用のコンパイラまたはその他のプロセッサがあれば、自動的に実行できます。

いくつかの例は

  • Object-Role Modeling Notation (ORM2) に基づく、概念ドメイン モデリング用の DSL であるNORMA
  • 3 つの DSL を使用して Web サービスをモデル化するWeb Service Software Factory
  • 構成セクション デザイナー- XML 構成ファイルのスキーマを定義し、それらからデータを公開するためのクラスを生成するために使用されます。

もちろん、自分で作成することもできます。

于 2009-07-10T14:00:01.950 に答える
0

私はまだ学生ですが、精神にとても魅了されています

「プログラミング言語」コース全体で少し使用しました。これがどのように機能するかです。基本的にはEBNFを書いています。

代替テキスト http://img6.imageshack.us/img6/1461/reala.png

C++ ではこれになります;)

代替テキスト http://img6.imageshack.us/img6/8809/dsl.png

于 2009-07-10T22:39:21.553 に答える