曇りなき眼で見定めブログ

学生です。勉強したことを書いていく所存です。リンクもコメントも自由です! お手柔らかに。。。更新のお知らせはTwitter@cut_eliminationで

オブジェクト指向プログラミングと存在論(オントロジー)の関係、そしてオブジェクト指向存在論の謎

 Javaの勉強をしております。

 Javaオブジェクト指向言語である。オブジェクト指向プログラミング(Object-Oriented Programming)はいま多くの開発現場で使われている主流のプログラミングスタイルだと思われるが、これは哲学的にも興味深いのではなかろうか。私は最近分析哲学存在論の勉強もしているのだが、オブジェクト指向は哲学の存在論と親和性が高そうである。

 というのは両者に触れたことのある人ならば普通に「まあそうかもね」となるんじゃないかと思う。実際コンピュータ科学でもオントロジー工学という分野があって、分析哲学存在論と似たような手法でモノを分類して情報処理モデルを作るのであるが、これとオブジェクト指向はいろいろな要素を共有している。今回はオブジェクト指向プログラミングと哲学的存在論オントロジー工学の関係を調べたり考えたりしたので書きたい。

 そして! ややこしいことに「オブジェクト指向存在論(Object-Oriented Ontology)」というのも存在する*1。ハーマン先生という現代のアメリカの哲学者が提唱している哲学の理論で、ただし分析哲学ではない*2。これはいったいなんなのか。オブジェクト指向プログラミングと関係があるのか。この点も調べたので述べる。これについて気になっている人はけっこういるのではないだろうか。そうでもないか。

オブジェクト指向プログラミング(OOP)と存在論(オントロジー)

 まず、プログラミングを知らない人向けにオブジェクト指向プログラミング(以下:OOPを説明しておく。といっても私もよく知らないけど。

OOPとは

 OOPに関する私の知識は平澤章『オブジェクト指向でなぜつくるのか第2版*3』(以下:『なぜつく』)にかなりを負っているので詳しくはそちらを参照のこと。

 OOPには三大要素というのがある。すなわちクラス*4、継承、ポリモーフィズムである。これらはプログラムの保守性*5や再利用性を高めるための仕組みである。人間にとって読みやすくて書きやすい、そしてバグを起こしにくい、さらに優れたプログラムを再利用できる、これがOOPの強みであり、それを実現するのが三大要素である。

 OOPではクラスというものを作る。プログラムの実行時には、そこから生成したインスタンスというものが動く*6。「オブジェクト指向」の「オブジェクト」とはこのインスタンスのことであるが、クラスとインスタンスの総称として使われることもある。まあそれはおいといて。よく「犬がクラスとしてポチがインスタンス」みたいな例えが使われる。実際にそのようなプログラムをJavaで書くことはできる。犬に関する性質(なんらかの名前を持っている、吠える、など)をクラスでまとめて定義して、「ポチ」や「惣一郎」といった名前を持ったインスタンスをいくつも作ることができる。またクラスには階層関係があり、犬クラス意外にもカエルクラスを作ったとしてそれを動物クラスにまとめたりもできる。犬クラスとカエルクラスが共通して持っている性質を動物クラスの性質として定義しておけば、犬クラスとカエルクラスではそこに固有の性質を追加すればよい。このときに使うのが継承という機能である。階層関係を利用して、犬とカエル全体になんらかの命令をしたければ動物全体に命令をすればよくなったりする。これがポリモーフィズムである。これらの例からわかるとおりOOPは現実世界に対する直観をもとにプログラムを書くことができる。

 ↑というようなことはOOPの言語の教科書によく書いてあるのだが、『なぜつく』ではこうした考え方を批判している。OOPの機能はあくまでプログラミングのための機能であって、現実とプログラムは違う、ということである。しかし、OOPの考え方はプログラミングそのものだけでなくその前段階の業務分析などにも使われている。同書ではこれを汎用の整理術と呼んで解説している。やはりOOPは現実と似たところがあって、クラスの考え方を現実の業務の分析に使える。特に重要なのは、OOPのプログラムの設計に使われるUMLという記号言語*7が、業務のモデリングにも使えるということである。そうすれば業務分析から実装をスムーズに行うことができる*8。ただし、プログラミング技術としてのOOPと汎用の整理術としてのOOPは別物だということも『なぜつく』では強調されている。現実とプログラムはあくまで別物で、それらの共通点を見出すのを頑張るのが大事なのである。

存在論(オントロジー)とは

 続いて分析哲学を知らない人向けに現代存在論を説明する。存在論の基本知識は倉田剛『現代存在論講義Ⅰ*9』を参照。存在論というのは基本的にカテゴリーの研究である。物であったりなかったりするのだがいろんな存在者をカテゴリーに分けていくのが存在論で、その際「どのようなカテゴリーが必要か」を考えるのが哲学である。アトランティスが存在するのかとかイエティが存在するのかというのは考古学者や動物学者が研究することで、哲学的存在論ではもっと抽象的な、なんのカテゴリーに属するのか、そもそも属するカテゴリーがあるのかどうか微妙な存在者を研究するのである。

 例えば「赤い」という性質について。赤いものはたくさんある。周りを見渡せば見つかるだろう。しかし「赤い」という性質は存在しているといえるのだろうか。性質は伝統的に普遍者という。普遍者をカテゴリーとして認める立場、すなわち「赤い」を存在者として認める立場を実在論といい、独立したカテゴリーとして認めない立場を唯名論という。これら二つの立場の間の議論を普遍論争という。

 そしてコンピュータ科学・知識工学におけるオントロジー工学というのは、この存在論と同じような手法でモノや世界に対する知識を整理する手法である。ただし哲学的存在論とは違ってアトランティスとか個々の学問の対象になるような存在者の知識も整理する。オントロジー工学において哲学的存在論に対応する部分は上位オントロジーという階層の上位のところとなる。オントロジー工学は世界を概念化して知識を整理するものだが、哲学的存在論は概念ではなく世界そのものを扱うという違いが『現代存在論講義Ⅰ』で述べられている。しかし両者の違いはないのではないかというのが私の意見である*10

 さて、ここで普遍論争について考えてみよう。とりあえず実在論に立つとする。普遍者である「赤い」に対して個々の赤いものをインスタンスという。「赤い」はそれのみでは存在できない。必ずインスタンスを通して存在し知覚される、という性質が観察される。このため普遍者の実在は怪しくなる。唯名論のうちクラス唯名論という説は、普遍者はインスタンスのクラスもしくは集合であると考える。すなわち「赤い」は個々の赤いものの集まりでしかなく、普遍者というカテゴリーは不要となる。

 どうでしょう。クラスとインスタンスという考え方は存在論にも登場するのである。ただしここでいう「クラス」とは、数学の集合を一般化したものである*11からOOPのクラスとは別物である。『オブジェクト指向でなぜつくるのか』でもこのクラスという用語が誤解のもとだという指摘がある。ただし、OOPのクラスは型の一種といえるので表示的意味論を考えると数学的な集合と見なせるのかもしれない。まあでもここをそんなにつきつめても意味ないでしょう。そして現代の唯名論者でクラス唯名論を採用する者は少ない。もっと工夫された唯名論が現在の主流である。

OOPオントロジーの関係

 というわけなので両者の類似点はもっとざっくりととらえたほうがよさそうである。見たところ以下のような類似点がある。

  • 抽象度に応じたモノの階層(クラス階層/カテゴリーの階層)を設ける。
  • 実際に動く・知覚されるのはインスタンスだけである。

 OOPの解説で犬がクラスでポチがインスタンスということを書いた。常識的には犬はである。種はどのようなカテゴリーなのかというのは現代存在論の大きなテーマである*12。種は普遍者であるというのが素朴な説である。『なぜつく』では、現実世界の知識をOOPに持ち込むのが危険である理由として、インスタンスはクラスから生成されるのに対してポチは犬から生成されるわけではない、というようなことが書いてある。これはその通りである。ポチは親犬から生れる*13。ではこの常識のほうを修正してはどうか。私は哲学的なものにしろ工学的なものにしろ存在論というのは世界に対する知識の整理だと思っている。存在論を勉強することはOOPを汎用の整理術として使うことと同じようなこととなるのではないか。つまり個々のものであるポチは犬という普遍者のインスタンスである、ということを存在論的知識として持っておけば、それをOOPに活かすことは可能であろう。

 オントロジー工学の提唱者である溝口理一郎先生の「オントロジー工学の基礎と応用」という解説記事*14を見てみたら、オブジェクト指向との類似点と相違点が書かれていた。

 確かにオブジェクト指向言語のクラス階層とオントロジーの概念階層との類似性は高い.また,オブジェクト指向方法論はその上流における分析ではオントロ ジー開発方法論との共通点は多い.しかし,実装に近いフェーズでは前者は実行性能を重視し,後者は宣言的記述に基づき明示性,形式性を重視する.そして, 決定的な相違点は公理の「宣言的」かつ「明示的」記述性の有無にある.すなわち,オブジェクト指向言語は本質的に手続き的であるためクラスの意味,クラス 間の関係,そしてメソッドの持つ意味はその手続き的記述の中に埋もれており暗黙的である.一方,オントロジーでは各概念の意味定義と概念間の関係記述は宣 言的,かつ明示的である.手続きに関してもその仕様は宣言的に記述され,形式性,明示性は維持される.

溝口先生という方はなかなか深遠というか難解な感じの文章を書かれる方のようで、これもなかなか難しい。まあしかし、要するにオントロジーは知識工学である以上は形式や明示性を重視し、対してOOPは実行性能を重視するということである。OOPではクラス階層のような存在論的な構造は実行のために使えればよいので暗黙的なものに留められるが、オントロジーではそれ自体が目的なので存在論的構造が明示される。OOPはあくまでプログラミングの技術だというのは『なぜつく』で貫かれている信念である。よってOOP存在論は類似点はあるものの存在論に引っ張られすぎてはOOPの良さが出なくなることもある、ということになる。OOPはあくまで手段のひとつである。

 Javaではクラス階層の頂点にあるクラスがあらかじめ決まっている。それはズバリ「オブジェクト」というクラスで、個々のプログラマが作るクラスもすべてこれを継承することとなる。『なぜつく』によるとこのアイデアは哲学的な考えを誘発するらしい。様々なクラスを階層的に定義して、そのいちばん上が「オブジェクト(もの)」というのはいかにも哲学的である。ただし実際の哲学的存在論では普遍者のようなものっぽくないものが階層に現れる。OOP存在論はもっと素朴である。

 まとめると、OOP存在論は似ているが、かなり素朴な部分で似ているので、お互いの知識が役に立つこともあるかもしれないが過信は禁物、となる。なんかつまらない結論ですみません。

OOPOOO

 問題のオブジェクト指向存在論(以下:OOO)である。Twitterで「オブジェクト指向存在論 プログラミング」とかで検索すると「オブジェクト指向存在論オブジェクト指向プログラミングと関係ないんですか?」みたいな困惑したようなツイートがいくつか見つかる*15。そもそもオブジェクト指向プログラミングとOOOの両方に興味を持つ人は多くないだろうけど、それらの関係をちゃんと説明できる人は少なかろう。なので困惑だけが残っちゃうのである。

 事実、私もオブジェクト指向存在論についてはよく知らない。哲学に関心のない人にはわかりにくいかもしれないが、これは私がメインに勉強している分析哲学というものとは異なる流派の哲学説なのである。というわけで私も一から調べなければならない。で、飯盛元章先生の以下のnoteを見つけた。これを参照する。
note.com

OOPOOOに影響関係はない

 まずそもそもOOOOOPに由来するものなのだろうか。ハーマン先生が研究を開始したのは2000年代前後頃で、OOOというのは哲学という学問においては非常に新しい理論である。飯盛noteでも「21世紀の新しい哲学潮流」とある。対してOOPは、Simula67という1967年に誕生したプログラミング言語に原型があり、言葉/概念としては1970年代にアラン・ケイ*16が作ったものである。つまりコンピュータ科学という学問においては非常に古い概念で、OOOよりも早い。順番的にはOOPOOOに先行している。ではOOOOOPの影響を受けた。理論なのだろうか。OOPと哲学との関係は先述のとおりだが、OOOは先述のような哲学とは違った潮流のものである。実はOOOの解説書を読んでもプログラミングの話題は出てこない。飯盛noteには出てこない。ハーマン先生自身の著作『四方対象*17』と『新しい哲学の教科書 現代実在論入門*18』という本をザッと見たのだが、プログラミングのことは書かれていないのである。ザッとであってしっかりとは読んでいないので、今後ちゃんと確認したいと思います。すみません。『四方対象』の方ではObject-Orientedは「対象指向」と訳されていて、必要に応じて「対象」に「オブジェクト」というルビが振られている。これはプログラミング用語と混同されないようにしているのかもしれない。しかし存在論では"object"を対象と訳すのは普通なのでまあそんなものか。とにかく、OOOOOPを特に意識していない。影響を受けたとすれば後に生れたOOOのほうなのだが、こういうわけなので両者に影響関係はなさそうである。

 では何故「オブジェクト指向」という語を使っているのだろう。偶然だろうか? まずそもそもOOOは対象を指向した存在論なので名前に正当な理由はある。しかしこれから見るように、そんなに「オブジェクト指向」という語がドンピシャで当てはまるような存在論かな〜という疑念はある。「オブジェクト指向(object-oriented)」という語は英語では自然な表現なのだろうか。プログラミング用語を連想せざるをえないと思ってしまうのだが、それは私がプログラミングの知識をそこそこ持っているからなのだろうか、そうでもないのか。たぶんハーマン先生は「オブジェクト指向」というプログラミング用語がかっこいいからということで理論の名前に借用したんじゃないかな〜〜〜〜〜とも思うのである。これは皆さんで判断していただきたい。

OOPOOOはあまり似ていない

 さて、影響関係はなさそうだが、ではOOPの思想とOOOは似ているのだろうか。ここからはOOOの中身の話である。

 オブジェクト指向存在論ハイデガーの実存哲学に影響を受けているようである。ちょっと単純な図式化になってしまうかもしれないが、ハイデガーというのは西洋哲学史の研究から出発して存在論の歴史を問い直した人物であろう。なので実存哲学というのは伝統的な存在論へのメタみたいなものである。対して私がここで取り上げてきた存在論はもっと素朴なものである。しかし素朴ゆえの明快さ、強力さを具えている。

 オブジェクト指向存在論というのは、ハイデガー存在論と同じく、素朴な哲学理論が見落しているものを見直すというモチベーションがあるようである。飯盛noteでは以下のようにまとめられている。

オブジェクト指向存在論は、個々の対象を究極的なものとみなす。
■ 哲学の歴史において、対象は還元されてきた。
■ だが、対象は壊れうるのであり、関係性のネットワークにはまり込んだままではない。
■ 対象は、汲みつくしえない深みを隠し持ち、関係から退隠している。

 ここで「還元」というのは二つあって、一つは物をその構成要素に解体すること(下方解体)である。これは分子とか原子とか素粒子とか、科学の発達とともにより基本的な構成要素が突き止められていったことと連動して哲学史上で起きてきたという。OOPでも「原子でできているもの」みたいなクラスを作って継承することはわざわざする必要はないのでこの還元を否定している。しかし、これは大抵の科学理論や哲学理論で実践されていることだと思う。ここまで述べてきた存在論でもこうした還元は出てこなかった。なのでこれだけだと「対象指向」といえるほど他の哲学理論以上に対象を指向しているのだろうか、という感じがする。

 もう一つ、関係のネットワークへの還元を否定するというのがある。対象が何をもたらすか、という関係や相互作用への解体(上方解体)である。この点はハイデガーの道具論の影響を強く受けているようである。要するに道具はその用途から自由に存在しうる、という感じである*19。この方針からオブジェクト指向という名前が付くのはなるほどなと思うのだが、OOPではこういうふうには考えない。普通に関係や相互作用をクラスのメソッドや階層として定義する。そもそもOOPの「オブジェクト指向」というのはアラン・ケイ氏がわりと即興で考えたものらしいので、そんなにOOPの精神をうまく言い表しているのではないのかもしれない。しかしこれは実存哲学を考慮してのことなので、素朴に見れば一つ目の還元を拒否するという点で十分オブジェクトを指向しているのかも。

 とにかく、やはりOOOよりもっと素朴な存在論のほうがOOPと似ている。OOOは伝統的な存在論を批判する存在論なのでわりと伝統的存在論と親和性の高いOOPとは相性が悪くなるのだと思う。

むしろOOOOOPの思想に反しているのでは、という点

 OOPの特徴に再利用性を高めるということがある。Javaではすべてのクラスが「オブジェクト」というクラスを継承しているというのはすでに述べた。このようにして、他人が作った優秀なプログラムを継承したり再利用したりできるのである。JavaではAPIApplication Programming Interfaceというのがあって*20、その情報が集約されている。Javaでプログラミングをする際にはAPIを参照して使えそうなプログラムを探す。

 再利用性を高めると共同開発が楽になる。APIというのは共同開発が世界規模に広がったものともいえる。その際、クラスの名前が被る(コンフリクトする)ことを避ける必要がある。実行するのはコンピュータなので、コンピュータに正確に読ませるには異なるクラスには異なる名前を付けなければならない。よってOOPの言語によって名前の付け方には世界的なルールがあったりする。

 ちょっと難癖みたいになってしまうが「オブジェクト指向存在論」というややこしい名前を付けるのはこの思想に反しているのではないかと思う。実際OOPOOOに関係はあるのだろうか? と思ってしまう人は少数ながら観測されるので、ややこしいのは確かだと思う。なんかしかもObject-Oriented Philosophy略してOOPという用語もあるらしい。Object-Oriented ProgrammingのOOPとまったく同じである。それは流石にややこしすぎないだろうか。

 哲学も世界的な共同開発だと私は思う。「オブジェクト指向存在論」という名前が意図的にOOPに寄せて作られたのかどうかはわからないが、用語造りは慎重にすべきであろう。そうして異分野の人の混乱を軽減するのも学者の使命かな、と。

*1:存在論が存在する」ってのもややこしい言い方ですな。

*2:何をもって分析哲学かどうかを決めるのか、また決めることに意味はあるのか、みたいな議論はありますけどまあまあまあ。

*3:

オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向でなぜつくるのか 第2版

 

*4:クラスではなくカプセル化を三大要素のひとつとすることが多いが、カプセル化はクラスの機能を代表したものと考えられるため、広くクラスを三大要素とする、という方針で『なぜつく』は書かれていた。

*5:この保守性の意味が私にはよくわからないんですよ。プログラミング用語です。

*6:上手い言葉が思いつかないので「動く」としておきます。なんかいい表現があるのだと思いますが。

*7:なんと言ったらいいのだろう。

*8:シームレスというやつです。

*9:

現代存在論講義I—ファンダメンタルズ

現代存在論講義I—ファンダメンタルズ

  • 作者:倉田剛
  • 発売日: 2017/04/07
  • メディア: 単行本(ソフトカバー)
 

*10:というのはこちらに書きました→

倉田剛『現代存在論講義』読書メモ - 曇りなき眼で見定めブログ

*11:集合論や数理論理学の心得のある人ならご存知であろうやつです。

*12:『現代存在論講義Ⅱ』に詳細な議論があります。

現代存在論講義II 物質的対象・種・虚構

現代存在論講義II 物質的対象・種・虚構

  • 作者:倉田 剛
  • 発売日: 2017/10/20
  • メディア: 単行本(ソフトカバー)
 

*13:ということもちゃんと同書に書いてある。

*14:https://www.jstage.jst.go.jp/article/jjsai/14/6/14_977/_pdf

*15:ちなみに『仮面ライダーオーズ』のOOOと紛らわしいという指摘は少なかったです。

*16:OOP以外にも「パーソナル・コンピュータ」という言葉/概念を創造したりしてコンピュータ科学と産業に多大なる影響を与えた天才です。

*17:

四方対象: オブジェクト指向存在論入門

四方対象: オブジェクト指向存在論入門

 

*18:

*19:ふんわりですみません。

*20:Java以外にもいろんなAPIがあります。