宣言型プログラミングとは、定義を宣言する形でプログラミングしようとするプログラミングパラダイムである。
概要
関数型言語では、宣言型プログラミングと言って物事の関係性を「宣言」する形でプログラミングするスタイルが奨励されている。発想としては論理型言語と似ている。
オブジェクト指向で挙げた例にあわせて、動物園の飼育員(コンピューター)へのマニュアル(プログラム)に例えて書くと以下のような雰囲気になる。
社訓
以下の3点に着目したい。
- オブジェクト指向では、「虎A, B, Cに餌をやる。」という飼育員への作業命令が主文であったのに対し、宣言型プログラミングでは「全ての虎は満腹になっていなければならない。」という「目的」の「宣言」が主文となっている。
- 他の文も定義を「宣言」しているだけで、飼育員に「何をしろ」とは言っていない。
- 宣言の順番が変わっても意味は変わらない。
さて、このマニュアルを受け取った飼育員はどのように行動するのか。
- 全ての虎は満腹になっていなければならない。 → 「全ての虎」って何?
- 当園には虎A, B, Cがいる。 → ああ「虎A, B, C」のことね。
- 虎に餌を与えると満腹になる。 → 満腹にするには「虎A, B, C」に餌をあげればいいのね。
- 満腹の虎に餌を与えると死亡する。虎を死亡させてはならない。 → おっと、満腹の時には餌をあげないようにしないと。
- 虎は空腹か満腹かのいずれかである。 → なるほど。満腹でない虎、つまり空腹の虎にだけ餌をあげればいいのか。
ということで、この飼育員は虎A, B, Cのうち空腹な虎にのみ餌をやるという行動を取る。実際のプログラミング言語処理系はここまでは忖度してくれない。
賛否
「目的」と「定義」だけ順不同で「宣言」さえすれば、作業内容を指示しなくても自動的に動作が組み上がる優れたプログラミングパラダイムであるという主張がある。そのような文脈では、命令を記述しない宣言型プログラミングに対し、コンピューターに対する命令を記述する従来のスタイルを命令型プログラミングと呼んで区別する。
一方で、宣言型プログラミングでは定義から実際の動作を予想するのが難しく、動作内容やアルゴリズムを細かく制御することが困難になるという批判もある。
参照透過性
宣言の順番は関係ないと書いたが、再代入により宣言に使われている変数の中身が変わってしまうと、その宣言が使用されるタイミングによって宣言が正しくなくなる場合が出てくる。
いつ実行されても結果が変わらないことを保証するには、変数がイミュータブルである参照透過性が必要になる。
リアクティブプログラミング
変数は参照透過でなければならず、再代入で変化してはいけないと書いたが、これでは状態変化を扱うことが難しくなる。そこで出てきた方法論の一つが、リアクティブプログラミングである。
リアクティブプログラミングでは、「常にaはbの2倍である」のような変数が変化しても成り立つ「関係」を宣言するという方法で変化するものを取り扱う。
代表的なものにWebフレームワークのReactやMicrosoft社が提唱したRectiveXがある。
関連項目
- 0
- 0pt

