« January 2008 | Main | March 2008 »

February 2008

February 25, 2008

継承の仕組み

**************************************************************
_/_/_/_/_/_/_/ ソフトウェア業界 新航海術 _/_/_/_/_/_/_/_/_/
**************************************************************
第200号 2008/2/25 『継承の仕組み』
▼ まえがき
▼ [オブジェクト指向再入門] (1)OOPは従来技術からの飛躍ではない
▼ [オブジェクト指向再入門] (2)ヒープ領域の獲得・解放での違い
▼ [オブジェクト指向再入門] (3)継承を実現するための仕組み
▼ [オブジェクト指向再入門] (4)サブクラスのインスタンス化
▼ [オブジェクト指向再入門] (5)自分のメソッドの実行
▼ [オブジェクト指向再入門] (6)継承されたメソッドの実行
▼ 次回以降の予告
▼ メルマガ紹介


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

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

2月12日に「ソフト会社の心臓」販売開始しました。
詳細は下記のページを参照してください。
http://www.kei-it.com/y_gamou/heart/


今回も引き続き、オブジェクト指向プログラミングについて解説します。
「オブジェクト指向でなぜつくるのか」(平澤章著、日経BP社発行)を
参考にしています。

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

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (1)OOPは従来技術からの飛躍ではない
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

私は「オブジェクト指向でなぜつくるのか」での平澤章氏の下記の
主張に賛成します。

(1)下流工程のオブジェクト指向(OOP)、上流工程のオブジェクト指向
 (モデリング)、全体をカバーするオブジェクト指向(UML、開発
 プロセス)は、個別に見るとそれぞれ随分違うものである。

(2)OOPは決して従来技術からの飛躍ではなく、連綿と続いてきた
 プログラム言語の進化の延長線上にある。

(3)OOPは純粋なプログラミングの仕組みとして捉えるべきである。


第199号では、クラスが静的領域にロードされ、インスタンスが
ヒープ領域に生成される様子を見ました。

図1から図5まで( http://www.kei-it.com/sailing/2008/199.htm )を
見ると、上記(2)「OOPは決して従来技術からの飛躍ではない」が
実感できます。

例えば「図5:2つのインスタンス」
http://www.kei-it.com/sailing/2008/199.htm#5 は、Cで書かれた
プログラムが実行されているときのメモリの状態とそっくりです。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (2)ヒープ領域の獲得・解放での違い
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

但し、次の2点で大きな違いがあります。

一つは、Cではヒープ領域の獲得・解放をプログラム側で制御する
のに対し、OOPでは実行環境が制御するという点です。

具体的に言うと、Cでは malloc と free が必要なのに対し、
Javaでは new だけで済むということです。

 関連記事:第198号「インスタンスはヒープ領域に作られる」
 http://kei-it.tea-nifty.com/sailing/2008/01/post_6f91.html

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (3)継承を実現するための仕組み
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

二つ目の違いはメソッドテーブルです。

「図3:姓の設定」 http://www.kei-it.com/sailing/2008/199.htm#3
で描かれているとおり、OOPではメソッドテーブル経由でメソッド
コードが呼び出されます。

一方、Cではプログラマが自前で関数ポインタテーブル経由で呼ぶような
制御ルーチンを作らない限り、直接関数コードが呼び出されます。


このように言うと、Javaプログラマは「自分はメソッドテーブル経由
ではなく、直接メソッドを呼んでいる」と言うでしょう。

メソッドテーブルはプログラマからは見えないからです。

では、なぜメソッドテーブルが存在するのでしょうか?

それは、継承とポリモーフィズムを実現するための仕組みだからです。

(他にも継承やポリモーフィズムの実現方法はあるようですが、ここでは
「オブジェクト指向でなぜつくるのか」にならってメソッドテーブルで
説明しています。)

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (4)サブクラスのインスタンス化
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

「図6:継承」http://www.kei-it.com/sailing/2008/200-6.htm を
参照してください。

人クラスを継承している歌手クラスを想定して書かれています。
この継承は、Javaでなら次のような表記になります。

 class 歌手 extends 人{
}


「図6:継承」は、歌手インスタンス倖田來未が生成されたときの
メモリの状態です。
Javaでなら「歌手 倖田來未 = new 歌手();」が実行されたときの
メモリの状態です。

「図6:継承」では次のことが表現されています。


(A)コードのロード

歌手クラスのコード(デビュー曲設定メソッド、所属設定メソッドの
コード)は静的領域にロードされます。


(B)メソッドテーブル

歌手クラスのメソッドテーブルが静的領域に作られます。
そして、そのメソッドテーブルには次の二つが含まれます。
・人クラスのメソッドへのポインタ
・歌手クラスのメソッドへのポインタ

サブクラスのメソッドテーブルにはスーパークラスのメソッドへの
ポインタも含まれているということが重要です。


(C)インスタンス

歌手クラスから生成された歌手インスタンス倖田來未には、
人クラスのメンバ変数が継承されています。

つまり、歌手インスタンスには人インスタンスのメンバ変数
(姓、名、誕生日、性)が含まれています。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (5)自分のメソッドの実行
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

「図7:デビュー曲設定」http://www.kei-it.com/sailing/2008/200-7.htm
は、インスタンス倖田來未のデビュー曲変数に"TAKE BACK"を設定する
処理が実行される様子を表しています。

Javaでなら「倖田來未.デビュー曲設定("TAKE BACK");」が実行される
仕組みです。


(A)OSはインスタンス倖田來未に関連付けられているメソッドテーブルを
 参照する。
(B)そのメソッドテーブルの中でデビュー曲設定メソッドへのポインタを
 探す。
(C)見つかったら、そのデビュー曲設定メソッドを実行する。
(D)デビュー曲設定メソッドは、インスタンス倖田來未のデビュー曲
 変数に"TAKE BACK"を設定する。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (6)継承されたメソッドの実行
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

次に継承されたメソッドが実行される仕組みを見てみましょう。

「図8:継承されたメソッドの使用」
http://www.kei-it.com/sailing/2008/200-8.htm は、インスタンス
倖田來未の姓変数に"倖田"を設定する処理が実行される様子を表
しています。

Javaでなら「倖田來未.姓設定("倖田");」が実行される仕組みです。


(A)OSはインスタンス倖田來未に関連付けられているメソッドテーブルを
 参照する。
(B)そのメソッドテーブルの中で姓設定メソッドへのポインタを探す。
 →人クラスから継承された姓設定メソッドへのポインタを見つける。

(C)見つかった姓設定メソッドを実行する。
(D)姓設定メソッドは、インスタンス倖田來未の姓変数に"倖田"を
 設定する。


メソッドテーブルは、コードの重複を排除する役割を果たしている
ことが分かります。

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

次回以降で、ポリモーフィズム、クラスライブラリ、フレームワーク
へと話を進めていきます。


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

乞うご期待!!

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
 メルマガ紹介
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

私が購読しているメルマガの一つを紹介します。
経験に基づく様々なノウハウが盛り込まれています。

------------------------------------------------------------
「コンピュータシステムはなぜ機能しないのか?」
~利益を大幅にアップさせるシステム設計の裏ワザ~

SE、プログラマだけでなくユーザーを含むシステム開発に関わる全
ての方々へ。納得のいく、利益を生むシステム作りの裏ワザを業界
暦20余年のSEがマネジメント、プロジェクト管理、プログラミング、
保守、人材育成を踏まえて伝授します。相互紹介募集中です。

ご登録はこちらから
http://www.mag2.com/m/0000155977.html
------------------------------------------------------------

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

私は中小ソフトウェア会社の経営者なので、(特に日本の)ソフト
ウェア業界、ソフトウェア産業について強烈な興味を持っています。
技術面だけでなく、会計面、法律面、人事面など様々な面において・・・。

そして、私はものごとを見るときに次のことを心がけています。

・あるものをあるがままに見る。
 色眼鏡(例えば権威者の意見)でものを見ない。

・くっきりはっきり見る。
 複雑な現実も、ある観点から見ると、あるいはある角度から光を
 あてると、くっきりはっきり見えてくる。

・批判だけではなく、明るく前向きな解決策を提示する。


この視点で見えてきたことを本メルマガに綴っています。


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

(以下をそのまま転送するだけです。)
---------------------------------------------------
【お勧めメルマガ ソフトウェア業界 新航海術】
⇒ 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
(但し、慶社員には社内のメーリングリストで配信しています。)


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

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


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

|

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/

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

|

« January 2008 | Main | March 2008 »