Good Ideas through the Looking Glass

IEEE Computer Jan / 2006 の記事。
http://doi.ieeecomputersociety.org/10.1109/MC.2006.20

過去を振り返ってその時点ではよかったアイデアをけなす、というコラム。いろいろ槍玉にあがっているのだけど、かなり首をかしげるところもあった。まあ、このコラム自体が軽いネタみたいなものなので、マジレスもよくないのだが、そういうことは考えずに全力で攻撃。

1つ目
 Virtual Addressing はメモリも潤沢になってきたし、CPUがマルチユーザモードで動くとか複雑なのはよくない、とおっしゃっている。この人はいったいどの世界のマシンを使っているんだろう?ことwindowsに関しては、アプリも肥大化してハードリソースはあるだけ使うし、Linuxでは、ディスクキャッシュでメモリをめいっぱい使うなんてよくあること。メモリはいくらあっても足りないし、swapは意外と使われている。
 それ以上に大事なのが、仮想メモリはプロセスごとに別のメモリ空間を提供するということ。複数プロセスでテキスト領域を共有するとか、global データを共有してcopy-on-writeとか、そういったパフォーマンス上のテクニックはプロセスごとに独自のメモリ空間を持っているから成り立つのであって、組み込み以外では今さらvirtual addressingがquestionableなんておかしいと思う。
 まあ、これは用語の使い方の問題でこの人のvirtual addressingにはプロセスごとのメモリ空間は含まれていないのかもしれないけどね。でもプロセスごとにメモリ空間を区切るんだったら間接的なアドレッシングは必要なはず。

2つ目
 loophole(いわゆるcast)は言語が提供する抽象性を壊すのでよくない、とおっしゃる。
 俺も基本的にはcastの乱用がダメなのは賛成。でもネットワークから読んだデータや、バイナリ形式のファイルを読むときはcastが絶対に必要。つまりcastは、魑魅魍魎渦巻く現実の世界から、プログラム言語をいう抽象化された世界へのインタフェースなわけ。だから、プログラムが外部とインタフェースを持つときには絶対にcastが必要になる。これは本質的なことであって、言語の抽象性がどうとかいう問題じゃない。ここでの問題はcast自体ではなくて、castのmisuseなので、攻撃対象が違っている。


3つ目
 プログラムパラダイムとして、関数言語はステートレスなのがダメだし、特徴が他に真似されたからダメ、論理プログラムは実装が複雑すぎてダメ、とひたすら言語パラダイムを斬った後に、オブジェクト指向手続き型言語と何も変わらないからダメとトンデモ論理を展開しましたよ。
 いや、分かりますよ。クラスはレコードなのね。で、メソッドは関数だ、と。はいはい。これはなんというか本当に学者さんのものの見方ですね。確かに、クラスをステートマシンと見てメンバに注目すればレコードですよ。メソッドをthisを暗黙の引数にとる関数と見れば関数ですよ。
 でもねぇ、プログラミングは人間がやるものだから、数学的に等価なものが全く同じとは限らないんだな。オブジェクト指向のうまみは人間が理解するのに近い抽象を提供していることであって、論理プログラミングのような計算パラダイムの違いを提供しているわけではないんだよね。きっとこういう人には、分かりやすくするためにあえて冗長なコードを書いたりするようなプログラマの気持ちはわからんのだろうなぁ。

 ちょっと学者と現場のエンジニアの乖離を感じましたよ。やれやれ。