2016年前期特殊講義「ITと哲学」資料  2016.05.02 ver.20160509 

前回までの資料より(少し変更してある)

プラトン・アリストテレスの哲学とオブジェクト指向アーキテクチャ

この話は、比較的有名で、カナダのコンピュータ学者と哲学者によるアカデミックな論文などもあるし、主に二回生向けの講義「論理学の歴史」(後期月5)で毎年話している内容。

ただし、ここでは「論理学の歴史」より詳しく話す。

まずは、すべての哲学の出発点ともいえる、プラトンのイデア論とアリストテレスの形而上学・存在論の話から。

最初はイデア論の説明から始める。

プラトンのイデア論

プラトンは、「本質」のようなものが、我々の生々流転する世界の背景にあり、それがイデアの世界だと考えた。

というより、むしろ、そちらの方が真の存在だとプラトンは考えた。(有名な洞窟の比喩:興味のある人はこちらを参照)

そういう真の存在としての理想の存在がイデア。

プラトンのイデアのモデルは、数学だったと言われている。数学者は数や、代数構造、高次元空間、層、圏などと呼ばれる極めて抽象的な存在をあたかも目の前にあるように感じて考えている。時には手を出して掴むことさえある(林の経験。掴みながら考えると分かり易くなる。)

例えば、という概念の内の、連続関数や正則関数の芽の層、などというものは、ある意味で無限次元空間、などというと次元が足りないくらいに複雑で抽象的なもの。数学を実際にやったことがない人には断片的な想像すら難しい存在。しかし、林は、これと論理学の関係を研究していた1980年代(20代)のころは、これを黒板に書いて、仲間と議論をしていた。

こういうものに人間は慣れる。

こういう「慣れ」の存在は「抽象的概念」だけではない。Brain Computer Interface (ブレイン・マシン・インターフェースともいう。Wikipedia)という工学・心理学の分野があり、考えただけでロボットのアームを動かすことができるようになっている。デモ。まるで念力!IT魔術説の他の一例。

この分野では最初、人間が腕や手をコントロールするやり方を神経の働きのパターンとして検出し、それで機械を動かそうとしていた。ところが、数年前、アメリカの研究グループが、「自然状態」では人間の頭脳には備わっていないパターンのコントロールの方式を、人間の脳が学習して作ってしまうということを発見した。たとえば、さっきのデモでは、人間が頭脳の中の思考で(多分、腕の神経や筋肉の電気信号などもつかっているらしいが)、自分に本来備わっている5本の指の様に、ロボットの指を動かしていた。これが8本の指とか、指ではなくて電動ドリルのような工具とかを、自分の肉体の一部のように動かす能力を、機械と頭脳の間のインターフェースをつけて訓練すると、頭脳が作り上げてしまえるということ。これは道具を身体の一部のように使いこなす「職人」と呼ばれる人たちの存在や、自分が自転車などを乗りこなしているとこの感覚を思い出せば、実は、それほど非日常的なものでないことがわかる。

人間の頭脳には数学の抽象概念とか実際には機械や器械である「身体の一部」など、「この世のものではないもの」を、「この世のもの」と同じように感じ扱える能力があるらしい。

その様な状態になると、数学者の様に寝ても覚めても数学の世界に浸っている場合は、抽象の方が普通の意味での具体より、より具体的になるし、義足を体の一部だと思ってしまう。

この「現実の世」にない理想が、我々の目の前にあるスクリーンや机と同じように「存在する」と言ったのがプラトンで、それには違和感が伴う人が多いのだが、一度、自分で経験してみると、現実感が生まれ当たり前と感じるが、自分で経験しない限り、この感覚は分かり辛い。

イデアと対象

イデアには、たとえば、一般名詞「人間」であらわせるようなもののイデアもあるが、「赤のイデア」のような形容詞が表すもののイデアもある。

そして、この赤い文字列と、この赤い文字列は二か所にあるので、別の「赤い文字列」だが、「赤い」のイデア、さらに言えば「赤のイデア」を共有していると考えた。

上の二つの赤い文字列は、赤のイデアを分有している文字列である。その故に、それは赤い。

イデア論の詳しい説明

ドイツ語の Wikipedia の項目 Ideenlhere の図を使って説明する。

その図とは、次のもの。ただし、Ideen Gegenstände という単語より上の部分は説明しない。この上の部分は認識論に関係する部分なのだが、この講義では存在論・形而上学だけを問題にし、認識論部分は考察しないため。

Ideenlehre

この資料の上の方にある和訳の表:

  1. Gegenstände: 対象 英語では Object
  2. Ideen: イデア
  3. Urbild: 原型、原像
  4. Abbild: コピー
  5. Teilhabe: 分有(哲学用語。田辺元、西谷啓治など、京都学派もこれを使ったが、他に融即という訳語もある。)
  6. Gegenwärtigkeit: 現実化(これの平均的訳語がわからないので林が考えた訳語)

イデア論の概要

個々の人(アメリカ大統領のオバマ、私、あなた、…)、個々の三角形は、Gegenstände: 対象と呼ばれる存在である。

この対象の様な現実的・現世的 vergänglich なものに対して、Ideen (Idee の複数形) 、イデアは、非現世的 unvergänglich である。

対象は、人が個性をもち、様々であり、また、成長したり老衰するように、常ならぬもの veränderlich である。

これに対して非現世的なイデアは、unveränderlich、つまり、成長も老衰もしない、変化せず絶対的な存在である。

個々の対象である個々人が、人である所以は、一個一個の対象としての人が、人のイデアという存在に分有する teilhaben, participate からである。

これは、逆に言えば人のイデアが、一つの対象である個人に現実化 Gegenwärtigkeit していると言える。

その意味は、原像、原型 Urbild であるイデアから、その一つの像 Abbild としの対象が生まれているのである。

アリストテレスの違和感

ところがプラトンの弟子アリストテレスは、このイデア論を次のように批判した。

また、プラトン自身が書き記しているThird Man Argumentと呼ばれる批判もあった。

これらの批判のもとに、アリストテレスは、プラトンのイデアを、対象(オブジェクト)の集合、あるいは、その記述である term に置き換えた。

そうして出来たものが、アリストテレスの哲学、それは、近代以降、アリストテレス論理学と呼ばれているものと大きく重複する。

そこで、アリストテレス論理学の話を少しする。

アリストテレス論理学と Term

この図で、人の写真の周りに、「線引き」がしてあって、人と人でないものを分けている。この外と内を分ける線は一種の境界、壁、柵のようなもので、これが西洋の論理に特有の term (ラテン語 terminus, 古代ギリシャ語 horos)という概念をシンボライズしている。

要するに、特定の対象(複数でも単数でもよい)を、それ以外と分かち、その分別したものに名称を与えたものが term 名辞だと思えば良い。(歯切れが悪いのは、Port-Royal 論理学では、これに明瞭な定義がないから。これは後で見る。)

「名称を与えたもの」と言う所を無視すれば、term とは、高校までの数学で学習した、集合、現代の記号論理学のさきがけとなった1903年のバートランド・ラッセル著 The Principles of Mathematics の用語を使えば class であると考えられる。集合ならば、数学的なのだから、イデア論のような「神秘的」な要素はないはずで、アリストテレスは、現代では数学の一部となっている集合という概念でイデアを置き換えようとしたと考えられる。それがアリストテレス論理学。

しかし、そのアリストテレス論理学も、実はイデア的なものを完全には払拭していなかった。

それが compréhension という概念。

compréhension は、étendue と対をなす概念。この対を以下で説明する。

compréhension とétendue

この対概念の説明の原文は、Google Books でのフランス語のポール・ロワイヤル論理学1763年版で読める。しかし、林はフランス語がダメなので、英語でやります。

これが英語だと、 comprehension (内包)と、extension, extent (外延)になる。

これを標準的伝統的論理学の最初のスタンダードとされている、17世紀のポール・ロワイヤル論理学英訳(Google books で完全に読めるもの)と、京大内で閲覧できる別の英訳(電子書籍)で確認する(後者は、古い活字なので、s が f のように見えることに注意)。

Google Books の方の英訳

Kuline から読める電子アーカイブ、

要するには、comprehension というのは、三角形の様な概念が持つ属性 attributes の総体。我々は後に、この属性 attributes という言葉を Java などのオブジェクト指向言語の説明で見ることになる。

一方で、extension, extent というのは、個々の三角形の総体。つまり、高校数学(数学A?)で習った「三角形の集合」のことだと思えばよい。

高校のとき、おそらく、集合の内包的定義、外延的定義、というのを学習したのではないかと思う。

しかし、extension の方は、集合という概念を納得していれば、納得できるが、comprehensionというものは、なんとなく座り心地が悪い。Triangle の comprehension の説明で、最後が、etc. となっているように、何が attributes なのかと言われてもはっきりと答えられない。

一方で、extension 外延の方は、高校数学を知っていれば、直にわかる。特に、有限個の対象しかない場合には、イデア論の the third man argument のビデオで見た、人を囲む線をイメージすれば、その意味が納得できる。つまり、高校数学でならう、いわゆるベン図 Venn diagramと同じものになっている。

Term, Idea: イデアの代替物

先に、term 名辞についての歯切れの悪い説明をした。これを詳しく見る。

最初に言語上の注意:英語ではイデア論を theory of forms といい、idea は日本語でいう「イデア」の意味ではあまり使われない。たとえば、このスタンフォード大の哲学百科事典のプラトンの項目での idea という単語の使われ方を参照。

この項目のタイトル「Term, Idea: イデアの代替物」の idea は、プラトンのイデアではなく、上で comprehension, extent の説明の文章に出てきていた comprehension of the (an) idea, extent (extension) of the (an) idea の idea。たとえば、triangle という概念。

上に引用した1717年版のPort-Royal 論理学の59ページを見ると、term という言葉が、この idea と同じように使われている。しかも、検索してみると、それは term という言葉の初出であることがわかる。

Ideenlehre

 

プラトンのイデアは、唯物論的になっている現在の思考方法からは、気持ちが悪い、理解しがたいものだが、この term という言葉も実は理解が難しい。少なくとも、歯切れのよい定義ができない。

しかし、これがアリストテレス論理学の基礎であり、アリストテレス論理学は、Term Logic という別名さえ持つ。

元祖 Port-Royal 論理学には、定義や説明がないので、使われ方から、その意味を理解するしかない。また、この用語は、色々に定義されており、また、ヨーロッパの言語や文化と深く関係している。たとえば、この19世紀(1850年)の教本では、term を音声と関連づけて説明している。これは、言語は発話が基本であるというヨーロッパの言語観を反映している。

また、スタンフォード大の Encyclopedia of Philosophy の Aristotle's logic という項目では:

Subjects and predicates of assertions are terms. A term (horos) can be either individual, e.g.SocratesPlato or universal, e.g. humanhorseanimalwhite. Subjects may be either individual or universal, but predicates can only be universals: Socrates is humanPlato is not a horse,horses are animalshumans are not horses.

つまり、名辞 term は、二種類からなる:

  1. individual term 特称名辞
  2. universal term 通称名辞

先ほどの、term の外延 extent, extension を思いだすと、特称名辞は,一つの「モノ」しか表さないが,その extent は、「そのモノ」だけからなることがわかる。しかし、集合論とのアナロジーを使えば、それでも何かが集まっているもの,ただし,ひとつしか集まってないもの,と考えることができる.

名辞の差示すものは、特称名辞のように、ひとつでもあり得る。しかし、たとえば、シロギズムでは、特称、通称を問わず、名辞は集まり Extent をあらわすものと理解される。これが、Term Logic の、非常に大きな特徴。(ただし、もちろん、ポール・ロワイヤル論理学の時代に、集合の考え方があったのではない。逆に、最近の数学史では、論理学の extension の考えが、集合論の誕生を準備したという見方が有力となっている。参照

例で、この考え方を説明してみよう。

Three Tigers

Two Tigers

A Tiger

Set of Three Tigers

Set of Two Tigers

Set of A Tiger

 

固有名辞としての the tiger

 

集合としてのソクラテス

英語との類似性

実はこの様に考えると、英語の

の様な文章と

が同じ種類の文章、あるいは、命題として考えることができる。

たとえば、

 

この様に考えると、有名な三段論法

  1. ソクラテスは人間である。
  2. 人間は死ぬものである。
  3. ソクラテスは死ぬものである。

の三つの文章がすべて概念的に同じ構造、つまり、二つの term を連辞で繋いだ

の形であることがわかる。

日本語は、この形が基本ではないことに注意!

しかし、term は集合ではない

以上では、term の概念を、集合、つまり、正確に言えば、term の extent で説明した。しかし、これは高校数学で集合を勉強しているみなさんに教えるための方便のようなもので、正確に言うと、 term は集合そのものではなくて、あくまで言語表現を伴うもの。

そのことを如実に物語るのが、Species infima という考え方。これを説明するために、genus, species, difference という概念を説明する。

Genus, Species

先ほど、two tigers と three tigers の包含関係を考えたが、二つの universal term の間に同様の包含関係がある場合、含まれる方を Species (種)、含む方を Genus (属)と呼ぶ

たとえば、tiger 虎 という term は、animal 動物 に対して species であるし、animal は、tiger に対して genus となる。

そして、species にはなるが、genus にはならない term を Species infima と呼ぶ。

ただし、これは Port-Royal 論理学のオリジナルにはない用語。19世紀のある本で見ると、greyhound が Species infima だとある。

しかし、同時に、この犬種を色とか出身地で分類していくと Species infima でなくなると注意している。

実際に、こういうことが最近起きた例。

鮭児(けいじ)は、この15~20年ほど前にできた言葉だと説明されているので、シロザケ、あるいは、普通に日本語で鮭という term は、比較的最近に Species infima でなくなったことになる。

Difference

では、この鮭児を、一般のサケ、シロザケから分かつ(分別する)ものは何か?

このページを見てみると、生まれた場所、脂肪の比率、大きさなど、様々な特有の属性が列挙されている。

この様に、ある term に、さらなる属性を追加して、そのtermの範囲を狭めて species を作るとき、この追加する属性(複数でもよい)を、difference 種差という。

以上で伝統論理学の話を終わりにして、ここからはITの話

これまでは、たとえなどに使ったりしたが、ITの話はしておらず、伝統論理学の話だけだった。

ここからは、伝統論理学の考え方と比べるITの概念オブジェクト指向アーキテクチャの話をする。

伝統論理学には、これ以外に四原因説(これは後にやります)や三段論法の理論など、様々な要素があるが、ここから示していく、オブジェクト指向アーキテクチャとの比較では、いままでに説明した範囲の知識で済む。

そして、いままでに説明した伝統論理学の概念、term, オブジェクト、difference、genus-species、species infima などにあたるものが、オブジェクト指向アーキテクチャに存在することを確認する。

さらには、面白いことに、オブジェクト指向アーキテクチャでは、プラトンのイデア論的な現象が起こることを確認する。

つまり、オブジェクト指向アーキテクチャは、アリストテレス哲学を基調として、プラトン的要素が入っていると考えられる。

ただし、こういうことを説明する前に、イデア論のもう一つの気持ち悪さを論じておく。実は、それが上に書いたオブジェクト指向で起きるプラトン的現象であり、それは、ある意味でアインシュタインが嫌った「遠隔作用」の様な現象が起きるということ。

イデア論の気持ち悪さ再論

先に見た、この図

Ideenlehre

これの一番下から2番目の←、つまり、Teilhabe という関係は、多くの Abbild (対象)から、一つの Urbild に向かって繋がれている。

そうなると、例えば、すべての赤いモノ、例えば日本中の赤いポストや、交通信号の赤いランプが、赤のイデアを分有していることになる。

この分有を「像が原像に繋がっている」と解釈すると、像である日本中の赤いポストや、交通信号の赤いランプの一つ一つが、全部、赤のイデアを中心にして、繋がっていることになる。

これは、最初の方でやった「不気味な遠隔作用」を連想させるもので、何か神秘的なものさえ感じさせるものである。

実際、フランスの哲学者レヴィ-ブリュールは、1910年の著書 Les fonctions mentales dans les sociétés inférieures  (レヴィ・ブリュル 『未開社会の思惟』 岩波文庫、1953年)で participation mystique (神秘的融即)という概念を導入して、原始的部族における個人とトーテムの関係を説明し、これを前論理的と呼んだ。

そして、この考え方は、ドイツの哲学者マックス・シェーラー知識社会学に継承され(シェーラーは、Teilhabe という用語を使った)、さらに、それが田辺元の「種の論理」に繋がった(林の2011年西田・田辺記念講演レジュメを参照)。

これらの思想家に限らず、彼等とは対極に位置する哲学者と考えられているエルンスト・カッシーラーの思想 Inbegriff (Substanzbegriff und Funktionsbegriff, 1910, 元はカント哲学の用語)にさえ、同様の傾向がみられる、20世紀初頭における共同体志向・反近代の典型的思想である。

現代では、フランスの哲学者ジャン=リュック・ナンシーが、これらに非常によく似た議論をしている。

そして、これから始めるITの議論で、これにそっくりな「ITの初学者には非常に不思議に思える現象」を見ることになる。

本日追加の資料

ここから、

オブジェクト指向アーキテクチャ

の話。

まずは、プログラミング言語のはなしから。

プログラミング言語というもの

音楽会のプログラムは、演奏される曲が順番にならんでいるが、これは演奏家の「段取り」を書いたものである。つまり、最初に書かれた演目が、最初に演奏され、二番目に書かれた演目が、その次のに演奏され…、という「段取り」、あるいは、手順が書かれたもの。

コンピュータのプログラムは、演目ではなく、コンピュータが実行すべき仕事を指定する「命令」が順番に並んでいるのが基本。たとえば、次のプログラム(の断片)は、これから見せる「リンゴ箱」というJavaプログラムの一部:


		int answer = JOptionPane.showConfirmDialog(new Frame(), "リンゴは新鮮な方がよいですか?","お答えください",JOptionPane.YES_NO_OPTION);
		String filePath;
		if (answer == JOptionPane.YES_OPTION) {
			filePath = "./apple.jpg";
		} else {
			filePath = "./rotten_apple.jpg";
		}

		try {
			image = ImageIO.read(new File(filePath));
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("画像の読み込みに失敗しました");
		}

Java プログラムのサンプル「リンゴ箱」 と、それを利用してのプログラムというものの説明

Java program RingoBako は、この講義用に林が書いたもので、講義のページのリンク、および、このリンクからダウンロードできる。

これは大変小さなプログラムだが、Java を使って起動しないといけないので、上記のリンクでダウンロードされるサンプルには、Java の実行系を入れてある。そのために大きなファイルになっている。上記リンクからファイル2015ZenkiTokusyukougi.exe (環境によっては exe は表示されない)をダウンロードして実行すると、フォルダ 2015ZenkiTokusyukougi ができる。その中にある、RingoBako.bat (環境によっては bat は表示されない)をクリックして実行する(昨年度の講義の際に作ったので年が2015になっている)。詳しいことは、講義中に説明。

「リンゴ箱」を実行したときに現れるウィンドウをクリックすると、小さなウィンドウが現れて質問をするが、これを実行しているのが、先頭の次の部分:

		int answer = JOptionPane.showConfirmDialog(new Frame(), "リンゴは新鮮な方がよいですか?","お答えください",JOptionPane.YES_NO_OPTION);

ボタンを押して、はい、いいえ、を答えると、その結果が answer という変数に保存される。 そして、それが、はい、を表す値だったら、filePath という文字列を表す変数の値を  "./apple.jpg" に、いいえ、だったら "./rotten_apple.jpg" にせよというのが、その次の


		String filePath;
		if (answer == JOptionPane.YES_OPTION) {
			filePath = "./apple.jpg";
		} else {
			filePath = "./rotten_apple.jpg";
		}

の部分。この部分の最初の行の String filePath は、「以後、filePath という名前を文字列の変数として使う」という変数の宣言と呼ばれるもの。また、apple.jpg, rotten_apple.jpg は、それぞれ次のような画像が入ったファイル。

apple.jpg

apple

rotten_apple.jpg

rotten apple

そして、残りの部分
  try {
  image = ImageIO.read(new File(filePath));
  } catch (IOException e) {
  e.printStackTrace();
  System.out.println("画像の読み込みに失敗しました");
  }

は、filePath で指定された画像ファイルから、image という変数に画像を読み込めという命令になっている。この部分はかなり複雑だが、これは画像ファイルから、プログラムが利用できる形にするためにプログラムが画像を読み込む際に、色々な問題が起きることが多く(たとえば、ファイルを置き忘れたとか、大きすぎる、画像ファイルが壊れているなど)、読み込みに失敗した際に、どう対処すべきかという「失敗対処の命令」が書かれているため。

「ファイル filePath から画像を読み込め」という命令は、image = ImageIO.read(new File(filePath)) というところだけ。もっと正確にいえば、「ファイル filePath から画像を読み込め」というのは、ImageIO.read(new File(filePath)) の部分だけ。

ImageIO.read は、Java では、method と呼ばれるが、数学の関数のようなものだと思えばよい(実際、他のプログラミング言語では、これに対応するもの関数と呼ぶ場合も少なくない)。つまり、

ImageIO.read を f

new File(filePath)  を x

とすると、

  ImageIO.read(new File(filePath))

は、

  f(x)

という形をしていて、数学の関数の適用と同じ形。

実際、これは数学とよく似た結果を表すもので、

  ImageIO.read(new File(filePath))

は、new File(filePath) というに、ImageIO.read という method (関数)を適用して得られる「関数の」にあたるものを表している。

数学で関数を考えるときには、とは、普通は数などである。

プログラミング言語でも、数学と同じことができて、例えば、

  int answer = JOptionPane.showConfirmDialog(new Frame(), "リンゴは新鮮な方がよいですか?","お答えください",JOptionPane.YES_NO_OPTION);

の answer は、int (integer) 型の整数と呼ばれる整数値を表している。

しかし、オブジェクト指向プログラミング言語である、Java では数値の他にオブジェクトというデータを扱うことができる。

たとえば、new File(filePath) は、filePath という文字列、たとえば、 "./apple.jpg" を、

「画像ファイルの位置を示すパス(コンピュータの内部だけで使うURLのようなもの)だと理解して、それから Java の中で使うファイルのオブジェクトを作れ」

という命令。new File(filePath) の new が、「オブジェクトを新たに作れ」という命令で、この場合は、filePath が、"./apple.jpg" だとすると、

パス"./apple.jpg"により指定された画像ファイルを読み込んで、クラス File のオブジェクト File(filePath) を新たに作れ

という命令になっている。

このクラスというのは、アリストテレス論理学の Term にあたるもの。

一方で、オブジェクトは、オブジェクトである。

たとえば、Java には、先ほど見た int という整数型とは別に、Integer というクラスがあり、123 という int 型の整数に対して、

 new Integer(123)

とすると、数 123 を表す Integer クラスの対象が一つ繰り出され、new Integer(123) が、それを表すことになる。

同様に、

 image = ImageIO.read(new File(filePath));

は、

  1. File クラスのオブジェクト File(filePath) を一つ新しく作り、
  2. それを画像(Image) の読み込みを行う method である ImageIO.read に適用して、 ImageIO.read(new File(filePath)) という"./apple.jpg"の画像のオブジェクトを作り、
  3. その画像のオブジェクトを image という変数に置け

という命令になっている。ちなみに、image という変数は、BufferedImage というクラスのオブジェクトを格納する変数として使っている。

前回までのアリストテレス論理学(伝統論理学)、イデア論の話で、イデア論の説明に、プラトンの洞窟の比喩が出てきたが、「リンゴ箱」のようなプログラムを書くということは、この図で影絵師が、壁に像を作っているように、ディスプレイという壁にリンゴや腐ったリンゴの像を描いたのだと思えばよい。

そして、そのためには、影絵師が手に持っているような、影絵人形(有名なバリ島の影絵人形)にあたるものを作らねばならないのだが、それがオブジェクトだと思えばよい。

この比喩は、後でコンピュータの仕組みを説明した後で、もう一度、より詳しく説明する。

オブジェクト指向プログラミング言語というもの

この様に、コンピュータの中に、影絵人形にあたるオブジェクトというものを作り出し、それを操作することにより、仮想的な世界を作り出し、コンピュータに仕事をさせるのが、オブジェクト指向プログラミング。

影絵の譬えで言えば、プログラムは、コンピュータという影絵師に与える、影絵劇のシナリオの様なもの。現実の影絵師は、人間でありインテリジェンスを持つので、不完全なシナリオでも、それを解釈して劇を上演してくれる。

しかし、コンピュータにはインテリジェンスがないので、たとえば、「次は、人形Aの右手の棒を斜め上60度の方向に31.5センチ移動させよ」というようなレベルの詳細なシナリオを書く必要がある。

だから、プログラミングは大変なのだが、我々が日常的に使っている「整数」「画像」とか「ファイル」のようなものに対応するクラス(Integer, BufferedImage, File)が用意されていて、new Integer(...), new BufferedImage(...), new File(...) の様にするだけで、オブジェクトが作られれば、大変に楽になる。

この様な、様々なクラスを準備しておき、また、それらを組み合わせ、また、拡張して新たなクラスを作り、「世界の影絵」を作り出していくのがオブジェクト指向プログラミング。

簡単に言えば、世界をシミュレーションするようにして、プログラムを作る。実際、創世記のオブジェクト指向プログラミング言語の代表格とされる Simula は、名前からわかるように、シミュレーション用のプログラミング言語だった。これを知れば、世界を記述する言語である、アリストテレス論理学の言語と、オブジェクト指向プログラミング言語が似通っていても不思議はないことがわかるだろう。実際に、それは非常に似ている。

平成の最初のころまでは、オブジェクト指向言語(以下、オブジェクト指向プログラミング言語をこう書く)というものは、まだまだ珍しい存在で、プログラミング教育の中心は、C言語などの非オブジェクト指向の言語だった。しかし、現在では、これが逆転して、オブジェクト指向全盛となっている。

たとえば、このプログラミング言語の popularity の調査をみると、2位こそ非オブジェクト指向の言語であるC言語だが、1位の Java から10位のMatlab まで、すべてオブジェクト指向言語か、オブジェクト指向風にもプログラムを書ける言語になっている。

また、現在はプログラミングの教育も、早期にオブジェクト指向を教える傾向が強くなっている。C言語などのオブジェクト指向言語が主流となる以前のタイプのプログラミング言語に慣れた人には、このページを書いた、C言語等のプログラマとしてはかなり優秀と思われる前橋さんというエンジニアの方のように、オブジェクト指向に違和感を持ち、学習するのにかなりの時間がかかると言われている。その逆は、割と簡単で、たとえば、Java で教育を受けた人は、C言語などには移行しやすい。

たとえば、この1999年の論文では、その理由を、C言語のようなプログラミング言語からオブジェクト指向言語に移行するには、paradigm shift が必要だからだとしている。これに反して、C言語などは、その殆どの部分が Java などに包含されているので移行がしやすい。

では、そのパラダイム・シフトとは何か?それには、イベント駆動というものと、先ほど引用したエンジニア前橋さんのページにある、「タイヤキ型とタイヤキ」、 「哺乳類を継承して犬と猫を作り、 …」という「謎のたとえ話」の二つがある。前者も後で説明するが、今は、主に後者の方を説明する。実は、すでに感づいている人もいるのではないかと思うが、これが前回までのイデア論、アリストテレス論理学の話にそっくりなのである。つまり、哲学の様な話を聞かされるので、オブジェクト指向以前の、すごくメカニカルな感じのプログラミングに慣れた人には違和感が生じるのである。

では、この「たとえ話」が、オブジェクト指向入門のためのWEBサイトで、どんな風に扱われているかを見て、それを通してオブジェクト指向における大パラダイム・シフトである、クラスとインスタンスの概念を説明しよう。そのために、河合さんという方が書いた二つのオブジェクト指向入門コースの該当するページを見る。

  1. オブジェクト指向の世界(10): プラトン編-イデア論とクラス/インスタンス
  2. ここから始めるオブジェクト指向(2): 第2回 オブジェクトに必要な4つの特性とは?

これでわかるように、河合さんと言う人は、オブジェクト指向をイデア論、アリストテレス論理学に関連づけて説明しようとしている。そして、前橋さんという人は、それを「謎のたとえ話」と読んで嫌っていることがわかる。

しかし、この哲学とオブジェクト指向の関連は、変なものや特別なものではなく、この論文や、このサイトでも扱われているように、良く知られたこと。特に、前者の論文は、OOPSLAという、オブジェクト指向関連の国際会議で、最も権威ある国際会議で採択・発表されたもの。つまり、アカデミックに高く評価されている。

これを、先に見た「リンゴ箱」のプログラムを例にして、説明する。このプログラムには、src/RingoBako というフォルダに Apple.java というファイルがある。これは、そのままでは開けないが、ブラウザを起動して、そこにドラッグすると中身が読める。その内の、肝心の部分は、次の部分であり、これで Apple というクラスを定義している。

斜体の部分は、先ほどのプログラムの説明に使った部分で、これは Apple というクラスのオブジェクトを作るためのもので costructor という。

public class Apple {
	BufferedImage image;
	int top_left_x;
	int top_left_y;

	public Apple(int x1, int y1) {
		top_left_x = x1;
		top_left_y = y1;
		int answer = JOptionPane.showConfirmDialog(new Frame(), "リンゴは新鮮な方がよいですか?","お答えください",JOptionPane.YES_NO_OPTION);
		String filePath;
		if (answer == JOptionPane.YES_OPTION) {
			filePath = "./apple.jpg";
		} else {
			filePath = "./rotten_apple.jpg";
		}

		try {
			image = ImageIO.read(new File(filePath));
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("画像の読み込みに失敗しました");
		}
	}
	
	public BufferedImage getImage() {
		return image;
	}
	
	public int getX() {
		return top_left_x;
	}
	
	public int getY() {
		return top_left_y;
	}
}

しかし、肝心なのは青字と赤字の部分。最初に、class と書いてあることに注意。これが、「これから Apple というクラスをつくります」という宣言。

そして、その下に赤字で

	BufferedImage image;
	int top_left_x;
	int top_left_y;

と書いてある。実は、これが Apple というクラスのオブジェクト、別名、Apple クラスのインスタンス(instance 直訳すれば実例)が、すべて持つ属性(attribute)を宣言したもの。

「リンゴ箱」は、クリックするごとに、ひとつ Apple クラスのオブジェクトをつくり、それを保存してある。そして、新しいオブジェクトを保存するごとに、今まで保存しているオブジェクトをすべて、描画する。

描画するには、位置と画像が必要だが、その画像が、BufferedImage クラスの対象 image であり、また、描画するには、描画の起点が必要となるが、そのx座標、y座標を表すのが、残り二つの属性で、これはクリックした点の座標にしてある。

すでに説明したように image は、ユーザが、新鮮なリンゴの画像と腐ったリンゴの画像を選ぶので、それに従った画像が保管されている。

非常に単純にして言うと(実はウソ!)、Apple クラスのインスタンス、オブジェクトとは、

 image, top_left_x, top_left_y

という三つの値をまとめた三重対

 [image, top_left_x, top_left_y]

のようなもの。

ITの世界では、この三重対のようなものをレコードと呼ぶ。

上の様なリンゴの絵をウィンドウの中に描いていくというタスクのためには、リンゴは、この三つの属性を持つレコードだけで十分な情報がそろっていることはわかることと思う。

このことを念頭に、ITの世界で、クラスという言葉が使われ始めたT.Hoareの論文を分析し、その背景に伝統論理学の考え方が自然に使われていることが推測できることを示す。