Preface to the Paperback Edition
  前書き


2015/7/7:

 コンピューターは、0 と 1 を積んだ列車が出てこなくても、クール!

この本を、筆者は、コンピューターについて、その発想の面白さ・興味深さを、その発達の歴史を通して、書こうとしていました。でも、
  コンピューターの仕組み
の本として、受け止められてしまいました。
でも、そのことも伝えたいことの一つだと思われますし、結局は、名著 だと言われるようになったので、特に不満はないと思われます。

私が、この本を読もうと思ったきっかけは、プログラミングが好きで、いろいろと勉強しているのですが、いつも、
  メモリ、ガーベッジコレクション、参照渡し・値渡し
などの用語が出てくるたびに、いまひとつピンとこないまま、なんとなく理解をしていました。でも、自分のWebページで、Javaの英語本の翻訳をしている際、曖昧な理解で、これから先、きちんと説明できるのか? ということと、私自身もきっちり知っておきたいという気持ちから読み始めました。

たしかに、Javaの場合、C++言語 などと違って、「メモリの開放」などは、ガーベッジコレクションが自動でやってくれるし、コンピュータの仕組みを完璧には知っていなくても、ルールさえきっちり覚えれば、プログラミングは、できますし、中には、それでも、クールなプログラムを書ける人もいるとは思います。でも、毎回 メモリ や、アドレス/コンピュータでの住所 などの言葉が出てくるたびに、もやもやしています。なので、ここらで、きっちりしておこうと思ったわけです。 まず、ここで筆者がよく聞く質問として、
  1. メモリ と ストレージ の違い
  2. Windows で動くプログラムが、どうして Mac では動かないのか?
この2つをあげていました。2つ目の問は、かなり難しいようなので、この部分ではその答は書かれていませんでした、が、1つ目の問 の、「メモリとストレージの違い」に、関しては、簡単に説明されていました。
その説明は、おいおい出てくると思われますので、その時に、まとめたいと思いますが、その簡単な、、実は比ゆ的な説明の部分ですが、、説明だけでも、一つ疑問が解けました。
  Javaのオブジェクトは、参照渡し(正確には、参照の値を渡す)
という話ですが、ピンと来ましたね。
「値渡し」とは、値をコピーして渡すこと、変数に代入する時などです。これはJavaの場合「数値」などがそうです。
「参照渡し」とは、オブジェクトなどで、コピーせずに、その「オブジェクトのありか」を、例えば、変数に代入することです。
なんで、こんなややこしいことをするのか?、それは、「メモリの節約」だったのです。「ありか/アドレス」は、ずっと小さなメモリで済むのですね。私は、自分でメモリ交換をしたこともあるのですが、こんな説明を聞かないと分からなかったのでした。
Javaの場合このことを知っていないと、違う名前の変数に、同じオブジェクトを代入した場合、どちらかを変更した場合、もう一つの変数にもその影響が及ぶという事を理解できません。
今までは、知っておかないと困るから、私の場合は、経験が浅いので、単に、sjcpだけのためでしたが、無理やり頭に詰め込んでいました。
でも、メモリとストレージ(ハードディスク・USBメモリなど)の違いが分かれば、数回の学習で、自然に覚えられたでしょう。だってそうしないと、すぐにメモリが満タンになってしまいますね。つまり、毎回コピーをとっていたらということです。

やはり、コンピューターの仕組み を知っておくことは大切です!
しかも、筆者は、「0 や 1 を載せた列車のような比ゆを使わなくても、コンピューター自体が、beautiful だ」と言っています。きっと interesting/興味深い 話が始まるでしょう。