関数型言語について議論するときの用語集(未完)

プログラミング言語やプログラミングパラダイムについて議論するとき,用語の定義を共有しないと議論が噛み合わなくなります.それで以下に私が日頃関数型言語について議論したり考えたりするときに暗黙で使っている定義(ここでは厳密なものではなく,このよように私は考えているという程度のもの)を挙げておくことにします.関数型言語に関連する議論をするときにこの定義をそのまま利用する必要は当然ありません.議論の際に共有するべき概念や用語のチェックリスト,あるいはズレを確認するのに利用できればと思います.

私個人としては用語の使い方としては妥当であると思っていますが,あやまった理解,あやまった使い方であると感じられる(確信される)部分がありましたらご指摘下さい.また,説明すべき用語が抜けている場合にもそれをご指摘いただけると幸いです.

命令プログラミングあるいは命令型言語,とくにオブジェクト指向プログラミングとそれを支援するオブジェクト指向プログラミング言語との対比を意識しています.

プログラミング言語(Programming Language)
プログラムを記述するための文法(syntax)と記述された意味(semantics)を定める規定とを指すものとして使う.単に「言語」とだけ表示することもある.
言語処理系(Programming Language Processing System)
特定の言語で書かれたプログラムで表現された計算を実際のコンピュータ上で実施するための仕組み.コンパイラインタプリタ,ランタイムを含む.

N.B. 処理系の性質とプログラミング言語の性質とは別物として分けて考えている.

関数型言語(Functional Programming Language)
広義には関数プログラミングというプログラミングスタイルでプログラムを記述するための言語という意味で使う.少くとも関数を計算対象として記述できる(=高階関数を扱える or =関数が第一級市民である)ことを仮定する.(ただし,できるだけ例外なく単純に思考を表現したいので,理想とする関数型言語にはさらに別の抽象化能力を暗に要求する.)プログラムの意味は値によって表現されるものとする.
関数プログラミング(Functional Programming)
関数適用によって計算を表すプログラミング手法.(気分としては関数適用指向プログラミング.)関数適用の結果としての値を構成することが目的.
関数適用(Function Application)
関数を引数に適用すること.関数に対して変換元の要素を実際に指定して変換先となる値を示すこと.
関数(Function)
指定した集合の元から指定した集合の元への変換操作をあらわす値

オブジェクト指向言語オブジェクト指向プログラミングについては以下のように考えている.オブジェクト指向プログラミングについて誤解していた.)

オブジェクト指向言語(Object Oriented Programming Language)
広義には(広義にしか使わない)オブジェクト指向プログラミングを支援するためのプログラミング言語と考えている.少くとも生存中不変のIDと生存中可変の内部状態との両方をもつオブジェクトを記述できることを仮定する.プログラムの意味はオブジェクトの内部状態によって表現されるものとする.
オブジェクト指向プログラミング(Objectl Oriented Programming)
オブジェクトという計算対象の相互作用として計算を表す手法.相互作用後の(特定の)オブジェクトの内部状態を知ることが計算の目的.になにか仕事させてその結果をえることが計算の目的.

追記

純粋関数型言語(Purely Functional Programming Language)
「純粋に関数的な」言語とは,式は値を表す(denote)するだけで,すべての式は「参照透明性(referential transparency)」であるような言語.
参照透明性
言語の性質(not 言語処理系の性質ではない)で式の値はそれを構成する部分式の値でのみ決まり,部分式は同じ値であれば別の式で置き換えても全体の値は変らないという性質をもつこと.