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

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の本来の目的はビルドではないと思う