オブジェクト指向プログラミングと生物学

僕は生化学・分子生物学の研究が専門で、2001年以降にプログラミングを始めています。そしてオブジェクト指向プログラミングをちゃんと勉強したのは2005年頃からです。

プログラミングを勉強しながら、オブジェクト指向プログラミングと多細胞生物の仕組みとのよく似ていることを強く感じました。オブジェクト指向プログラミングではオブジェクト同士がメッセージをやり取りできますが、メッセージをやり取りする以外にはお互いに直接干渉しないようになっています。また各オブジェクトは独立性が高く、作業をするためのメソッドとデータを共に内包しています。

同じように細胞は、仮にそれが人間などの多細胞生物の一部であったとしても、独立性が高く、お互いにサイトカインなどでメッセージをやり取りしています。そして受け取ったメッセージを処理するためのメカニズムはすべて個々の細胞が内包しています。その独立性を最も顕著に示しているのは癌化という現象で、癌化してしまった細胞はサイトカインなどのメッセージを無視して、独自に増殖をし、体の中を駆け回り、そして個体を死に至らしめます。それだけ細胞は独立性を本来持っているのです。

オブジェクト指向プログラミングが生まれた背景には、プログラムは大きくなるととてつもなく複雑になってしまうために、なるべくプログラムをわかりやすい単位に区切ろうという発想があります。同じように多細胞生物というのは、細胞数が50億(人間の場合)に達し、DNAに書き込まれている個体の設計図は3 Giga文字にもなるという非常に複雑なシステムです。

これは僕の勝手な憶測ですが、非常に複雑なプログラムの扱いに人間が困ったのと同じように、生物も進化の過程で同じ困難に直面し、そしてオブジェクト指向という同じ解答に収斂したのではないでしょうか。

細胞生物学とプログラミングの類似性というテーマは、僕がいつか時間をとってまじめに研究したいテーマの一つですが、最近インターネットを見ていたら、オブジェクト指向が実は細胞生物学からヒントを得て生まれたものであることを知りました。

いずれのリンクもAlan KaySmalltalkを作ったとき、大学で学んだ細胞生物学のコンセプトを頭に描いていたことを紹介しています。オブジェクト指向で言うinheritanceとencapsulationをそれぞれ細胞生物学の発生と細胞膜に対比させています。

ただ、細胞生物学とプログラミングの類似性はこれにとどまらず、非常に広い範囲に及ぶと僕は直感的に感じています。

例えば細胞は基本的にsingle inheritanceですが、有性生殖のときだけ例外的にmultiple inheritanceが行えるようになっています。プログラミングではmultiple inheritanceはオブジェクトの拡張が簡単に行えるということで柔軟性が高いものの、state(状態)によるバグが発生しやすくなります(Single Inheritance vs. Multiple Inheritance)。そこでJavaなど多くのオブジェクト指向言語ではsingle inheritanceのみが可能で、interfaceという別の非対称な方法によって柔軟にオブジェクトが作れるようになっています。生物の有性生殖におけるstate(状態)の管理というのはまだ研究が盛んに行われていて、どうなっているかはまだ十分に理解されていませんが、有性生殖によって生じる受精卵はstateがリセットされて状態に近いと考えられていて、したがってmultiple inheritanceが起こりにくい状態になっていると想像されます。ですからこのときだけはmultiple inheritanceが許容されるのかもしれません。そしてJavaのinterfaceのような非対称な継承というのは多細胞生物には無いのですが、大腸菌などの原核生物にはTransformationやConjugationという形であります。大腸菌のような原核生物は受精卵のようなstateのリセットされた状態をつくることが困難なので、非対称のinheritanceをするようになったのかもしれません。

いずれにしてもオブジェクト指向自身が細胞生物学を参考に設計されたということを知って、ますますプログラミングと生物学を対比する研究をしたくなりました。