名付けの恣意性

Daichi Mochihashi
daiti-m@is.aist-nara.ac.jp
April 4, 2001

I. プログラミング

プログラムを書いていて、変数をどんな名前にするか、迷ったことはないでしょうか。 適切な変数名/関数名はプログラムを読みやすくし、ある場合には 'self-documenting' にすらします。しかし、たとえどんな名前を付けたとしても、 論理的にはプログラムの実行には何の影響もないのです。

大学で初めて私がプログラミングを学んだとき、最初に戸惑ったのはこの点でした。 変数や関数の名前はその内容と無関係に、勝手に決めることができる一方で、 一度付けた名前はその後は一言一句間違えずに使わなければならないのです。 何という自由と何という狭量!ここでは名前は一見言語のようでありながら、 言語の持つ意味的融通や曖昧性をすっかり奪い取られ、同一性を示す単なる記号 と化しています。

たとえば、階乗を計算する関数は普通 scheme (Lisp) では下のように書かれます が、

(define (fact n)
  (if (= n 1)
      1
      (* n (fact (- n 1)))))
ここで引数は整数だからといって 'n' である必要はなく、'p' にしても全く同じ ように機能します。
一見引数は確率のように見えますが、全くそうではありません。
(define (fact p)
  (if (= p 1)
      1
      (* p (fact (- p 1)))))

> (fact 7)
5040
また、以下は全く別のプログラム?に見えますが、実は階乗を計算します。
(define (forever you)
    (if (friend you me)
        me
        (call you (forever (lover you me)))))

(define friend =)
(define me 1)
(define call *)
(define lover -)

> (forever 6)
720
さらに名前を置き換えれば、以下のようなプログラムでも階乗を計算することが わかります。
(define moe =)
(define pugya *)
(define doe -)
(define uga 1)

(define-macro (muha . body)
    `(if ,@body))
(define-macro (puha . body)
  `(define ,@body))

(puha (hoge boe)
      (muha (moe boe uga)
            uga
            (pugya boe (hoge (doe boe uga)))))

> (hoge 7)
5040
> (hoge 44)
2658271574788448768043625811014615890319638528000000000
ここまでくると、ほとんどプログラムのようには見えません。ただ, scheme のモデル となっているλ-式の世界では、自然数、関数、条件分岐などのすべてがλ-式に よって書き表され得ることを考えると、これは当然の結果であるともいえます。 つまり我々は、λ-式によって表される論理式に単に名前をつけて扱っている だけで、その名前と論理的実体とは完全に別の、分離したものなのです。
このことは、Cプログラムをコンパイルして生成されるアセンブリ言語のソースや、 さらにそれを実行する際の2進文字列の難読性を考えても明らかでしょう。高 度なプログラミング言語ほど「自然言語化」を志向することを考えると、これ は逆説的な事実です。

それでは、プログラミング言語における名前の意味とは 一体どこにあるのでしょうか。

II. プログラムの詩学

プログラミング言語は現在のところ、基本的に文脈自由文法(CFG)に基づいて 定義・解釈され、実行されます。しかしすでに見たように、解釈された論理式 はそのままでは我々の理解を超えており、我々はこれを見つめてプログラミン グしていないことは明らかです。むしろ、我々は論理式の向こうに、体験に基 づいた触知的な概念を見ており、それをCFGの上に乗るように試行錯誤してい ると言った方が適切ではないでしょうか。
しかしながら概念の豊かさに比べて、CFGの記述能力は非常に限定されているため, この試行錯誤は必然的に、文法に依拠する概念記述を超えて、語彙的記述によって 直接に概念を記述する経路を生み出すことになります。(図) そしてこれこそが、言語の詩的機能にほかなりません。

図: 言語と解釈

Jakobson は「言語学と詩学 *」の中で、「記号と対象の 間の根本的な二分関係を深化する」ものが詩的機能であり、 「詩的機能は(意 味的)等価の原理を選択の軸から結合の軸へ投影する」と述べていますが、表 現の絶対化を志向する詩にとって、結合の軸=連辞へ展開されるリズムが 表現の触知性を高めるのと同様に、 選ばれた言葉、緊密な表現によって一つ一つの言葉それ自 体の触知性を深めることも詩的機能のもう一つの要素だと言っていいでしょう。
これは、選択の軸、すなわち範列的機能の特質である等価性を 連辞的軸に投影したのとちょうど逆に、連辞的機能の特質である構造的意味を 範列に投影したと解釈することもできます。

このように見たとき、言語に内在する記号と内容の乖離を詩が超えようとす るのと同様に、われわれはプログラミング言語においても詩的機能によって表 記と、その表す概念とを架橋しようとしていると言えないでしょうか。
計算機の論理は人間の持つアナログ的思考から結晶化された、本来的に異質な ものです。その理解のためには、我々は論理そのものではなく、概念へとつな がってゆく詩的機能に大きく頼らざるを得ません。

III. おわりに― 形式言語

形式言語の立場から見れば、この問題は句構造文法(PSG, 0型文法)を持つわれわれが、 思考を部分集合であるCFG(2型文法)に適切に射影するために、その射影法を適切に選ぶ ことが 必要だからだという見方も可能でしょう。

しかしながら、ここで前提された "自然言語はPSGで記述できる" という テーゼこそが、プログラミング言語の非言語性を隠蔽してきたように思われます。 この立場に立つならば、二者の違いは文法の階層のみであり、「PSGによって 自然言語が解析できる」のと同様に、CFG によって自然言語表記された プログラミング言語が解析でき、意味が表現できるという見方が生まれるように 思えるからです。

しかし、普通に考えればわかるように、日々変化し、使用者によって異なる 自然言語は固定された文法によって解析することはできません。 むしろ、そうしたずれを常に生み出し、規則を産出しまた破壊する能産性こそが 自然言語の豊かさの源泉なのですから、プログラミング言語と自然言語の間には 本質的な溝があり、われわれは詩的機能によってその間隙を跳躍しようと 試みていると言えるのではないでしょうか。

(*) R. Jakobson, 『一般言語学』. みすず書房, 1973.

付録:

上で述べたプログラミング言語の '非言語性' を明らかにするために、 上の scheme プログラム のような変換をC言語のソースに対して行う "obfuscator" を書いてみました。 別ページをどうぞ。


daiti-m@is.aist-nara.ac.jp
Last modified: Sat Apr 7 02:33:43 JST 2001