01 / 読書ガイド
読書ガイド
引用
Petzold, C. (2022). Code: The Hidden Language of Computer Hardware and Software (2nd ed.). Microsoft Press (Pearson).
章の要約
第2版は全28章、索引を除いて約460ページで、2022年5月付の序文が付いている。個々の話題を並べた本ではなく、一続きの議論になっている。符号からスイッチへ、スイッチからリレーと論理ゲートへ、ゲートから加算回路とメモリへと進み、最後にそれらの部品を組み立てて動作する中央処理装置(CPU)を作り上げる。改訂についての著者自身の説明によれば、最初の17章は初版にほぼ沿っており(時計の章が新たに加わった)、その後に続くCPUの章は新しく書き下ろされた。アイコンの付いた回路図は、無料の補助ウェブサイト CodeHiddenLanguage.com で、アニメーション付きの対話的な形でも確かめられる。
第1–3章:Best Friends(親友);Codes and Combinations(符号と組み合わせ);Braille and Binary Codes(点字と二進符号)
本書は符号という考え方から始まる。索引によれば最初の2章はモールス符号を扱い、第3章は、浮き出た点の有無から作られる符号である点字に移る。これらを通じて、情報は二者択一の組み合わせで運べることが示される。
第4–8章:Anatomy of a Flashlight(懐中電灯の解剖);Communicating Around Corners(角の向こうへの通信);Logic with Switches(スイッチによる論理);Telegraphs and Relays(電信とリレー);Relays and Gates(リレーとゲート)
ハードウェアの話は電池、電球、スイッチから始まる。Pearson が公開している2つのサンプル章の一つである第6章は、アリストテレスの三段論法とジョージ・ブールの「クラスの代数」から出発し、ペットショップで客の希望をブール式に直す例をたどったうえで、直列につないだスイッチがANDのように、並列につないだスイッチがORのように振る舞うことを示す。第7章は電信用のリレーを紹介し、26ページと本書でも長い部類の第8章は、リレーを配線してNANDやNORを含む論理ゲートを作る。
第9–11章:Our Ten Digits(10個の数字);Alternative 10s(もう一つの「10」);Bit by Bit by Bit(ビットまたビット)
これらの章は記数法を説明する。十進法から他の基数へ進み、最後に二進法とビットに至る。著者によれば、第10章の終わりでは八進数を符号化・復号する2つの回路を示し、第8章のゲートを忘れさせないようにしている。もう一つのサンプル章である第11章は、日常の中のビットを探す。ポール・リビアの騎行の合図のランタン、映画評の判定、火星探査車パーサヴィアランスのパラシュート、パリティ検査を備えた統一商品コード(UPC)、そして一歩ずつ解読されるQRコードである。
第12–13章:Bytes and Hexadecimal(バイトと16進数);From ASCII to Unicode(ASCIIからUnicodeへ)
バイトと16進表記は初版より早い段階で導入される。第13章は、初期の電信符号からASCII、さらにUnicodeまでの文字符号化を扱い、UTF-8変換形式と、誤った文字セットを想定したときに何が起こるかに数ページを割いている。
第14–16章:Adding with Logic Gates(論理ゲートによる加算);Is This for Real?(これは本物か?);But What About Subtraction?(では引き算は?)
ゲートを組み合わせて二進数を加算する回路を作る。第15章は歴史的背景を示し、トランジスタによる加算は原理的にはリレーによる加算と同じだと論じる。ウェブサイトでは桁上げ先見(ルックアヘッド・キャリー)論理が実演されている。第16章は引き算を扱う。
第17–19章:Feedback and Flip-Flops(フィードバックとフリップフロップ);Let's Build a Clock!(時計を作ろう!);An Assemblage of Memory(メモリの組み立て)
フィードバックによって記憶する回路、すなわちフリップフロップが生まれる。新設の第18章はそれを使い、数種類の数字表示を備えたBCD(二進化十進)時計を作る。第19章はフリップフロップを組み合わせてアドレス指定可能なメモリにする。
第20–24章:Automating Arithmetic(算術の自動化);The Arithmetic Logic Unit(算術論理演算装置);Registers and Busses(レジスタとバス);CPU Control Signals(CPU制御信号);Loops, Jumps, and Calls(ループ、ジャンプ、コール)
第2版の中核である。第20章では、メモリに格納された符号が加算機を制御する。すべて新しく書かれた第21–24章は、インテル8080の命令セットの半分以上を実装するCPUを作る。算術論理演算装置、バスで結ばれたレジスタ群、各命令を順序づける制御信号、そして機械をチューリング完全にする条件ジャンプである。第24章ではコールとリターン、ビットシフトについても論じるが、実装はしない。
第25–28章:Peripherals(周辺装置);The Operating System(オペレーティングシステム);Coding(コーディング);The World Brain(世界頭脳)
最後の章群はコンピュータとそのソフトウェアを完成させる。第25章はビデオディスプレイ、タッチスクリーン、アナログ-デジタル変換器とデジタル-アナログ変換器を扱う。第26章はオペレーティングシステムとグラフィカルなインターフェースを扱う。第27章はプログラミング言語を論じ、読者がブラウザで試せる言語としてJavaScriptを用い、浮動小数点数などの数値がどう格納されるかも扱う。第28章は H・G・ウェルズ、ヴァネヴァー・ブッシュ、テッド・ネルソンに見られる地球規模の情報網の構想をたどり、ビットが変調によってどう伝わるか、ブラウザがHTTPでどうページを取得するかを説明する。
主要概念
第1–11章:符号、スイッチ、数
- 二進符号:モールス符号や点字のように、区別できる2つの状態の組み合わせで情報を表すこと。
- ブール代数:ブールの「クラスの代数」を、AND・OR・NOT と値0・1による論理として読み替えたもの。
- 直列回路と並列回路:スイッチを順につなぐとANDが、並べてつなぐとORが実現される。
- リレーと論理ゲート:電気で動くスイッチと、それから作られるゲート(NANDやNORを含む)。
- ビット:情報の最小単位で、2つの可能性からの選択。
第12–19章:データ、算術、メモリ
- バイトと16進数:8ビットの単位と、それを書き表す16進表記。
- ASCII、Unicode、UTF-8:7ビットの表から、可変長符号化を用いる万国共通の表までの文字符号化。
- 加算器:ゲートから作る二進数の加算回路。引き算もここから導かれる。
- フリップフロップ:フィードバックによって1ビットを保持する回路。アドレス指定と組み合わせて多数並べるとメモリになる。
第20–28章:プロセッサとその先
- 算術論理演算装置(ALU):CPUのうち算術演算と論理演算を行う部分。
- レジスタとバス:CPU内部の小さく高速な記憶場所と、その間でデータを運ぶ共有の経路。
- 制御信号:命令を解読し、CPUの各部を協調させてそれを実行させる信号。
- 条件ジャンプ:機械にループと判断を可能にし、チューリング完全にする命令。
批判的分析
長所
- 一度に一つずつ、飛躍なく進む。 序文は、ごく単純な概念から出発してデジタルコンピュータの動作の深い理解へと登っていくこと、そして比喩を重ねるのではなく技術者の言葉と記号を用いることを目標に掲げている。サンプル章はこれを裏づけており、第6章は予備知識を前提とせずに、三段論法からブール式、さらに実際のスイッチ回路へと進む。
- 概略ではなく本物のCPU。 著者は、初版が単純な格納符号から1970年代のマイクロプロセッサの命令セットへ飛んでしまい、読者にあまりに多くを信じてもらう必要があったため、後半を書き直したと説明している。新しい第21–24章はプロセッサをゲート単位で組み立てており、一般読者向けの本でこれを試みるものは少ない。
- 具体的で新しい例。 第11章はUPCバーコードとQRコードをビット単位で解読する。第2版ではUnicodeの記述が数ページに増え、ALGOLに代わってブラウザで実行できるJavaScriptが取り上げられている。
- 対話的な図。 補助ウェブサイトは主要な回路をアニメーション化しており、加算器、フリップフロップ、時計の中を電流が流れる様子を想像するだけでなく実際に見ることができる。
短所
- 中盤は骨が折れる。 序文は、溺れそうに感じた読者に「息継ぎをする」よう勧めており、著者は第21–24章に恐れをなす読者はそこを飛ばしてもよいと書いている。これらの章は長く(各20–24ページ)、細かい。
- 演習問題がない。 サンプル章には問題集がなく、学生は、たとえばシミュレータで回路を組むなどして、自分で練習の機会を作る必要がある。
- 単純化された、歴史的なハードウェア。 CPUは1970年代のインテル8080のサブセットを実装するもので、パイプライン、キャッシュ、マルチコアプロセッサといった現代的な話題は本書の範囲外である。
- ネットワークの扱いは簡潔。 インターネットを扱う最終章は著者自身の言うとおり短く、著者はインターネットについて同様の本を誰か別の人が書くことを望んでいる。
コースにおける位置づけ
本書はコンピュータアーキテクチャのコースへの最もやさしい入口であり、電子工学やプログラミングの経験がない読者のための物語である。ニサンとショッケンの The Elements of Computing Systems は、ゲートから動作するコンピュータまでという似た範囲を扱うが、学生が提供されたシミュレータで各層を自ら作るプロジェクトの連続として構成されている。先にペツォルドの第6–24章を読んでおくとそのプロジェクトに取り組みやすくなるし、並行して読むこともできる。ハリスとハリスの Digital Design and Computer Architecture, RISC-V Edition は同じ道のりを教科書として扱い、ハードウェア記述言語とパイプライン化されたRISC-Vプロセッサまで進む。
ブライアントとオハラロンの Computer Systems: A Programmer's Perspective はプログラマの側から機械を見る本で(データ表現、機械語、メモリ、プロセス)、第12–13章と第26–27章の後に進む先として自然である。ヘネシーとパターソンの Computer Architecture: A Quantitative Approach とシェンとリパスティの Modern Processor Design は現代のプロセッサの性能向上技術を扱い、コンピュータ構成論の授業を前提とする、本書をはるかに超える内容である。
本書の使い方
本書は、ハードウェアの授業の前に直観的なイメージを持ちたい計算機科学の初学者、他分野の学生、そして自分のプログラミング言語より下を覗いたことのないプログラマに向いている。算数以上の前提知識は必要ない。
- 順番に読む。 各章はそれ以前の章に依存しており、ゲートの章と記数法の章は第14章の加算器で合流する。
- 中核の道筋: 第1–20章で、符号からプログラム内蔵型の算術までの全行程をたどれる。
- CPUの章: 第21–24章はアーキテクチャのコースにとって最も価値があり、最も難しい部分である。ウェブサイトを開いたままゆっくり読み、制御信号を一つずつ手でたどるとよい。
- 仕上げ: 第25–28章は軽めで、手早く読める。第27章は最初のプログラミングの授業への橋渡しとして適している。
演習問題がないので、能動的な読み方が重要になる。回路を描き直し、CodeHiddenLanguage.com のアニメーションを追い、可能なら無料の論理シミュレータや The Elements of Computing Systems のプロジェクトでゲートや加算器を実際に組んでみるとよい。出版社の正誤表ページには訂正と差し替え図が掲載されている。
