著作一覧 |
たぶん、例のあれは別の関数を使って初期化してるんだよ。
あれだと何が起きているかわかりにくいから、ちゃんとハローワールドにしておいた。
#includeこのプログラムを、まずはVC2008++でコンパイル実行してみよう。void foo() { int b = 0; char* a = "hello world !"; } void bar() { int b = 0; char* n; printf("%s\n", n); } int main(int argc, char* argv[]) { foo(); bar(); return 0; }
c:\test>cl hello.c Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. hello.c c:\test\hello.c(11) : warning C4700: 初期化されていないローカル変数 'n' が使用されます Microsoft (R) Incremental Linker Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. /out:hello.exe hello.obj c:\test>hello hello world ! c:\test>
何か些細な警告が出ているが、気にする必要はない。常に正しくハローワールドする。嘘だと思ったら試してみれば良い。ソースはあるんだから。
ここでマシンを変える。
Linuxワールドに来たぜ。
arton@monde:~/tmp$ gcc hello.c -o hello arton@monde:~/tmp$ ./hello hello wolrd !
もちろん問題なし。警告もなしだ。嘘だと思ったらためしてみよう。ソースはあるのだ。
でも、最適化はやめてくれ。あれはバグバグだ。
arton@monde:~/tmp$ gcc -O hello.c -o hello arton@monde:~/tmp$ ./hello Segmentation fault (core dumped)
案の定、ーOを付けたらコアになった。だから、プロダクトモードでは最適化は切るものなんだぜ。
てなことを4月1日に書けば良いのだな(もっとも、4/1用なのは最後の結論だけだけど)。
これは、興味深い指摘だ。
単純さ、理解のしやすさという点でも、テーブルの結合操作というのは、結構嫌われるのですよ。データベースの 正規化 vs 非正規化 というのは、オブジェクト指向でいう、小クラス主義 vs 大クラス主義 に通じるものがあるんじゃないですかね。
違うといえば、RDBの場合結合操作が想定済みなのに対して……(オブジェクトは実装継承以外の結合は想定外と書こうと思ったが、ポインタだのリファレンスがあるわけだから想定外ってこともないな、と思いとどまる)……確かに通じるものがあるなぁ。
大クラス主義とか、非正規DBでも、そのほうが良いと考えてユースケースや後先まで想定した結果そうしたのと、分割するという発想がないため結果的にそうなるのでは、生成物は同じでもずいぶん異なる。
これは異なるのか、それとも同じなのか? へたな考え休むに似たりなのか。
おそらく異なる。
少なくとも、生成した人間が次の一手を付け加えるとき、あるいはなんらかの理由で修正をかけるときには、ずいぶんと異なるのではなかろうか。
では、他人がメンテするとしたらどうか?
おそらく等しい(本当に生成物が同じなら)。
でも、経験的には、外部インターフェイスが同じであっても内部インターフェイスは、少なくともプログラムの場合は異なる。
データベース(端的にはテーブルのスキーマ)はどうだろうか? 同じだよなぁ。
そこが異なる。
ジェズイットを見習え |