『Smalltalk で学ぶオブジェクト指向プログラミングの本質』
オブジェクト指向がよくわからないので、オブジェクト指向という言葉の生みの親であるアラン・ケイが作ったオブジェクト指向プログラミング言語 Smalltalk の勉強をしようと思いたち『Smalltalk で学ぶオブジェクト指向プログラミングの本質』を買ってみた。
「はじめに」しかまだ読んでないけど Smalltalk がどんな考えで作られたのかということがきちんと書かれており、非常に腑に落ちました!!(今のところ)
オブジェクトは細胞のアナロジーであり、複製と差異によって機能するという説明がすごく分かりやすかった。
とりあえず、今日読んだ部分のメモ。
矢と環
矢は、絶えず変化すること、(中略)すなわち、差異を表す
環はもとに戻ること、(中略)すなわち、反復を表す
いきなりプログラミングとは関係なさそうな話で始まってます。
要するに、Smalltalk の動作原理は差異と反復だ、ということが書いてあった。
細胞とオブジェクト
オブジェクトは細胞からのアナロジーであり、細胞を極端に簡略化したものであることは間違いありません。
アラン・ケイは生物を見本にして Smalltalk を作ったようです。
以下、ケイの言葉の引用です。
私はコンピュータに関する発明をするときに、コンピュータに関する知識はまったく使いません。生物学や音楽など関係ない分野の知識と類推を利用します。私がオブジェクト指向の考え方を考えついたときにも、(中略)生物がどのようにして複雑な構造を作るかを考えました。
複製と差異
「すべての細胞は細胞から」のように「すべてのオブジェクトはオブジェクトから」です。根本は複製による反復です。
複製の差異に大同小異としての微妙な差異が生じるからこそ、ある細胞は消化管になり、ある細胞は神経になります。そこに介在しているのが、細胞膜を通して受け取るホルモンなどの刺激
オブジェクトにおいて、これら(刺激)に対応するのがメッセージ
よって、オブジェクトの差異はメッセージから産み出されます。
オブジェクトは細胞であり、複製による反復がその根本。
そして、Smalltalk の特徴であるメッセージは差異を産み出すための仕組みとのこと。
オブジェクト指向の根源はオブジェクトとメッセージであり、クラスやクラス間に設けられた関係などではありません。
クラスを一刀両断にぶった切りです。
クラスってオブジェクト指向を勉強する際に最初にぶち当たる難関だと思うのですが、実はそんなものはオブジェクト指向の根源でもなんでもなかったとは!!
じゃあ、何故クラスなんてもんが生まれたのか? それについても説明してありました。
資源の節約
生物は1個1個の細胞がDNAの完全なコピーを内包しています。
しかし、
1個1個のオブジェクトが私的データ領域群とメソッド群を内包したまま、その数を増やしてしますと、どんなにメモリがあっても足りません。
オブジェクトの私的データ領域群とメッソド群を分けて、私的データ領域群だけを有するオブジェクトをインスタンスとし、メソッド群を抱えるオブジェクトをクラスとしたのです。
クラスの根源は「メモリの節約」だったのですね。
ようするに、クラスは環境的な制約条件により生まれた副産物だったということのようです。
将来的にメモリが無限につかえるような状況になったとしたらクラスはいらなくなるってことなんでしょうか??
このクラスが1980年代から90年代にかけてさまざまな面倒を引き起こします。クラスとインスタンスを明確に分けてしまうようなオブジェクト指向プログラミング言語が台頭してしまったのです。
インスタンスをオブジェクトたらしめるのがクラスということですから、プラトンさんのエイドス、(中略)すなわち、イデア(idea)そのものになります。
オブジェクト指向の分析や設計になると、インスタンスそっちのけで、クラスばかりを扱うようになります。個々の事物の背後にある本質のほうが大切と考えてしまい、UMLのクラス図のようなものばかりを描くことになります。
Smalltalk に関わった方々は、(中略)資源を節約するためにクラスを導入するのは仕方ないとしても、そのクラスをきちんとインスタンスとして扱えるように整備して1980年に世に出したのです。クラスもインスタンスとともにオブジェクトであり、すべてがオブジェクト、そして、すべてのオブジェクトはオブジェクトから、というライトモチーフを守り抜いて Smalltalk-80 としてデビューさせました。
プログラミングの本でプラトンがでてくるとは思いませんでしたw
イデアであるクラスばっかり見てないで現実のオブジェクトをちゃんと見ろ、という思想でつくられたのが Smalltalk ってことみたいです。
「実存は本質に先立つ」というサルトルの有名な言葉があるけれど、もしかしたら Smalltalk は実存主義の影響とかを受けているのでしょうか?
(現代思想とプログラミング言語の関係性を調べてみるのも面白そうかも。)
Smalltalk ではクラスとインスタンスを区別しないので、プログラムの走行中にクラスがありありとまざまざと現れます。インスタンスを生成して消滅させられるように、クラスを生成し消滅させるプログラミングがいとも簡単にできます。プログラムの実行の真っ最中にクラスの継承を動的に変更することも可能なのです。
とりあえず気になった部分は以上です。