宣言的という言葉について

Posted on November 17, 2014

プログラマ同士の会話でつい「宣言的」という言葉を使ってしまう。定義が曖昧なのにも関わらず、だ。試みにこの言葉の定義を考察してみようと思う。1

まず、日本語版Wikipediaの定義を確認する。

第1の定義によれば、ある出力を得るにあたってそれを作成する方法ではなく、出力の性質を記述することを「宣言型」と称する。[snip]別の定義では、純粋関数型言語/論理プログラミング言語/制約プログラミング言語で書かれたプログラムを「宣言型」と称する。

第一の定義はメジャーであるが、解釈の余地がありすぎて定義として優れていない。第二の定義は、ここでしか見たことがないし、無意味な定義だと思う。言葉を定義する本当の目的は、思考の緻密化・コミュニケーションの円滑化であるから、それに役立たないような定義は定義ではない。つまり、両方とも曖昧すぎるのだ。

次に、英語版Wikipediaの定義を確認する。

  • A program that describes what computation should be performed and not how to compute it
  • Any programming language that lacks side effects (or more specifically, is referentially transparent)
  • A language with a clear correspondence to mathematical logic.

最初の二つは日本語版の定義とほとんど同じであるが、第三の定義は良さそうに見える。曰く、「数理論理学に明確な対応を持つ言語」を宣言的だと言うのである。要するに、プログラムの文なり式なりを論理式として解釈できるかどうかを問うているのだ。

しかしこれでもまだ不十分に感じる。私の目標は、定義の曖昧さに起因する誤用・濫用を避け、「宣言的」という言葉を高遠なままにしておくことである。個人的な感情が入り込み過ぎていることは理解しているが、PrologやDatalogなどの論理型プログラミング言語に多少なりとも感銘を受けた一人として、そういうことを主張したいのだ。

それで、肝心の定義だが、以下のようでどうだろう。

  1. 問題の記述能力が十分に高い
    • 一階述語論理並の表現力がある
  2. 記述された問題を論理式として解釈する
  3. 論理式からモデルを探索することを目的とする
    • 探索の方法は問わない

PrologやSQLは当然この定義に当てはまる。Prologの場合、ホーン節・単一化・導出原理がすべて(1)(2)(3)に関係する。SQLの場合、SQLの基礎理論であるリレーショナルモデル(と述語論理の対応)が(1)(2)に関係し、RDBMSやオプティマイザを利用して目的を達成することが(3)に関係する。

一方で、Mavenを考えてみる。Mavenはよく「宣言的」だと言われる。2Mavenの元々の目的であるモジュールの依存関係の解決においては、そう言ってもかまわないだろう。見方によっては、MavenはただのSATソルバーフロントエンドなのだ。当然、SATソルバーは上記の定義に当てはまるから、Mavenも同じように当てはまるという理屈が成り立つ。

しかし、実際のところMavenはひどいものである。pom.xmlの記述力はかなり貧弱であるし、ビルドツールとしてのMavenの出来は最悪である。3だから、Mavenを「宣言的」と呼べてしまうのは心が苦しい。この問題を回避するために、上記定義には(1)が設けてある。つまり、この定義ではMavenは「宣言的」でないのだ。必要があればダウンローダー+SATソルバーフロントエンドとでも呼んでおけばいい。そちらの方が正確だし混乱しない。

以上で考察おわり。後日、「宣言的」ビルドツールの話をするかもしれない。


  1. 当然ながらプログラミングの文脈を想定している

  2. 公式はそのように主張していない思われる

  3. もちろんMavenの本来の目的はビルドではないと思う