はじめに

田中久美子『記号と再帰: 記号論の形式・プログラムの必然』(“Semiotics of Programming,” Cambridge University Press, 2010.)は,プログラミング言語の記号論についての記念碑的な書籍である.かねてよりPeter B. Andersenらによってコンピュータ記号論(computional semiotics)は語られていたものの,プログラミング言語については議論が追い付いていなかった.
本書はまず,対応関係が不明瞭であったソシュールの記号論とパースのそれとを,関数型パラダイムとオブジェクト指向パラダイムとの対比をもって整理する.その上で,記号の本質は再帰にある(p.1)として,絵画,プログラミング言語,哲学を横断した考察が展開される.とまあ随分と衒学的な書籍なのだが,それゆえ危うさを孕んでいるようにも思う.ここではあえて,本書の批判とはいかないまでも,いくつかの不満点を提示したい.

汎記号主義

本書は「記号を媒介することなく対象を人間が認識できない」(p.27)とされ,「記号の解釈を記号系の中だけで捉える」(p.26)という汎記号主義を前提としている.この妥当性について考えても埒が明かないので,ひとまずはそういうことにしておこう.

HaskellとJavaによるプログラム例

本書で用いられるプログラミング言語は,HaskellとJavaである.
以下はHaskellによる平面上の長方形,楕円,円の面積を計算するプログラムである(p.15).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
data Shape = Rectangle Double Double
| Ellipse Double Double
| Circle Double
area (Rectangle width height) = width * height
area (Ellipse width height) = pi * width * height / 4.0
area (Circle radius) = area (Ellipse (radius * 2.0)(radius *2.0))
main = let
r = Rectangle 5.0 8.0
u = Ellipse 3.0 4.0
v = Circle 3.0
ss = [r, u, v]
in
for (\s -> putStr("area: "++show (area s)++"\n")) ss
for f [] = do return ()
for f (s:ss) = do { (f s); for f ss}

いきなり不安になってくる.Haskellについてはずぶの素人の私だが,それでもこのような場面ではforMmapMを用いるべきだと知っている.「このfor関数は,次の図2.2のJavaプログラムとの整合性をふまえて定義されている」(p.17)とあるが,首を傾げざるを得ない.なおmapはp.141に至るまで登場しない.
続いて,同様にJavaによるプログラムが示される(p.18).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Shape{
double width, height;
Shape (double w, double h){ width = w; height = h; }
public double area () { return width * height; }
}
class Rectangle extends Shape{
Rectangle (double w, double h){ super(w, h); }
}
class Ellipse extends Shape{
Ellipse (double w, double h){ super(w, h); }
public double area(){ return Math.PI*width*height/4.0; }
}
class Circle extends Ellipse{
Circle(double r){ super(r*2.0, r*2.0); }
}
void run(){
Rectangle r = new Rectangle(5.0, 8.0);
Ellipse u = new Ellipse(3.0, 4.0);
Circle v = new Circle(3.0);
Shape [] ss = new Shape[]{r, u, v};
for (Shape s : ss){ putStr("area: " + s.area() + "\n"); }
}

これらのプログラムは異なるパラダイム,異なる記法によって書かれているが,しかし同じ出力を得ることができる.ここに本書は,ソシュール二元論とパース三元論を託つける.

ソシュール二元論とパース三元論

ソシュールとパースはそれぞれ記号について以下のように整理した.

  • ソシュール二元論
シニフィアン シニフィエ
“tree”
ラベル 内容
  • パース三元論
表意体 解釈項 対象
“tree” 木の解釈
ラベル イデア 対象

この対応について,本書は,パース「記号は人に働きかけ,人の心の中に等価な記号を作り出し,あるいはより発展した記号を作り出す.もとの記号が作り出すこの記号のことを私は解釈項と呼ぶ」を根拠に(p.40),「解釈項は記号の解釈を呼び,記号過程を生成するもので」あり「これに対応するものがソシュールの記号モデルの中にあるならば,それはシニフィエ以外にありえない」(p.41)と導く.
続いて,「記号の差異は他の記号と対比されてはじめて立ち現れるものである.とすると,記号の解釈にまつわる記号の使用はソシュールの記号モデルの構成要素には含まれてはいなが,全体論的価値として位置付けられていると考えることができる」(p.41)ことから,「ソシュールのシニフィエはパースの直接対象に対応し,そしてパースの解釈項はソシュールの記号モデルに外在する全体論的価値に内包される」(pp.41-42)という仮説を提示する.

全体論的価値

関数型パラダイムとオブジェクト指向パラダイムの比較を通じて仮説を検証する前に,この「全体論的価値」とは何を意味するのだろうか.おそらくは意図的なのだろうが,本書にはパロールやラング,レフェランといった語が一切登場しない.これによって混乱してしまったのは私だけだろうか.記号論についてもずぶの素人である私の苦し紛れの解釈では「全体論的価値」はラングに相当するが,詳細は述べられていない.ソシュールの「言語記号は恣意的です」という原理も後に登場する(p.57)が,社会的慣習と全体論的価値が絡められることはなかった.

ソシュール二元論とパース三元論の接続

さて,ソシュールとパースの関係は,先に挙げたプログラム例のarea関数のあり方によって整理される.

プログラミング言語 Haskell Java
記号論 二元論 三元論
area関数 外在的 内在的

Haskellのプログラム例では,areaは他のデータ構造に外在するが,Javaのプログラム例では内在する(p.42).言い換えれば,Haskellにおいては記号がその使用によって意味付けられるが,Javaにおいては記号の定義がその使用を内在する.つまり,次のような対応関係になる(p.49).

  • ソシュールのシニフィアンはパースの表意体に対応する.
  • ソシュールのシニフィエはパースの直接対象に相当する(心的な対象).
  • パースの解釈項は識別子の使用に相当する.パースの記号モデルでは,記号の使用は解釈項として記号モデルの中に埋め込まれ,記号過程は解釈項を次々と呼ぶことによって生成される.ソシュールにおいては,記号過程は記号が別の記号に呼ばれ,それがまた別の記号に呼ばれることにより生成される.ある記号の使用によって記号に付される価値は記号モデルに外在し,それは記号を併置した際の差異として現れる.

こうして,ソシュールとパースの論が接続された.なるほど綺麗にまとまったかのように思える.

プログラミングパラダイム

しかし,これはプログラミングパラダイムから見て妥当だろうか.HaskellやJavaに固有の特徴と,パラダイムの特徴を同一視していないだろうか.本書において,HaskellやJavaを選択した基準は最後まで明確に示されない(私はJavaScriptが良いのではないかと思った).
CTMCPこと『コンピュータプログラミングの概念・技法・モデル』(“Concepts, Techniques, and Models of Computer Programming, “ The MIT Press, 2004.)のPeter Van-Royによると,オブジェクト指向パラダイムとは関数型パラダイムに状態(state)を追加したものである.私はこの考えに沿った展開に期待していたのだが,しかし状態の概念はp.190に至るまでほとんどといって触れられず,HaskellとJavaの比較に絡められることはなかった.
オブジェクト指向すなわちカプセル化という前提に立っているところ,プロトタイプベースのオブジェクト指向について触れていないところも勿体無い.

モナドと状態

状態の概念は,「インタラクションを参照透明に記述しようと思うと,」「莫大な量の記号を使い捨てなければならない」(pp.198-199)からこそモナドが考案されたという流れで援用される.すなわち,参照透明性を保ちつつ状態を記述するためにモナドがある(p.196).失敗系モナドが無視されているにせよ,このあたりの説明が明快なだけに,HaskellとJavaの比較において状態の概念が持ち出されなかったことが残念に思われる.

参照の値渡し

本書はJavaを「関数に値とアドレスのどちらかを渡すのかは,再び文脈により実用論的に決まり,」「プログラマが定義して導入する複合型」は「アドレスを渡す」ものとして紹介している(p.117).これは端的に誤りである.なぜなら,Javaはあらゆる場面において値渡しであり,参照は参照の値(reference values)として扱われるためである.

おわりに

主にプログラミングの観点から,『記号と再帰』に見られる不満点を述べた.要約すると次のようになる.

  • Haskellのコードが微妙
  • 全体論的価値の定義が不明瞭
  • HaskellとJavaを題材に選んだ根拠が不明瞭
  • Javaの参照の値渡しについての説明が不適切

だからといって私は本書が駄本であると切り捨てたいわけではない.
シニフィアンを持たない状態で分節されたλ項にシニフィアンが付与されていく簡約の過程は大変面白かったし,再帰から是態(交換不可能性?)が立ち上るという考えも論証不足ながら興味深かった.
汎記号主義という極端な見地から,記号が投機的に記号系に導入されるからこそ再帰が成立すると言い切ることで,ここまで手際よく語ることができるのかという興奮があった.
だからこそ,(今後本書が重版されることがあればの話だが)今回述べたような不満点が解消されることを望む.
終盤に本書は,「何ら形式的な制約なく自然に作られた」自然言語の構造的な系と,「停止性が保証される最小の記号群からはじめ,停止性の制約下でボトムアップに構築される」プログラミング言語の構成的な系とを対比している(p.183).再帰による是態の獲得.構造的な系.次に語られるのはニューラルネットの記号論だろうか.

参考文献