コーヒータイム -Learning Optimism-

本を読むということは、これまで自分のなかになかったものを取りこみ、育ててゆくこと。多読乱読、英語書や中国語書もときどき。

【おすすめ】コンピュータサイエンス専攻必携の教科書〜パターソン&ヘネシー『コンピュータの構成と設計(第5版)』

 

パタヘネの愛称で知られる、コンピュータサイエンス専攻必携教科書。非常にわかりやすく書いてあるため、想像力をフル回転させれば、コンピュータについて基本事項を一通り知りたい読者が読むにも良い。一方で、欧米で使用されている基礎教科書の例にもれず、余裕で人を殴り倒せそうな分厚さである。眠れない夜に少しずつ読むのにぴったり。

私はコンピュータ専攻ではないから、パタヘネは一般教養としてパラパラ読んでみた(そして第四章あたりでついていけなくなった)のだけれど、なかなか面白い。電脳と呼ばれることもあるコンピュータの「頭の中」をのぞきこんでみて、大まかなイメージをもっておくことは、ビックカメラで新しいノートパソコンを選ぶときに役立つ、かもしれない。

 

本書の副題は「ハードウェアとソフトウェアのインターフェース」だが、中心的テーマを引用する。

いかなるコンピュータでも、根底にあるハードウエアは基本的に同じ機能を遂行する。それは、データの入力、データの出力、データの処理、データの記憶である。これらの機能をどのように実行するかが本書の中心的なテーマであり、以降の章はこれら4つの機能に関してそれぞれ異なる側面から説明するものと言える。

さらにコンピュータは、機械として、電気信号のONとOFFしか認識できないため、すべての機能はこのことを考えて実行されなければならない。

このことをふまえて、まず本書では、コンピュータのハードウェアの「32ビット」がどのように利用されているかを徹底的に解説する。32ビットとは機械でいえばONまたはOFFの電気信号を出すスイッチセットが32個あること。この32個のスイッチセット(レジスタと呼ぶ)を32本使用して、あらゆる指示をコンピュータに出せるよう設計されているのが、MIPSと呼ばれるコンピュータ言語である。

とはいえこのMIPSは機械が実行しやすいように設計されているぶん、人間の言葉からかけ離れているので扱いにくい。実際には、より人間の言葉に近いC言語だのJavaだのでプログラミングしてから、MIPSに「翻訳」することがほとんど。逆にいうと、MIPSに翻訳さえできれば、人間のプログラマーは使用するプログラミング言語を自由に選べる。英語しか理解できないひとに、日本語しかできないひとがなにかを伝えたいとき、日英通訳を雇うようなものだ。もとの言葉が中国語でもフランス語でもスワヒリ語でも、それを正確に英語に通訳できるひとがいればいい。

MIPSに翻訳されるプログラミング言語にも、それぞれ特徴がある。実際の言葉である英語や日本語にそれぞれ特徴があるのと同じだ。よくいわれるのは、日本語では「私」「僕」「俺」「わたくし」「我」「自分」「吾輩」「拙者」などなどバラエティ豊かな一人称が、英語では全部味気ない「I」になってしまうこと。プログラミング言語も同じで、ある操作を表現するやり方がちょっとずつ違い、それがバグの原因になることもある、らしい。

文字列の長さを示す方法は3通りある。(1)文字列の最初の文字を文字列の長さを示すために使用する。(2)付随する変数に文字列の長さを保持する(データ構造として)。(3)文字列の最後の文字に文字列の終端を表す特定の文字を使用する。C言語では3番目の方法をとっており、(......)Javaでは1番目の方法がとられている。

 

言語の解説が終われば、本書ではいよいよ構成を詳しくみていく。

コンピュータはどんどん進化し、建物サイズの真空管のお化けから家庭用パーソナルコンピュータ、ノートパソコン、さらにはスマートフォンタブレットに姿を変えてきたわけだけれど、本書のタイトルにも含まれる『構成』要素は変わらない。人間の脳が古今東西問わず大脳・小脳・脳幹からできているのと同じく、コンピュータの古典的な5つの構成要素は【入力】【出力】【記憶】【データパス】【制御】。データパスと制御を合わせてプロセッサと呼ぶことも。

人間の脳の場合、構成要素はわかっても、それらがどうやってお互いに働きかけているかは、なかなか解析がむずかしい。また、人間の脳をどう効率よく働かせることができるかもよくわかっていない。世間では『記憶術』だの『思考法』だのの本があふれているが、ほんとうに頭の回転が速いひとはそれほど多くない。一方で本書では、コンピュータ構成について「こうすれば少ないエネルギーで多くの仕事ができる」というアイデアがすでにまとめられている。

コンピュータ・アーキテクチャにおける8つの主要なアイデア

  • Mooreの法則の設計
  • 設計を単純化するための抽象化
  • 一般的な場合を高速化する
  • 並列処理による性能向上
  • パイプライン処理による性能向上
  • 予測による性能向上
  • 記憶階層
  • 冗長性による信頼性向上

ちなみに主要アイデアにさらりと含まれている「並列処理」は、実はかなり革新的なやり方らしい。

並列処理はコンピュータ処理の性能にとって常に重要であったが、それが表に出てこないことが多かった。(......) ハードウエアの並列性を明示的に意識して、それに合わせてプログラムを組み直すようプログラマに強いることは、コンピュータ・アーキテクチャ上の「タブー」であった。(......)最終的にはプログラマが明示的な並列プログラミングへの転換に成功するだろうという見込みに、IT業界全体が将来を賭けたことは、驚きである。

しかし並列処理がでてくるまえに、本書ではまるまる一章をかけて、小学校で習う加減乗除がコンピュータでどのように計算されるかが説明される。

たぶんエクセルを使ったことがある人であれば目にしたことがあるだろうけれど、コンピュータの数値計算はたまにおかしなことになる。ひとつの数字を32個(もっと精度がほしければ64個)のスイッチセットで表現しようとしたら、どうしても丸めなければならないからだ。おかげでいちばん単純な分数である1/3も表現に気をつかわなければならない。ちなみにコンピュータでは指数表現を利用して、32個あるスイッチセットのうち8個を指数用に割り振ることで、より大きな数字を表現出来るようにしている。この説明をしてからようやく並列処理の説明で、複数の計算を同時に行うやり方を、コンピュータにそもそも実装されている命令とともに説明している。

 

こういうふうに本書では、最初から最後まで、ONまたはOFFの電気信号を出すスイッチセットがコンピュータの実体だということを読者が忘れないように念押ししながら、コンピュータに色々仕事をさせるための命令について解説する。

数量に限りがあるON/OFFスイッチセットを相手に、プログラマは暗黙の了解を利用してデータを最適化したり、速度をあげるところとあげないところを判断したり(基本的によく使う機能は速度をあげる)、速度なり計算結果精度なりをアップさせるためにアルゴリズムを工夫したり、情報処理にかけられる時間とメモリを検討したりしているわけだ。

スマホでもタブレットでも、普段使用しているソフトウェアもアプリでも、いまこうして書いているブログでも、すべてはON/OFFスイッチセット、インプットとアウトプット、メモリの処理であると考えるのはなかなか新鮮。面白半分に学んだことのない領域の基礎教科書を読むのはなかなかない経験だが、心底読んでよかったと思う。