ドメイン固有言語(ドメインこゆうげんご、、DSL)とは、特定のタスク向けに設計されたコンピュータ言語である。ドメイン特化言語あるいは単にドメイン言語とも呼ばれるが、学術的にはドメイン特化言語と呼ばれることが多い。C言語やJavaのような汎用のプログラミング言語の対照とされる。DSL は一種類のタスクをうまく実行することに集中したものであり、古くから存在したが、ドメイン固有モデリングの発達と共にDSLという用語も広く知られるようになってきた。例えば、ハードウェア記述言語のVerilogやVHDL、表計算ソフトのマクロ、関係データベースへの問い合わせ言語(SQLなど)、構文解析器構築用のyacc、字句解析器記述用の正規表現、図を作成する言語を構築する 、音響や音楽の合成用のCsound、グラフ描画用のGraphviz、依存関係解決用のmakeなどがある。ドメイン固有言語が有効となるのは、既存の言語よりも特定領域の問題や解法をより明確に記述可能となる場合であり、かつその種の問題が比較的よく出現する場合である。は、問題を解く標準的過程の一部として問題を表現する特殊用途の言語を生成することを考慮する。DSL は、ある特定の領域(ドメイン)の問題を解決するために作られ、それ以外の領域の問題を解くことは想定していない。一方、汎用プログラミング言語は様々な領域の問題を解くように作られている。ドメインはビジネス領域にも対応することがある。例えば、次のようなDSLがある。APIを公開しているDSLは、他のプログラミング言語から呼び出してライブラリのように使うことができる。機能を拡張され続けた結果チューリング完全になってしまうDSLもある。つまり計算理論的には汎用のプログラミング言語と同等になってしまったということであり基本的にはDSLとしての設計の失敗とみなされることもあるが、珍しいことではない。そのようなDSLでもたいていは、設計目的外の用途のための記述は可読性が無く実用的ではない。DSL は言語として(あるいは文法や構文として)非常に限定された目的で設計/実装される。DSL は視覚化された言語(ドメイン特化ダイアグラムとも言われる)の場合もあるし()、プログラム的な抽象化の場合もあるし(EMF)、テキスト的な言語の場合もある。例えば、grepというコマンドラインで使われるユーティリティはテキストとのパターンマッチを行うための正規表現が可能である。sedユーティリティは同様に正規表現を使ってテキストとパターンマッチングさせて、文字列の置換も行う。これらの簡易言語はシェルスクリプトで利用され、より複雑なタスクを実行する一部を構成する。DSL にはファイルシステムへのアクセス機能やプロセス間制御といった機能を完備したプログラミング言語なら当然持っているべき機能が欠けていることが多い。多くのDSLはバイトコードや実行コードと言ったものにコンパイルされることはなく、他の様々な媒体向けに変換されることが多い。例えばGraphvizはPostScript、GIF、JPEGなどを出力し、Csoundは音声ファイルを出力し、POVのようなレイトレーシング用言語はグラフィックスのファイルを出力する。SQLは関係モデルに基づいて設計されている関係データベースのへのクエリ(アクセス)言語である。一部のDSLは徐々に機能が追加されて完全なプログラミングツールとなってきているため、ある言語がDSLかそうでないかという判断はさらに複雑化している。好例として関数型言語とみなされているXSLTがある。XSLTはXMLのドキュメントツリーを変換するために設計された。しかし最初から、条件分岐と、引数のあるテンプレートの再帰適用により関数型のプログラミングが可能であった。さらにその後の機能追加でファイルシステム操作、文字列操作、その他のデータ型や操作などの機能が追加されたため、さらに一般的なプログラミングが可能なものになっている。また、は、最初の時点ではWebページ作成に使うツールを集めたフレームワークであり、作者としても「スクリプト言語を作るなどといった考えはまったくなかった」のであるが、その後に拡張が進み、PHP 5ではオブジェクト指向や例外処理を備えた本格的な言語へと発展している。モデル駆動工学では、OCL、QVT などの各種DSLが使われる。ただし、UMLは DSL ではなく汎用モデリング言語に分類されるのが一般的である。簡易言語はナイフのようなもので、様々な用途がある。DSLは電動ドリルのようなもので、穴を空けることにかけては強力なツールである。このメタファでは、それら工具に対し、汎用のプログラミング言語は工具の材料である鋼に相当する。道具というのは「一つの目的に特化する」のが基本であり、たとえばモンキーレンチや、さらには十徳ナイフのようなものは便利だが代用品である(プログラミング言語が十徳ナイフに相当するものではないのは言うまでもない)。DSL を利用するパターンには以下のような場合がある:DSLを採用するDSL には汎用プログラミング言語にはない次のような重要な設計目標がある:メインフレーム系システムのJob Control Language(JCL)も一種のDSLである。Unix系システムのUnixシェルのコマンドやシェルスクリプトは、コマンドに与えるファイルや入出力のデータを様々な形で操作できる。特にプロセスの標準ストリームに対して、リダイレクトとパイプにより、順番に接続したり、ファイルを入出力先に指定したりすることができる。小さなタスクを行うプロセス群の実行と制御のための単純なインタフェースで構成される。それらのタスクは、テーブル、グラフ、チャートなど必要な形にデータを編成するイディオムを表している。各タスクは単純な制御フローと文字列操作機構から成り、ファイル内の文字列の検索や置換、文字列の出現回数のカウントといった多数の一般的作業をカバーしている。(注: これらは単にUnixに標準的に存在するユーティリティ群のことであり、シェルスクリプト自体の機能ではない)データ駆動型ウェブサイトのためのDSLの例として、ColdFusionのスクリプト言語がある。ウェブサイト構築のために、Java、.NET、C++、SMS、電子メール、メールサーバ、HTTP、FTP、ディレクトリサービス、ファイルシステムなどと共に使われている。ColdFusion Markup Language (CFML) には、ColdFusionのページでデータソースとのやりとりやデータ操作や表示出力に使用するタグ群が含まれている。CFMLのタグの構文はHTMLのそれによく似ている。Erlang Open Telecom Platform は当初、エリクソンがDSLとして社内で使用するために設計した。有限オートマトン、汎用サーバ、イベントマネージャなどを素早く構築でき、特定分野ではCやC++といった汎用プログラミング言語を凌駕する生産性を示す。現在では公式にオープンソースとなっている。FilterMeisterはCをベースとするプログラミング言語のプログラミング環境で、Photoshop用画像処理フィルタ・プラグインの作成に特化している。FileMeister自体がPhotoshopのプラグインとして動作してスクリプトをロード・実行することもでき、コンパイルして独立したプラグインを生成することもできる。FilterMeisterの言語はC言語とそのライブラリの大部分を再現しているが、それはPhotoshopのプラグインで必要な部分に限られており、その領域でのみ有用な機能も追加している。MediaWikiのテンプレート機能は組み込み型DSLの一種であり、の作成サポートとMediaWikiのページ間のトランスクルージョンを基本的目的としている。詳しくは、を参照。ドメイン固有言語は、生産性と品質を向上させるものとして、ソフトウェア工学の分野で注目されてきた。DSL が効率的ソフトウェア工学のためのツールの土台となる可能性を秘めている。そのようなツールは一部のシステムの開発で使われ始めている。SCR(Software Cost Reduction)ツールキットはその一例である。このツールキットには、要求仕様を作成するためのエディタ、変数の依存関係を表示するブラウザ、仕様内の整論理式での不備をチェックする機構、仕様とアプリケーションを比較検証するモデル検査や自動定理証明機構、仕様から自動的に不変式(invariants)を構築する機構などが含まれる。比較的新しい分野としてがある。これは、DSLの作成・最適化・利用を中心にすえた方法論である。言語指向プログラミングを含めあらゆる形態のDSLを補完するものとして、と呼ばれるコンパイラ記述ツールがある。メタコンパイラはDSLの構文解析器とコード生成器を生成するのに便利というだけでなく、それ自体がコンパイラ記述に特化したDSLでもある。一般的なパーサジェネレータにはないメタコンパイラ特有の特徴として、メタコンパイラは独自の言語で書かれており、メタコンパイラ自体を実行形式に変換することができる。自分自身を定義し変換できるという点で「メタ」なステップを構成しており、メタコンパイラと呼ばれる。DSLの構文解析だけでなく、メタコンパイラは様々なソフトウェア工学と分析のツールを生成するのにも有効である。メタコンパイラの方式は、汎用ツール群構築の際のブートストラップのためにでよく使われている。計算機科学史上重要なメタコンパイラとして、 とその後継である がある。ゲームアプリケーション開発では一般的にPC向けやゲーム専用機向けを問わず独自の専用スクリプト言語を導入もしくは内製することが多い。例えばノベルゲームタイプの専用ゲームエンジンであるNScripterや吉里吉里2ではゲームシナリオ進行記述やフラグ管理に特化した言語を実装している。Unreal と Unreal Tournament は UnrealScript という言語を公開している。。QuakeではC言語を使った Id Tech engine を採用しており、修正にはC言語の習得が必要だが、UnrealScriptは簡便さと効率を重視して設計されている。しかし、後述するDSLの欠点を回避するなどの目的から、『Far Cry』や『小さな王様と約束の国 ファイナルファンタジー・クリスタルクロニクル』などに代表されるように、汎用スクリプト言語であるLuaやSquirrelを採用する作品も増えてきている。また、Unity (ゲームエンジン)では、スクリプトの記述にC#あるいはJavaScriptのサブセットを使用することができる。汎用スクリプト言語(動的言語)は多数存在するが、ゲームのスクリプト記述には、性能上の要件から軽量・省メモリかつ比較的高速に動作する言語が選ばれることが多い。ポリシーや業務規約を自動化するための様々なが開発されてきた。ILOG、、、といった製品では、様々な分野をサポートするDSLを提供している。DTRulesでは、ルールセット内で複数のDSLを使用するためのインタフェースも定義している。ビジネス・ルール・エンジンは、人間が読める形でビジネスロジックを定義することを目的としている。それにより、その業務の専門家と開発者がビジネスロジックについての理解を共有できるようにしている。多くのルール・エンジンは、ビジネスロジックの制御構造を単純化する技法とDSLを使ったプログラミングを組み合わせて提供している。統計的モデリング、特にベイズ確率を使った技法では、やといったDSLが作られてきた。これらのDSLはベイズ確率モデルを記述するためのもので、シミュレーションによってそのモデルを解く手段を生成する。DSLには次のような利点がある。一方で、以下のような欠点もある。
出典:wikipedia
LINEスタンプ制作に興味がある場合は、
下記よりスタンプファクトリーのホームページをご覧ください。