宣言型プログラミング

提供: miniwiki
移動先:案内検索

宣言型プログラミング: Declarative programming)は、プログラミングパラダイムの名称だが、主として2種類の意味がある。第1の意味は、処理方法ではなく対象の性質などを宣言することでプログラミングするパラダイムを意味する。第2の意味は、純粋関数型プログラミング論理プログラミング制約プログラミングの総称である。後者は(多寡はあれ)前者の性質を持つ。

概要

第1の定義によれば、ある出力を得るにあたってそれを作成する方法ではなく、出力の性質を記述することを「宣言型」と称する。一例を挙げるならば、(プログラミング言語ではないが)SQLのクエリは「どのようなデータが欲しいか」を記述するものであり、例えば具体的なB木の操作などといった「いかにしてデータベースにアクセスするか」といったことには関与しない。この手法は、FORTRANC言語Javaなどといった命令型プログラミング言語とは全く異なる。命令型では、目的を実現するアルゴリズムを、その順序に沿う形で記述しなければならない。つまり、命令型プログラムでは目的を達成するための方法を「手続き」として示すのに対し、宣言型プログラムでは達成すべき目的(出力)を示して、それを実現する手続きはシステムに任せるわけである。

別の定義では、純粋関数型言語/論理プログラミング言語/制約プログラミング言語で書かれたプログラムを「宣言型」と称する。この立場での「宣言型プログラミング」とは、数理論理学に基づいて設計されたプログラミング言語のことであり、命令型言語と対立する概念である。関数型言語ならラムダ計算コンビネータ論理代数学などと対応し、論理プログラミングならその式はホーン節に対応する。

この2つの定義はある程度オーバーラップしている。特に制約プログラミングでは、解の性質を記述することに注力し、解を求めるためのアルゴリズムは特に指定しないこともある。論理プログラミングにもその傾向がある。とはいっても、制約プログラミング言語や論理プログラミング言語でもアルゴリズムや実装の詳細を記述することは可能ではある(可能であるということは、常にそのようなスタイルでプログラムを書くという意味ではないが)。

同様に命令型プログラミング言語であっても、プログラムを宣言型のスタイルで書くことは可能である。この場合、宣言的でない詳細をライブラリやフレームワークでカプセル化するのが一般的である。例えば、単体テストのフレームワークであるJUnitリフレクションを使ったスタイルがある。

ドメイン固有言語

宣言型のスタイルがよくあらわれる例に、ドメイン固有言語 (DSL) がある。この場合の「ドメイン」とは「対象領域」すなわちその言語が記述しようとする対象を指す。DSLには、設定ファイル表計算ソフト、さらには電子メールのヘッダ部分の記法なども含まれる。

DSLはしばしばチューリング完全ではない。これは欠点ではない(むしろ「チューリング完全になってしまう」ことは、DSLの設計として失敗とみなされることすらある。目的のドメイン専用であること、すなわち汎用ではないことが本来のDSLの「身上」と言える)。つまり、ドメイン固有言語は何にでも汎用的に使えるわけではない。たとえば、表計算ソフトは電子メールを送るのに使えないし、電子メールで銀行口座の残高は計算できない。記述対象を絞るDSLは、宣言型と相性が良いと言える。

DSLの対象領域についてはDSLを使い、その他は汎用のプログラミング言語を使うといった利用法もある。これには2種類の呼出し方向がある。即ち、汎用言語中からDSLを使う、という方向と、DSL中から汎用言語を使う、という方向である。何らかの汎用言語中のライブラリないしフレームワーク的に実装された、いわゆる内部DSL(embedded DSL、埋込みあるいは組込みDSLとも)はそのような利用法に便利である。一方で内部DSLは、実装する言語の構文の制限などに縛られることなどから記法に難がある場合もあり、専用の記法を設計できるという点はいわゆる外部DSLのほうが有利である。

宣言型プログラミング的側面を持つフレームワーク:

宣言型プログラミングをサポートするドメイン固有言語:

宣言型プログラミングをサポートする関数型/論理型/制約型のプログラミング言語:

関連項目

参考文献

外部リンク