宣言型プログラミング
宣言型プログラミング(英: Declarative programming)は、プログラミングパラダイムの名称だが、2種類の意味がある。第一の意味は、処理方法ではなく対象の性質などを宣言することでプログラミングするパラダイムを意味する。第2の意味は、純粋関数型プログラミング、論理プログラミング、制約プログラミングの総称である。
目次 |
概要 [編集]
第1の定義によれば、ある出力を得るにあたってそれを作成する方法ではなく、出力の性質を記述することを「宣言型」と称する。例えば、HTMLは、ページがどう見えるかを記述するものであるため、宣言的である。HTML はタイトルやフォントやテキストや画像を指定するが、具体的にコンピュータの画面にどう出力するかは記述しない。この手法は、FORTRAN、C言語、Javaなどといった命令型プログラミング言語とは全く異なる。命令型では、プログラマは実行すべきアルゴリズムを明確に記述しなければならない。つまり、命令型プログラムでは目的を達成するためのアルゴリズムを明示的に示し、宣言型プログラムでは達成すべき目的(出力)を明示的に示して、それを実現するためのアルゴリズムはソフトウェア(言語処理系)に任せる(例えば、SQLの select 文は選択すべきデータの属性を指定し、データ選択の方法は示さない)。1960年代からIBMが事務用プログラミング言語として展開したRPGは、制御部にデシジョンテーブルが使われていて、そのため宣言型に分類されたこともある。
別の定義では、純粋関数型言語/論理プログラミング言語/制約プログラミング言語で書かれたプログラムを「宣言型」と称する。この立場では、「宣言型プログラミング」とはそのようなプログラミング言語のグループ全体の総称であり、命令型言語と対立する概念である。
この2つの定義はある程度オーバーラップしている。特に制約プログラミングでは、解の性質を記述することに注力し、解を求めるためのアルゴリズムは特に指定しないこともある。論理プログラミングにもその傾向がある。とはいっても、制約プログラミング言語や論理プログラミング言語でもアルゴリズムや実装の詳細を記述することは可能であり、第1の定義でいう宣言型には厳密には当てはまらない。
同様に命令型プログラミング言語であっても、プログラムを宣言型のスタイルで書くことは可能である。この場合、宣言的でない詳細をライブラリやフレームワークでカプセル化するのが一般的である。例えば、単体テストのフレームワークであるJUnitでリフレクションを使ったスタイルがある。
ドメイン固有言語 [編集]
宣言型プログラミングのよく使われる形態としてドメイン固有言語 (DSL) がある。この場合の「ドメイン」とは「対象領域」すなわちその言語が記述しようとする対象を指す。DSLには、設定ファイルや表計算ソフト、さらには電子メールのヘッダ部分の記法なども含まれる。
DSLの欠点の1つとしてチューリング完全ではない(ことが多い)点が挙げられる。つまり、ドメイン固有言語は何にでも汎用的に使えるわけではない。表計算ソフトは電子メールを送るのに使えないし、電子メールで銀行口座の残高は計算できない。このため、DSL は汎用プログラミング言語に組み込まれて使われることもある。こうすることで、DSLの対象領域はDSLを使い、その他は汎用のプログラミング言語を使うといった利用法が可能となる。
単独で使われるドメイン固有言語は汎用言語に埋め込まれた場合に比較して、機能への習熟が容易であるという点で使い易い。
例 [編集]
宣言型プログラミング的側面を持つフレームワーク:
宣言型プログラミングをサポートするドメイン固有言語:
- XSLT は、XML文書の変換のためのチューリング完全な宣言型言語
- SQL は、リレーショナルデータベースのクエリのための宣言的要素を持つ。チューリング完全。
- TK Solver
宣言型プログラミングをサポートする関数型/論理型/制約型のプログラミング言語:
- 関数: Erlang、Haskell、LISP
- 論理: Prolog、Concurrent Prolog、GHC、Mercury
- 制約: Oz、Constraint Handling Rules
関連項目 [編集]
参考文献 [編集]
- Declarative language in The Free On-line Dictionary of Computing, Editor Denis Howe.
- Relational language in The Free On-line Dictionary of Computing, Editor Denis Howe.
- Logic programming in The Free On-line Dictionary of Computing, Editor Denis Howe.
- Functional programming in The Free On-line Dictionary of Computing, Editor Denis Howe.
外部リンク [編集]
- Frans Coenen. Characteristics of declarative programming languages. 1999.
- Olof Torgersson. A Note on Declarative Programming Paradigms and the Future of Definitional Programming. 1996.
- David Mertz. Declarative Programming with XML Stylesheet Language Transformations. 2001.
- Anders Norås. Declarative JavaScript programming. 2004-08-09.
- David Mertz. Advanced OOP: Declarative Programming and Mini-Languages. 2003-07-31.
- Narayanan Jayaratchagan. Declarative Programming in Java. 2004-04-21.
- N. Alex Rupp. Ruling Out: Rule Engines and Declarative Programming Come to Java. 2004-08-19.