ドメイン固有言語

ドメイン固有言語DSL)は、特定のアプリケーションドメインに特化したコンピュータ言語です。これは、ドメイン全体に広く適用可能な汎用言語(GPL)とは対照的です。DSLには、Webページ用のHTMLなど一般的なドメインで広く使用されている言語から、MUSHソフトコードよう1または少数のソフトウェアでのみ使用される言語まで、多種多様なものがあります。DSLは言語の種類によってさらに細分化され、ドメイン固有マークアップ言語、ドメイン固有モデリング言語(より一般的には仕様言語)、ドメイン固有プログラミング言語が含まれます。専用コンピュータ言語はコンピュータ時代には常に存在していましたが、「ドメイン固有言語」という用語は、ドメイン固有モデリングの台頭により、より一般的に使用されるようになりました。より単純なDSL、特に単一のアプリケーションで使用されるDSLは、 非公式にミニ言語と呼ばれることもあります

汎用言語とドメイン特化言語の境界線は必ずしも明確ではありません。言語は特定のドメインに特化した機能を持ちながらも、より広範囲に適用できる場合もあれば、逆に原理的には幅広い適用が可能であっても、実際には主に特定のドメインでのみ使用される場合もあります。たとえば、Perl はもともとAWKシェル スクリプトと同じドメインで、テキスト処理および接着言語として開発されましたが、後に汎用プログラミング言語として使用されることが多くなりました。対照的に、PostScriptチューリング完全な言語であり、原理的にはあらゆるタスクに使用できますが、実際にはページ記述言語としてのみ使用されています。

使用

適切な DSL の設計と使用は、ドメイン エンジニアリングの重要な部分です。ドメイン エンジニアリングでは、手元のドメインに適した言語を使用します。これは、既存の DSL または GPL を使用することも、新しい DSL を開発することもできます。言語指向プログラミングでは、問題を表現するための専用言語の作成を、問題解決プロセスの標準的な部分と見なします。既存の言語を再利用するのではなく、ドメイン固有言語 (およびそれをサポートするソフトウェア) を作成することは、その言語によって特定の種類の問題または解決策を既存の言語よりも明確に表現でき、問題の問題の種類が十分に頻繁に発生する場合は価値があります。実際的には、DSL は特定の問題ドメイン、特定の問題表現手法、特定の解決手法、またはドメインのその他の側面に特化できます。

概要

ドメイン固有言語は、特定のドメイン内の問題を解決するために特別に開発されており、そのドメイン外の問題を解決することは想定されていません(技術的には可能かもしれませんが)。一方、汎用言語は、多くのドメインの問題を解決するために開発されています。ドメインは、ビジネス分野を指す場合もあります。ビジネス分野の例としては、以下のようなものがあります。

  • 生命保険契約(大手保険会社が社内で開発)
  • 戦闘シミュレーション
  • 給与計算
  • 請求

ドメイン固有言語は、小さなプログラミング言語とスクリプト言語の中間に位置し、プログラミングライブラリに類似した方法で使用されることがよくあります。これらの概念の境界は、スクリプト言語と汎用言語の境界と同様に、非常に曖昧です

設計と実装において

ドメイン固有言語(DSL)とは、設計と実装において非常に具体的な目標を持つ言語(または、宣言された構文や文法)です。DSLは、 Generic Eclipse Modeling Systemによって作成されたもののような視覚的なダイアグラム言語、 Eclipse Modeling Frameworkのようなプログラム的抽象化言語、あるいはテキスト言語のいずれかです。例えば、コマンドラインユーティリティgrep は、テキスト行内のパターンに一致する正規表現構文を持っています。sed ユーティリティは、正規表現の一致と置換のための構文を定義しています。多くの場合、これらの小さな言語はシェル内で組み合わせて使用​​され、より複雑なプログラミングタスクを実行します。

ドメイン固有言語とスクリプト言語の境界線はやや曖昧ですが、ドメイン固有言語には、ファイルシステムアクセス、プロセス間制御、その他、スクリプト言語をはじめとするフル機能のプログラミング言語に特徴的な低レベル機能が欠けていることがよくあります。多くのドメイン固有言語は、バイトコードや実行可能コードではなく、様々なメディアオブジェクトにコンパイルされます。GraphVizはPostScriptGIFJPEGなどにエクスポートし、Csoundはオーディオファイルにコンパイルされます。また、レイトレーシングを扱うドメイン固有言語であるPOVは、グラフィックスファイルにコンパイルされます。

データ定義言語

SQLのようなデータ定義言語は興味深いケースです。特定のドメイン(SQLの場合はリレーショナルデータベースへのアクセスと管理)に特化しており、他のアプリケーションから呼び出されることが多いため、ドメイン固有言語と見なすことができます。しかし、SQLは多くのスクリプト言語よりも多くのキーワードと関数を持ち、プログラミングにおけるデータベース操作の普及と、言語の専門家になるために必要な習熟度の高さから、それ自体が言語であると考えられることがよくあります

さらにこの境界は曖昧になりますが、多くのドメイン固有言語は API を公開しており、実行フローを中断したり別のプロセスを呼び出したりすることなく他のプログラミング言語からアクセスでき、プログラミング ライブラリとして動作できます。

プログラミングツール

一部のドメイン固有言語は、時間の経過とともに拡張され、フル機能のプログラミングツールを含むようになり、言語がドメイン固有であるかどうかという問題をさらに複雑にします。良い例は関数型言語XSLTです。これは、1つのXMLグラフを別のグラフに変換するために特別に設計されており、開始以来拡張され、(特にバージョン2.0では)さまざまな形式のファイルシステムの相互作用、文字列と日付の操作、およびデータ型の指定が可能になっています

モデル駆動エンジニアリングでは、モデルをアサーションで装飾する言語であるOCLや、ドメイン固有の変換言語であるQVTなど、ドメイン固有言語の例が多く見られます。しかし、 UMLのような言語は、一般的に汎用モデリング言語です。

要約すると、類推が役に立つかもしれません。Very Little Language(超小型言語)はナイフのようなもので、食べ物を切ることから木を切り倒すことまで、何千通りもの用途に使えます。ドメイン特化言語(DSL)は電動ドリルのようなものです。多岐にわたる用途を持つ強力なツールですが、特定のコンテキスト、つまり物に穴を開けるという特定の用途に限定されます。汎用言語(GPL)は、様々なタスクを実行するための様々なツールを備えた完全なワークベンチです。ドメイン特化言語は、現在のワークベンチを見て、より優れたドリルが必要だと気づき、特定のドメイン特化言語がまさにそれを提供できることに気づいたプログラマーが使用すべきです。

ドメイン固有言語のトピック

外部ドメイン固有言語と埋め込みドメイン固有言語

独立したインタプリタまたはコンパイラを介して実装されたDSLは、外部ドメイン固有言語と呼ばれます。よく知られている例としては、TeXやAWKなどがあります。埋め込み(または内部)ドメイン固有言語と呼ばれる別のカテゴリは、通常、ホスト言語内にライブラリとして実装され、ホスト言語の構文に制限される傾向がありますが、これはホスト言語の機能に依存します。[ 1 ]

使用パターン

ドメイン固有言語にはいくつかの使用パターンがあります。[ 2 ] [ 3 ]

  • スタンドアロン ツールによる処理。多くの場合、コマンド ラインまたはMakefileからの直接ユーザー操作によって呼び出されます(例: 正規表現マッチングの grep、sed、lex、yacc、GraphVizツールセットなど)
  • プログラミング言語のマクロシステムを使用して実装され、コンパイル時またはリアルタイムでホスト汎用言語に変換または拡張されるドメイン固有言語
  • として埋め込みドメイン固有言語eDSL[ 4 ]は、内部ドメイン固有言語とも呼ばれ、「ホスト」プログラミング言語でライブラリとして実装されるDSLです。埋め込みドメイン固有言語は、構文、セマンティクス、ランタイム環境(シーケンス、条件文、反復、関数など)を活用し、ドメイン固有のプリミティブを追加します。これにより、プログラマは「ホスト」プログラミング言語を使用して、「ターゲット」プログラミング言語でコードを生成するプログラムを作成できます。複数のeDSLを1つのプログラムに簡単に組み合わせることができ、ホスト言語の機能を使用して既存のeDSLを拡張できます。eDSLを使用するその他の利点としては、型の安全性の向上とIDEツールの強化が挙げられます。eDSLの例:PythonのSQL eDSLであるSQLAlchemy "Core" 、JavaのSQL eDSLであるjOOQC#のSQL eDSLであるLINQの「メソッド構文」 、KotlinのHTML eDSLであるkotlinx.htmlなどがあります。
  • ドメイン固有言語は、 CPerlなどの汎用言語で書かれたプログラムから(実行時に)呼び出され、特定の機能を実行し、多くの場合、操作の結果を「ホスト」プログラミング言語に返してさらに処理します。通常、ドメイン固有言語のインタープリタまたは仮想マシンがホストアプリケーションに埋め込まれます(例:書式文字列正規表現エンジン
  • ユーザアプリケーションに埋め込まれるドメイン固有言語(例えば、スプレッドシート内のマクロ言語)[ 5 ] であり、(1)アプリケーションのユーザが記述したコードを実行するために使用されるか、(2)アプリケーションによって動的に生成されるか、(3)その両方である。

多くのドメイン固有言語は、複数の方法で使用できます。ホスト言語に埋め込まれたDSLコードは、sed、AWK、Perl、JavaScriptなどの正規表現などの特殊な構文をサポートしている場合や、文字列として渡す場合もあります。

設計目標

ソフトウェアエンジニアリングにドメイン固有言語アプローチを採用することは、リスクと機会の両方を伴います。適切に設計されたドメイン固有言語は、これらの間の適切なバランスを見つけます

ドメイン固有言語には、汎用言語とは対照的な重要な設計目標があります。

  • ドメイン固有言語はそれほど包括的ではありません。
  • ドメイン固有言語は、そのドメイン内での表現力がはるかに優れています。
  • ドメイン固有言語は冗長性を最小限に抑える必要があります。

イディオム

プログラミングにおいて、イディオムとは、プログラマーが一般的な開発タスクを処理するために課した方法です。例:

  • ウィンドウを閉じる前にデータが保存されていることを確認してください。
  • コマンドラインパラメータはプログラムの動作に影響するため、変更されるたびにコードを編集してください。

汎用プログラミング言語ではこのような慣用句はほとんどサポートされませんが、ドメイン固有言語ではこれを記述できます。例:

  • スクリプトはデータを自動的に保存できます。
  • ドメイン固有言語はコマンドライン入力をパラメータ化できます。

ドメイン特化型プログラミング言語の例としては、 HTML、鉛筆のような描画のためのLogo 、ハードウェア記述言語のVerilogVHDL 、行列プログラミングのためのMATLABGNU Octave 、記号数学のためのMathematicaMapleMaxima、リアクティブおよび分散システムのための仕様記述言語、スプレッドシートの数式とマクロ、リレーショナルデータベースクエリのためのSQLパーサーを作成するためのYACC文法、レキサーを指定するための正規表現、ダイアグラム言語を作成するためのGeneric Eclipse Modeling System 、サウンドと音楽の合成のためのCsound 、グラフレイアウトグラフ書き換えに使用されるソフトウェアパッケージのGraphVizGrGenの入力言語、Terraformやその他のHashicorpツールで使用されるHashicorp構成言語Puppetにも独自の構成言語があります

GameMaker言語

GameMaker Studioで使用されるGMLスクリプト言語は、初心者プログラマーがプログラミングを簡単に習得できるように設計されたドメイン固有言語です。この言語は、DelphiC++BASICなど複数の言語をブレンドして機能します。コンパイル後のこの言語のほとんどの関数は、実際には対象プラットフォーム固有の言語で記述されたランタイム関数を呼び出すため、最終的な実装はユーザーには見えません。この言語は主に、誰でも簡単に言語を習得してゲームを開発できるようにすることを目的としており、メインゲームループを処理し、呼び出された関数の実装を保持するGMランタイムのおかげで、最もシンプルなゲームであれば数千行ではなく数行のコードで済みます

ColdFusionマークアップ言語

ColdFusionの関連スクリプト言語は、データ駆動型ウェブサイト向けのドメイン固有言語(DSL)のもう一つの例です。このスクリプト言語は、Java、.NET、C++、SMS、電子メール、電子メールサーバー、HTTP、FTP、Exchange、ディレクトリサービス、ファイルシステムなどの言語とサービスを統合し、ウェブサイトで利用するために使用されます。

ColdFusionマークアップ言語(CFML)には、ColdFusionページでデータソースとのやり取り、データの操作、出力の表示に使用できるタグのセットが含まれています。CFMLタグの構文は、HTML要素の構文に似ています。

フィルターマイスター

フィルターマイスターは、 Photoshop互換の画像処理フィルタープラグインを作成することを目的とした、C言語ベースのプログラミング言語を使用したプログラミング環境です。フィルターマイスター自体はPhotoshopプラグインとして動作し、スクリプトを読み込んで実行したり、コンパイルして独立したプラグインとして書き出したりできます。フィルターマイスター言語はC言語と関数ライブラリの大部分を再現していますが、Photoshopプラグインのコンテキスト内で使用できる機能のみが含まれており、この特定の分野でのみ役立つ多くの機能が追加されています

MediaWikiテンプレート

MediaWikiのテンプレート機能はページテンプレートの作成と、 MediaWikiページを他のMediaWikiページにトランスクルージョン(参照による取り込み) することを基本的な目的とする、埋め込み型ドメイン固有言語です

ソフトウェアエンジニアリングの用途

ソフトウェアエンジニアリングの生産性と品質を向上させるために、ドメイン固有言語に大きな関心が寄せられています。ドメイン固有言語は、効率的なソフトウェアエンジニアリングのための堅牢なツールセットを提供できる可能性があります。このようなツールは、重要なソフトウェアシステムの開発に導入され始めています

ソフトウェアコスト削減ツールキット[ 6 ]はその一例です。このツールキットは、要件仕様を作成するための仕様エディタ、変数の依存関係を表示する依存関係グラフブラウザ、仕様書内の整形式の式に不足しているケースを検出する整合性チェッカー、仕様書とプログラムの特性を照合するモデルチェッカー定理証明器、そして要件に基づいて不変式を自動的に構築する不変式ジェネレータを含むユーティリティスイートです。

より新しい開発は、言語指向プログラミングです。これは、主にドメイン固有言語の作成、最適化、および使用に基づいた 統合ソフトウェア エンジニアリング方法論です。

メタコンパイラ

言語指向プログラミングやその他のあらゆるドメイン固有言語を補完するのが、メタコンパイラと呼ばれるコンパイラ作成ツールです。メタコンパイラは、ドメイン固有言語用のパーサーコードジェネレータを生成するのに役立つだけでなく、メタプログラミングのドメイン向けに特別に設計されたドメイン固有のメタ言語をコンパイルます

メタコンパイラは、ドメイン固有言語の解析に加え、幅広いソフトウェアエンジニアリングおよび分析ツールの生成にも役立ちます。メタコンパイラ手法は、プログラム変換システムによく見られます。

コンピュータサイエンスとコンピュータ産業の両方で重要な役割を果たしたメタコンパイラには、Meta-II [ 7 ]とその後継であるTreeMeta [ 8 ]があります。

バージョン4以前のUnreal Engineとその他のゲーム

UnrealUnreal TournamentはUnrealScriptと呼ばれる言語を発表しました。これにより、競合のQuakeId Tech 2エンジンを使用)と比較して、迅速なMod開発が可能になりました。Id Techエンジンは標準的なC言語を使用していたため、Cを習得し適切に適用する必要がありましたが、UnrealScriptは使いやすさと効率性を重視して最適化されていました。同様に、最近のゲームでは開発用に独自の言語が導入されています。もう一つの一般的な例として、スクリプト用の Luaが挙げられます。

ポリシー自動化のためのルールエンジン

政府機関と民間企業の両方で使用されるポリシーとビジネスルールを自動化するために、 様々なビジネスルールエンジンが開発されてきました。ILOG 、Oracle Policy Automation、DTRules、Droolsなどは、様々な問題領域に対応することを目的としたDSLをサポートしています。DTRulesはルールセット内で複数のDSLを使用するためのインターフェースを定義するまでになっています。

ビジネスルールエンジンの目的は、ビジネスロジックの表現を可能な限り人間が読みやすい形式で定義することです。これにより、専門家と開発者の両方が、同じビジネスロジックの表現を扱い、理解できるようになります。ほとんどのルールエンジンは、ビジネスロジックの制御構造を簡素化するアプローチ(宣言型ルールやデシジョンテーブルの使用など)と、DSLを優先したプログラミング構文の代替手段の両方を提供しています。

統計モデリング言語

統計モデラーは、 R ( S言語の実装)、 BugsJagsStanなどのドメイン固有言語を開発してきました。これらの言語は、ベイズモデルを記述するための構文を提供し、シミュレーションを用いてベイズモデルを解くための手法を生成します。

複数のプログラミング言語でモデルとサービスを生成

Web アプリケーション用の JavaScript、ドキュメント用の HTML、高パフォーマンス コード用の C++ などのドメイン固有言語のインターフェイス記述言語に基づいて、オブジェクトの処理とサービスを生成します。これは、Apache ThriftGoogle Protocol Buffersなどのクロス言語フレームワークによって行われます。

ガーキン

ガーキンは、ソフトウェアの動作をチェックするためのテストケースを定義するために設計された言語です。その動作がどのように実装されているかは指定しません。自然言語構文と行指向設計を用いて、技術者以外のユーザーが読み、使用することを目的としています。ガーキンで定義されたテストは、汎用プログラミング言語で実装する必要があります。そして、ガーキンプログラムのステップは、開発者以外のユーザーがアクセスできるメソッド呼び出しの構文として機能します

その他の例

ドメイン固有言語の他の著名な例としては、以下のものがあります。

メリットとデメリット

いくつかの利点:[ 2 ] [ 3 ]

  • ドメイン固有言語は、問題領域のイディオムと抽象レベルでソリューションを表現することを可能にする。その考え方は、ドメイン専門家自身がドメイン固有言語のプログラムを理解し、検証し、修正し、さらには開発することさえ可能であるというものである。しかし、実際にはそうはいかないことが多い。[ 9 ]
  • ドメイン固有言語はドメインレベルでの検証を可能にします。言語構造が安全であれば、その言語構造で書かれた文はすべて安全であるとみなされます。
  • ドメイン固有言語は、ビジネス情報システムの開発を従来のソフトウェア開発者から、(技術的な専門知識は少ないものの)ドメインに関するより深い知識を持つ、通常はより大きなドメイン専門家のグループに移行するのに役立ちます。[ 10 ]
  • ドメイン固有言語は、その範囲が限定されているため、学習が容易です。

いくつかの欠点は次のとおりです。

  • 新しい言語を学ぶコスト
  • 適用範囲が限られている
  • ドメイン固有言語( IDE)の設計、実装、保守にかかるコストと、それを用いた開発に必要なツール
  • 適切なスコープを見つけ、設定し、維持する。
  • ドメイン固有性と汎用プログラミング言語構造の間のトレードオフのバランスを取るのが難しい。
  • 手動でコーディングされたソフトウェアと比較して、プロセッサ効率が低下する可能性があります。
  • 類似した非標準のドメイン固有言語の急増。例えば、ある保険会社で使用されているDSLと別の保険会社で使用されているDSLなど。[ 11 ]
  • 技術に詳しくないドメイン専門家は、DSLプログラムを自分で書いたり修正したりするのが難しいと感じるかもしれません。[ 9 ]
  • DSL を IT システムの他のコンポーネントと統合することが困難になります (汎用言語との統合と比較して)。
  • 特定の DSL の専門家の供給が少ないと、人件費が上昇する傾向があります。
  • コード例を見つけるのが難しくなります。

ドメイン固有言語を設計するためのツール

  • JetBrains MPSは、ドメイン固有言語(DSL)設計ツールです。射影編集を採用することで、言語パーサーの限界を克服し、表や図を含むDSLエディタを構築できます。言語指向プログラミングを実装しています。MPSは、言語定義環境、言語ワークベンチ、そしてこれらの言語のための統合開発環境(IDE)を組み合わせています。[ 12 ]
  • MontiCoreは、ドメイン固有言語(DSL)を効率的に開発するための言語ワークベンチです。DSLを定義する拡張文法フォーマットを処理し、DSLドキュメントを処理するためのJavaコンポーネントを生成します。[ 13 ]
  • Xtextは、プログラミング言語およびドメイン固有言語(DSL)を開発するためのオープンソースのソフトウェアフレームワークです。標準的なパーサージェネレータとは異なり、Xtextはパーサーだけでなく、抽象構文木のクラスモデルも生成します。さらに、フル機能でカスタマイズ可能なEclipseベースのIDEも提供しています。[ 14 ]このプロジェクトは2023年4月にアーカイブされました。
  • Racketは、ネイティブコード、JITおよびJavaScriptコンパイラ、IDE(Emacs、Vim、VSCodeなどをサポート)、およびドメイン固有言語と汎用言語の両方の作成に対応するように設計されたコマンドラインツールを含むクロスプラットフォーム言語ツールチェーンです。[ 15 ] [ 16 ]

参照

参考文献

  1. ^ Fowler, Martin; Parsons, Rebecca. 「ドメイン特化言語」 . 2019年7月6日閲覧
  2. ^ a b Marjan Mernik, Jan Heering, Anthony M. Sloane. ドメイン固有言語を開発するタイミングと方法. ACM Computing Surveys , 37(4):316–344, 2005. doi : 10.1145/1118890.1118892
  3. ^ a bディオミディス・スピネリス.ドメイン特化言語のための注目すべきデザインパターン.システムとソフトウェアジャーナル, 56(1):91–99, 2001年2月. doi : 10.1016/S0164-1212(00)00089-3
  4. ^フェライゼン、マティアス;フィンドラー、ロバート・ブルース;フラット、マシュー。クリシュナムルティ、シュリラム。バルジライ、エリ。マッカーシー、ジェイ。サム・トービン・ホッホシュタット(2018年3月)。「プログラム可能なプログラミング言語」ACM の通信61 (3): 62–71 .土井: 10.1145/3127323S2CID 3887010 2019 年5 月 15 日に取得 
  5. ^ Stinson, Craig (1991-04-16). 「完璧なスプレッドシートの構築」 . PC . pp.  101– 164. 2025年3月14日閲覧
  6. ^ Heitmeyer, C. (1999). 「SCR* ツールセットを用いたソフトウェア要件仕様の指定」(PDF) .議事録. 第2回IEEE産業強度形式仕様記述技術ワークショップ. IEEE. pp.  12– 13. doi : 10.1109/WIFT.1998.766290 . ISBN 0-7695-0081-1. S2CID  16079058 . 2004年7月19日時点のオリジナル(PDF)からアーカイブ
  7. ^ Shorre, DV (1964). 「META II 構文指向コンパイラ記述言語」. 1964年第19回ACM全国会議論文集. pp.  41.301 – 41.3011 . doi : 10.1145/800257.808896 . S2CID 43144779 . 
  8. ^ Carr, C. Stephen; Luther, David A.; Erdmann, Sherian (1969). 「TREE-METAコンパイラ・コンパイラシステム:Univac 1108およびGeneral Electric 645用メタコンパイラシステム」ユタ大学技術報告書 RADC-TR-69-83 . 2020年2月1日時点のオリジナルよりアーカイブ
  9. ^ a b Freudenthal, Margus (2009年1月1日). 「税関情報システムにおけるドメイン特化言語」. IEEE Software : 1. doi : 10.1109/MS.2009.152 .
  10. ^ Aram, Michael; Neumann, Gustaf (2015-07-01). 「ビジネス情報システムの共同開発における多層分析」(PDF) . Journal of Internet Services and Applications . 6 (1). doi : 10.1186/s13174-015-0030-8 . S2CID 16502371 . 
  11. ^ Miotto, Eric. 「モデル駆動型エンジニアリングにおけるドメイン固有知識と科学的知識の統合について」(PDF) 。 2011年7月24日時点のオリジナル(PDF)からアーカイブ。 2010年11月22日閲覧
  12. ^ 「JetBrains MPS: ドメイン固有言語クリエーター」
  13. ^ 「モンティコア」
  14. ^ 「Xtext」
  15. ^ Tobin-Hochstadt, S.; St-Amour, V.; Culpepper, R.; Flatt, M.; Felleisen, M. (2011). 「ライブラリとしての言語」(PDF) .プログラミング言語の設計と実装.
  16. ^ Flatt, Matthew (2012). 「Racketで言語を作成する」 Communications of the ACM . 2012年4月8日閲覧。

さらに詳しい情報

記事