« インスタンスはヒープ領域に作られる | Main | 継承の仕組み »

February 13, 2008

クラスのロードからインスタンスへの情報設定まで

**************************************************************
_/_/_/_/_/_/_/ ソフトウェア業界 新航海術 _/_/_/_/_/_/_/_/_/
**************************************************************
第199号 2008/2/12
『クラスのロードからインスタンスへの情報設定まで』
▼ まえがき
▼ [オブジェクト指向再入門] (1)クラスコードのロード
▼ [オブジェクト指向再入門] (2)メソッドテーブル
▼ [オブジェクト指向再入門] (3)インスタンスの生成
▼ [オブジェクト指向再入門] (4)変数への値の設定
▼ [オブジェクト指向再入門] (5)仕組みの側から捉えていく
▼ 次回以降の予告


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
まえがき
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

蒲生嘉達(がもうよしさと)です。

今回も、引き続き「オブジェクト指向プログラミング」について
解説します。

「オブジェクト指向プログラミング」は本文では「OOP」と略します。
英語の'Object Oriented Programming'の略です。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (1)クラスコードのロード
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

「オブジェクト指向でなぜつくるのか」(平澤章著、日経BP社発行)の
「第5章 メモリの仕組みの理解はプログラマのたしなみ」をもう少し
発展させて、OOPが動く様子をメモリの側から解説してみましょう。

メモリの話をする場合には、図が不可欠なので、
http://www.kei-it.com/sailing/2008/199.htm を参照しながら
読んでください。


「図1:クラスコードのロード」はクラス(図では人クラス)の
コードがメモリにロードされた状態を表しています。
http://www.kei-it.com/sailing/2008/199.htm#1


クラスのコードは静的領域に格納されます。
これはCもOOPも同じです。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (2)メソッドテーブル
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

コードのロードにおいてCとOOPとの大きな違いは次の点です。

OOPの場合、クラスコードをロードすると同時に、クラスごとに
静的領域にメソッドテーブルが生成されます。
(他にもOOPの実現方法はあるようですが、ここでは「オブジェクト
指向でなぜつくるのか」にならってメソッドテーブルで説明します。)

「メソッドテーブル」とは、個々のメソッドコードへのポインタの
配列です。

「メソッドコードへのポインタ」とは、Cでの関数ポインタにあたります。

Cでは関数ポインタが明示的に存在し、マトリックス制御をするときなど、
関数ポインタの配列を作り、「この事象のときにはこの関数に飛ぶ」
というような使い方をします。

OOPでのメソッドテーブルも、メソッドの呼び方を制御するために
存在します。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (3)インスタンスの生成
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

「図2:インスタンスの生成」はクラスのインスタンスが生成された
直後のメモリの状態です。
http://www.kei-it.com/sailing/2008/199.htm#2


図2では人クラスから福田康夫インスタンスを作ることを想定しています。

例えばJavaでは、「変数名 = new クラス名();」が実行されると、
インスタンスが生成されます。

図2の例なら「人 福田康夫 = new 人();」が実行されると、
インスタンス福田康夫が生成されます。

インスタンスが生成される領域はヒープ領域です。

 (第198号:インスタンスはヒープ領域に作られる
 http://kei-it.tea-nifty.com/sailing/2008/01/post_6f91.html 参照)


この時点では領域のみが確保され、姓、名、誕生日、性 の変数には
値はまだ入っていません。


ここで重要なことは、インスタンスが生成される際にインスタンス
からクラスのメソッドテーブルへの関連付けが行われるということです。

この関連付けの実現方法はOOP言語によって異なるのでしょうが、
例えば、インスタンス生成時に(プログラマからは見えない情報として)
インスタンスの中にクラスへのポインタが埋め込まれるのかもしれません。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (4)変数への値の設定
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

「図3:姓の設定」は、インスタンスに具体的な値が設定される様子を
表しています。
http://www.kei-it.com/sailing/2008/199.htm#3

「福田康夫.姓設定("福田");」が実行されると、次のようなことが
起きます。

(A)インスタンス福田康夫に関連付けられているメソッドテーブルを
 参照する。
(B)そのメソッドテーブルの中で姓設定メソッドへのポインタを探す。
(C)見つかったら、その姓設定メソッドを実行する。
(D)姓設定メソッドは、インスタンス福田康夫内の姓変数に"福田"を
 設定する。


続いて下記のコードが実行された後の状態を、「図4:情報設定後」
( http://www.kei-it.com/sailing/2008/199.htm#4 )
に示します。

 福田康夫.名設定("康夫");
 福田康夫.誕生日設定("1936年7月16日");
 福田康夫.性設定("男");

さらに、インスタンス佐藤ゆかりを作って、そこに姓、名、誕生日、
性の情報を格納した状態を「図5:2つのインスタンス」
( http://www.kei-it.com/sailing/2008/199.htm#5 )に示します。
実行されたコードは下記の5行です。

 人 佐藤ゆかり = new 人();
 佐藤ゆかり.姓設定("佐藤");
 佐藤ゆかり.名設定("ゆかり");
 佐藤ゆかり.誕生日設定("1961年8月19日");
 佐藤ゆかり.性設定("女");


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (5)仕組みの側から捉えていく
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

今日の話がOOPの実行の基本形で、それのほんの少しの応用が継承と
ポリモーフィズム、さらにもう一段の応用がクラスライブラリ、
フレームワークとなります。

今日の話だけだと、メソッドテーブルが介在するメリットは分か
ないでしょう。
しかし、継承とポリモーフィズムまで話を進めていくと、メソッド
テーブルを介在させる理由が理解できます。

逆に言えば、継承とポリモーフィズムを実現するためにメソッド
テーブルが存在するとも言えます。

OOPを、それが実現される仕組みの側から捉えていくと、OOPの
言語仕様が「たまたま決められたこと」ではなく、OOP特有のメモリ
管理の方法から必然的には発生することであることが分かってきます。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
次回以降の予告
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

次回発行予定は、3月初旬です。

乞うご期待!!

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
本メルマガについて
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

本メルマガは2003年12月8日に創刊されました。
創刊号 http://www.kei-it.com/sailing/01-031208.html で述べたとおり、
本メルマガのコンセプトは「読みものとしても面白い慶の事業計画」であり、
目的は「事業計画の背後にある基本的な考え方を語ること」です。

したがって、第一の読者としては、慶の社員(正社員・契約社員)及び
慶と契約している個人事業主を想定しています。

また、多くのソフトウェア会社・技術者が直面している問題を扱っているので、
ソフトウェア会社の経営者、管理者、技術者にとっても参考になると思い、
第33号(2004年7月19日号)からは「まぐまぐ!」で一般の方々にも公開する
ことにしました。
「まぐまぐ!」での読者数は2007年2月11日現在、654名です。


本メルマガの内容に興味を持つであろう方をご存知なら、是非
本メルマガの存在を教えてあげてください。

(以下をそのまま転送するだけです。)
---------------------------------------------------
【お勧めメルマガ ソフトウェア業界 新航海術】
⇒ http://www.mag2.com/m/0000136030.htm または
 http://kei-it.tea-nifty.com/sailing/ または
 http://www.kei-it.com/sailing/ 
--------------------------------------------------

このメールマガジンは『まぐまぐ!』 http://www.mag2.com/ を利用して
発行しています。配信中止はこちら http://www.mag2.com/m/0000136030.htm
(但し、knextall@kei-it.com には直接配信しています。)


バックナンバーは、発行者サイトまたはブログで、体系として
見てもらいたいので、「まぐまぐ!」でのバックナンバー公開は
最新号のみとなっています。

バックナンバーブログ:http://kei-it.tea-nifty.com/sailing/
発行者Webサイト: http://www.kei-it.com/sailing/
(発行者Webサイトではバックナンバーの全文検索も可能です。)


☆筆者の趣味のブログ:身近にいる小動物の図鑑☆
 http://kei-it.tea-nifty.com/small/

--------------------------------------------------
発行:
株式会社 慶
 代表取締役 蒲生 嘉達
 http://www.kei-it.com/y_gamou/

☆ コピーや配布をされる時はご一報ください ☆

|

« インスタンスはヒープ領域に作られる | Main | 継承の仕組み »

Comments

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/62022/40107799

Listed below are links to weblogs that reference クラスのロードからインスタンスへの情報設定まで:

« インスタンスはヒープ領域に作られる | Main | 継承の仕組み »