「オブ脳なんていらない」

原題:(What the ****isObject-Brain !?)


「オブジェクト脳の作り方」ヲ糾弾セヨ

『オブジェクト脳の作り方』を読んで愕然とした.おそらく,著者はオブジェクト指向をよく分かっていないのだと思う.「メッセージをオブジェクトに渡すと,オブジェクトはそれによって動作する」という全く幼稚なモデルによって,オブジェクト指向を説明できるとでも考えているのだろうか.このようなモデルは,中途半端に現実世界をプログラミング世界に写し取ろうという全くの勘違いを産み出しかねない,危険思想だ.
 こんなことをしていたら,「NullPointerException ってなんですか?」なんて聞くプログラマを量産しかねないではないか.

オブジェクトの起源

そもそも,オブジェクトとは何なのか.その起源は,Simula67という言語が編み出した

       「とってもへんちくりんな変数」

の種類なのだ.もともと,プログラミング言語の変数には「グローバル」というどこからでもアクセスできる変数しかなかった.プログラムは至る場所からこのグローバル変数を参照・変更することができた.
 このカオス状態から逃れるために,構造化プログラミング言語では,「ローカル」という種類の変数を発明し,関数(サブルーチン,手続き)という1つのモジュールの中からしかアクセスできないようにした.そして,その領域取得と開放を自動的にスタック上で行うことができる機構(自動変数とも言う)を言語処理系に持ちこんだのだった.

 さて,ここで,Simula67は,一つのいたずらを試みた.

     「この関数内のローカル変数の寿命を,グローバル変数のように長くできないだろうか?」

 そして生まれたのが,「オブジェクト」というヒープメモリに動的に確保された領域と,それを指すポインタだ.オブジェクトは関数内で生成され,関数が終了しても生き残る.そして,ポインタを通じて他の関数からも参照することができる....なんて妙な生き物!

この機構をSmalltalkがガベージコレクションと共に採用し,これが現在の「オブジェクト」の原型となる.

クラスの起源

一方,構造化手法からADT(Abstract Data Type)という概念が現れ,データ型とそれを操作する手続きをプログラマが定義できるようになった.C++ では,これを,struct(構造体)という既存の言語要素を拡張してclassと名付けることで行った.これで,操作とデータを結合して,ユーザが定義できるようになる.このclass型の変数,これをオブジェクト,と呼ぼうというのだ.
 しかし,これだけでは,ポリモーフィックな動作ができない.そこで,これに,データ型のファミリを定義する言語文法と,コンパイル時でなく実行時に操作をデータに結合するランタイムメカニズムをセットで付け足すことによって,ようやくC++のオブジェクト指向が完成する.

オブジェクト指向とは

つまり,C++のオブジェクト指向とは,

   「ユーザ定義データ型 + クラス階層定義文法 + 動的束縛」

なのだ.具体的には,:public という継承構文を使って,クラスの階層構造を定義できるようにし,子クラスのオブジェクトは,親クラスとしてでも扱えるようにする.さらに,生成したオブジェクトには,それが属するクラス情報へのポインタを入れる.各クラス情報は実行時情報として,そのクラスが持つ操作群を関数ポインタ列としてテーブル化している(vtblという).実行時に,関数呼び出しが起ったら,そのオブジェクトからvtblをたどり,そこで,関数呼び出しを解決する....

「社長起立」の正しく分かりやすい解説

だから,「社長起立」において,

 Employee ushio = new Shacho();
 ushio.standUp();

を,

「壁の向うにいる社員に向かって,”起立”というと社長が偉そうに立つ」

などと決して単純化しては行けない.正しくは,

 「ヒープに格納された社員オブジェクトにそのオブジェクトが属する実クラス(ランタイムクラス)
  へのポインタが含まれ,社員クラスと社長クラスの持つvtblにそれぞれ実際に起動
  される関数ポインタ配列がある.”起立”という関数呼び出しは,社員オブジェクト
  (実際には社長オブジェクト)から社長クラスをたどり,そのvtblに書かれている
  ”起立”関数ポインタを呼び出す.」


だ.とても分かりやすく解説できるではないか!!そもそもヒープや関数ポインタをを知らないやつに,オブジェクト指向などわかるわけがない.上記が,実際,社長との間にある「壁」に潜む「プログラミング言語の歴史」とも言うべき壮大な万里の長城なのだ.

 オブジェクト脳を読んで,本当に社長が偉そうに立つ,と考える人は,オブジェクト幼稚園の園児だ.
 車は,アクセルを踏むと進む.アイコンはダブルクリックすると立ちあがる,オブジェクトのメソッドは"."を付けると呼び出される,などと考えてしまっている!(え?これでいいのだっけ?)

まったく,きっと彼らはカードに穴を空けてプログラムを組んだことが無いに違いない.


翻訳:平鍋 健児

K. Frypan [2003/8/17]