第 4 回コールスタックの活用 ケンイチはデバッガでい p2 ) を表示させて調べてみたが、どうもそうではないようだ った。 「あっ ! ! 」 そのときケンイチは奇妙なことに気付いた。 p2 と p3 との値が 5 だけ離れているのだ。 5 というのは何だ ? もし p2 、 p3 が指しているのが関数テーブル上のどこかの値だとしたらポ インタのサイズである 4 ( 32bit 環境時 ) かその倍数だけ離れているはずだ。 5 というのは何だ ? 本当に wanwan 関数は 5 バイトしかないということか ? いやいや、そ れはありえない。 wanwan 関数は結構コードを書いてあるのに、それが 5 バイトに収まると は到底思えない。 「そろそろできたか ? 」 早井が覗き込んで来た。 「す、、すみません。まだです。デバッガの調子がおかしくて」 「は、、馬鹿も一ん ! ! 調子がおかしいのはお前の頭だろ ! 」 早井が瞬間湯沸かし器になった。 「だって、この p3-p2 が 5 になるんですよ ? 」 「そりや当然なるだろ ? 」 「へ ? なぜですか ? 」 ケンイチは目が点になった。 「 stub ( スタブ ) があるんだから当然そうなる」 「えっ ? そうなんですか ? ? その stub というのはジャンプ台だと考えていいので すか ? 73
第 15 回 バグを憎んで人を憎まず ケンイチは呆れ顔た。 「ち、違うんだ、ケンイチ。最後まで話を聞けい ! 」 「は、はい」 「その装置の実験も兼ねて試用したわけだが、その装置自体が失敗作だったんだ」 「どう失敗だったのですか ? 」 「データ転送が間に合わなくて書き込みに失敗することがあるんだ」 早井は真顔でそう言った。 「 CD - 日ですか・・・」 なんだかどこからどこまでが本当だかわからなくなってくるケンイチ。 「おかげで俺は一部の記憶を失ってしまった。自分の名前すら忘れてしまっていた。テ レビではスティーヴン・スピルバーグ監督がインタビューに出ていたので、俺は自分 の名前を勝手にスティーブン・早いデバッグ、さらにもじって、スティーブン・早井 出婆具と名付けた。 それがすべての始まりだった・・・」 「すべての始まりというか、そこで物語はすべて終わってそうですが・・・」 「ま、まあな」 もはやコーディングができないの巻 「ケンイチはプログラマなんだから、こんな嘘くさい身の上話よりも、プログラム のソースコードのほうがよほど真実に近いものが伝わってくるとは思わないか ? 」 「それはどうでしよう・・・」 293
第 13 回 ひなた先生な テパッグが 返り、興ま 、うあるべきカ くなるテクニック 変数の命名規則について、自分なりの結論を得たケンイチだったが、関数 ( メ ソッド ) 自体のコーディング規約については、依然として手探り状態のままで あった。あまり類を見ない議論であるだけに、足場を見失いかねないケンイチだ ったが、変数の命名規則のときに培った考え方がここでも活かせるのではない かとケンイチは考えるのであった。 みんながかほちゃの巻 「私、怖いわ」 「どうした ? 眠れないのか ? 」 「違うの。明日は、だってほら・・・」 ひなた先生がケンイチから目を逸らした。 「ああ、待ちに待った 2 人の結婚式だ。ひなたはウェディングドレスを着るのを楽し みにしてたじゃないか」 「そうだけど・・・。たくさんの人が来るわ。私の親戚の怖いおじさんも来る」 「そうだったね」 「ケンイチ君は怖くないの ? 」 「ああ。もはや僕の目には、ひなたしか映らない。ひなた以外は何人居てもかほち 0 やと同じさ。ひなたしか僕の中で意味を成し得ない」 242
第 12 回変数の命名規則 なんて使いませんし、それならメンバだけなんで "m-" というのもなあ、と思い 最後にアンダーバーだけ付けることにしました」 「つまりは、変数名から型名を取り除いて、スコープだけにしたんだ ? 」 「そうですね。結局、スコープと言っても、メンバ変数なのかそうでないのかだけ の区別になってしまいましたが」 0 0 第 0 日 「うーん ? 」 早井が不審なものを見つけたように顔をゆがめた。 「はい ? 」 「ケンイチ君の言う、メンバ変数 " ではない " 変数とは一体何なのだ ? 」 「ここでは、グローバル変数と static 変数を除きますから、ローカル変数のみです」 「仮引数はどうなる ? 」 「あっ ! ? 」 「次のプログラムを考えてみよう」 早井がノート PC に電光石火のごとく入力して見せた ( リスト 1 ) 。 マリスト 1 仮引数とローカル変数について考えるプログラム void incrementCount(int c){ c + 1 int count if ( count く 100 ) count,• count 「普通ローカル変数という場合、仮引数も含むのだけれども、ここでは説明の便宜 上、仮引数はローカル変数には含めないものとする」 229
第 2 回 託のない笑顔を見ているとそんなことも言えなくなる。 ケンイチを見透かしたようにひなた先生が言った。 「あっ ? 馬鹿にしてるんじゃないのよ ? 」 「はい」 呼び出しグラフの巻 0 0 があるということよね」 生返事を返すケンイチの視線が泳ぐ。 「え、、ええ」 バグの発生点と発現点 「これを『呼び出しグラフ』というの。いま、ゲコゲコに到達するには、 2 つの経路 もない。 本当はひなた先生のことが気になって仕方ないのだが、そんなことこの場で言えそうに 「い、、いません」 0 「ケンイチ君はいま、誰か好きな人は居るかな ? 」 0 27 「なんか生々しいんですけど・・・」 たな ? と言ってケンイチ君に示談金をせびります」 現れませんでした。それどころか、怖いお兄さんがやってきてオレの女に手を出し なっています。ところが、ゲコゲコを実行したにもかかわらず、美人のお姉さんは るとケンイチ君の前に美人のお姉さんが現れるはずなんです。設計意図では、そう いま、ゲコゲコの動作がおかしいことに気付きました。本当は、ゲコゲコを実行す の関数で構成されています。 だとします。このプログラムは、わんわん、にゃんこ、うさうさ、ゲコゲコの 4 つ 「では、このプログラムは、『ケンイチ君が人を好きになれるようにするプログラム』 0
レス = スは よせ起きあカ デバッグの本質に到達したかのように見えた新入社員ケンイチだったが、現実は そう甘くはなかった。ケンイチを待ち構えていたのは、 " ケアレスミス " という名の 防御不能のバグの発生であった。ケアレスミスはどうすれば防げるのか ? そもそ もなぜケアレスミスが生じるのか ? ケンイチの思索はとどまることを知らない。 一緒にお風呂の巻 ひなた先生が 第 8 回 テパッグが くなるテクニック ケンイチは迷路の中に閉じ込められていた。ケンイチは、その迷路から脱出を試みた。 だけどあまりにも迷路が広すぎて出口が見えない。だから一度歩いたところは地面に目印 を付けていくことにした。一歩ずつ歩きながら目印を付けていく。目印を付けた回数が、 最初にいたところから到達できた領域の面積を表す。 「ケンイチ君、起きて・・・」 「むにやむにや、もう歩けません・・・」 00 0 0 ケンイチは眠っている。 「ケンイチ君、朝ですよー。朝一 ! 」 「むにやむにや・・・まだ迷路から出れにやい・・・」 ケンイチは依然として眠っている。 「困ったわねえ・・・」 ひなた先生は、ケンイチをどうやって起こそうか悩んだ。 「ケンイチ君、お風呂が沸いたわよー。ケンイチ君、先に入る ? 」 142
第 7 回 int getData(int n)C return nyanko—>getData(n); private: NyankoInterface* nyanko; proxy object によるバグの再現 ケンイチが書いたのは、デサインバターンで言うところの p 「 oxy バターンであり、 C + + の立場から見れば単なる委譲用のクラスだった。 「 Nyank0 クラスが多くのメソッドを持っていなくてよかった。多くのメソッドを持 っていたら、委譲用のクラスを書くだけで大仕事になるところだった」 ケンイチは、 C + + に委譲構文が用意されていないことを常日頃から不満に思っていた。 マ図 IO proxy 経由でオブジェクトを切り替える debug 用 0 P roxy 「正常に Web 上のデータが取得できるときは、図 1 0 のように Nyank0 一日 e に委譲 して、そうでないときは、デバッグ用の Nyanko に委譲すれば良いのではないのか ? しかしいつ、どうやってそれを切り替えればいいのだ ? リスト 2 のようにコンバイ #endif nyanko = new Nyanko—For—Debug(); #else nyanko = new Nyanko—Real(); #ifndef DEBUG_NYANKO Nyanko(){ マリスト 2 Nyanko Rea にデバッグ用とを切り替える ルオプションで切り替えればいいのか ? 」 137
第 6 回 Sparse Matrix による logging ひなた先生は抜け目ない。 ケンイチのヒミップログラムの巻 「それにしてもケンイチ君が遅刻なんて、どうしたの ? 」 0 「すみません。最近、夜遅くまでプログラム書いてて、それで朝が起きられなくて」 「そうなんだ ~ 。ケンイチ君は何のプログラムを書いてるの ? 」 「ええと、たいしたプログラムではないのですけれど、 Goog みたいな検索エンジ ンを自分で書けないかと思いまして」 「なんだかおもしろそうね ! 」 「 Web からページを HTTP で取得するところは書けたんですけれど、どうやって page 日 ank を決めていいのか、そういったことがわからなくて」 0 「 PageRank っていうと、そのページの重要度を表す値のことよね ? 」 「ええ。たくさんのページからリンクされていれば、高い Page 日 ank になります」 0 「あれなら簡単よ」 G00g厄の PageRank のしくみの巻 0 「じゃあ、今から私が世界一わかりやすい、 Goog 厄の Page 日 ank のしくみの説明 をしまーす ! 」 0 「やった一 ! 」 ひなた先生は、乗せられやすい性格だとケンイチは思った。 「まず、にゃんこサイトとわんわんサイトとゲコゲコサイトの 3 つの Web サイトがあ るとします」 105
ひなた先生が靆 第 6 回 テパックが —S ars atrix による ogglng ケンイチは入社して半年が経過した。仕事に慣れてきたケンイチは家に帰って からも自分のプログラムを書くようになった。それがスキルアップにつながれば 言うことなしだが、最近そのせいでなんだか寝不足。仕事に支障が出なければ 良いのだけど・・ くなるテクニック やばい ! ! 遅刻かも ? の巻 ケンイチは、会社の廊下を走っていた。ギリギリだ。 9 : OO に始業のベルが鳴るのだが、 今は 9 : 05 だった。しかも今日はひなた先生の授業のある水曜日である。 ひなた先生は、いつも 10 分前には特別会議室に到着していた。やばい、やばすぎるケン イチ。ひなた先生、怒ってるかも ! ? 息を切らしながら特別会議室に到着するケンイチ。 「す、、すみません。遅くなっちゃって」 「あらあら。ケンイチ君が遅刻なんて珍しいわね」 「スミマセン、スミマセン。寝坊しちゃって」 「タイムカードは 9 : OO までに押せた ? 」 「はい。それはなんとか」 「それじゃあケンイチ君が遅刻したのは見なかったことにしてあげるね」 「あ、、ありがとうございます ! 」 「そのかわり、私が遅刻したときも許してねっ」 104
第 5 回 関数の hooking ケンイチは、少し謙遜してそう言った。 「ええ、少しは」 ひなた先生に何もかも見透かされていた。 きたかな ? 」 「今日は、スタックについて勉強しますねー。ひょっとしてケンイチ君、予習して スタック構造の巻 と思って心配しちゃった」 「よかった。いつものケンイチ君に戻って。私、ケンイチ君がおかしくなったのか 0 「す、、すみません。考えことしていたもので」 ひなた先生になだめられるケンイチ。 83 ケンイチは自分のノートにイラストを描いてみせた ( 図 1 ) 。 り出すときは、 C → B → A の順になります」 「ですから、 A, B, C の 3 つの本がある場合、 A → B → C という順で積んだ場合、取 「うんうん」 0 ジしやすいです。本は重たいので、 1 冊ずつしか積んだり、降ろしたりできません」 この抽象的なオペレーションは、棚に本を積み重ねるときのことを想像するとイメー データを降ろす ( 取り出す ) ことです。 ます。スタックに対する操作は 2 つです。 1 つは、データを積むことで、もう 1 つは 「ええと、スタック (stack) とは英語で『積み重ね』や『干し草の山』を意味し 「じゃあ、スタック構造についてケンイチ君の知っていることを教えてくれるかな ? 」