3行でいうと

  • 論理ゲートから高水準言語、OSまでを、一冊の中で一気通貫に作りながら学ぶ
  • 下の層を信頼して上の層を作る、抽象化の積み重ねを体感する
  • 各章の成果物をテストで確かめながら進める開発の規律も学べる

向いている人

高水準言語は使えるが、その下で何が起きているのかをつかみたい人。独学で、コンピュータの全体像を作りながら学びたい人。

読む意味

ハードウェアからOSまでの各層を実際に作ることで、抽象化の意味と、性能やバグの原因を考える土台ができる。上から抽象化を学ぶSICPと対照的な、下から積み上げる学び方になる。

読むときの注意

Hackは教育用の簡易CPUで、実際のプロセッサのパイプライン、割り込み、キャッシュなどは扱わない。独自のHDLとシミュレータで進めるため、VerilogやVHDL、実機のFPGAとは別物である。

どんな本か

この本は、「NAND」という最も基本的な論理ゲートから出発して、自分の手でコンピュータ全体を作り上げていく教科書である。通称「Nand2Tetris」。ヘブライ大学のノーム・ニサンと、IDCのシモン・シャハム(ショッケン)が、それぞれの大学で教えていた講義をもとに書いた。通常なら複数の専門科目に分かれる内容を、一冊のプロジェクト集としてまとめている点が最大の特徴である。

構成は二部に分かれる。前半は「ハードウェア」で、NANDから基本の論理ゲート、加算器、メモリ、機械語、そしてHackという簡素な16ビットのCPUを持つコンピュータの組み立てまでを、ハードウェア記述言語の上で進める。後半は「ソフトウェア」で、アセンブラ、スタックを使う仮想マシン、Jackという独自の高水準言語、コンパイラ(構文解析とコード生成)、最後に最小限のOSを作る。課題は付属のシミュレータやエミュレータで検証でき、章ごとにテストと突き合わせて確認する。

狙いは、普段使う言語やフレームワークの下に何があるのかを、具体的なイメージとして持つことにある。ただし教育用に大きく単純化した設計なので、実際のCPUとの違いには注意が要る。

中身の柱

あわせて読む本

書評データベースの全文を読む

概要

「NANDゲートひとつから始めて、最終的にテトリスが動くコンピュータを自分の手で作り上げる」という壮大な学習体験を提供する、通称「Nand2Tetris」として知られる著作。著者はイスラエル・ヘブライ大学のノーム・ニサンと、IDC(現ライヒマン大学)のシモン・シャハムで、両名がヘブライ大学およびIDCで教えていた計算機システム構築の講義をもとに執筆し、原著はMIT Pressより2005年に刊行された。日本語版は斎藤康毅(『ゼロから作るDeep Learning』の著者としても知られる)の翻訳によりオライリー・ジャパンから刊行されている。本書の最大の特徴は、論理ゲート・順序回路・機械語・コンピュータアーキテクチャ・アセンブラ・仮想マシン・高水準言語のコンパイラ・オペレーティングシステムという、通常であれば複数の専門科目に分かれるコンピュータサイエンスの全レイヤーを、たった1冊、12章・12個のプロジェクトを通じて一気通貫に「自分の手で作りながら」学べるよう設計されている点にある。全ての課題は、著者らが独自に開発した無料の教材フレームワーク(HDLシミュレータ、CPUエミュレータ、VMエミュレータなど)上で検証でき、書籍と対になるオンライン教材・コース(後にCourseraの「Nand to Tetris」として展開)とあわせて世界中の独学者・大学の授業で使われている。関連するNand2Tetrisのプロジェクトおよびコースは世界400以上の教育機関(大学、高校、プログラミングスクールなど)で採用されており、教材と開発ツール一式は非営利目的であれば無償で利用できる形で公開されている。

本の構成

本書は全13章から成り(日本語版第2版の目次は第1部「ハードウェア」・第2部「ソフトウェア」の2部構成で、以下の部の区切りは旧稿の整理であり出版社の目次とは一致しない。詳細は末尾の補足節を参照)、各章末に実際に手を動かして完成させるプロジェクトが付属する。第I部「ハードウェア」(第1〜5章)では、単一の論理ゲートNANDから出発し、AND・OR・NOTなどの基本ゲート、加算器などの組み合わせ回路(第1〜2章)、フリップフロップとレジスタ・メモリなどの順序回路(第3章)、機械語命令セットの設計(第4章)を経て、最終的にHackという独自の16ビットCPUとコンピュータ全体をハードウェア記述言語(HDL)上で構築する(第5章)。第II部「ソフトウェア(下位レベル)」(第6〜8章)では、機械語へ変換するアセンブラの実装(第6章)、スタックベースの中間言語を扱う仮想マシン(VM)の実装(第7〜8章)を行う。第III部「ソフトウェア(上位レベル)」(第9〜11章)では、Jackと呼ばれる独自のオブジェクト指向高水準言語の仕様策定を経て、簡単なゲームなどをJackで書き(第9章)、その構文解析器(第10章)と、Jackコードを中間言語VMコードへ変換するコンパイラ(第11章)を実装する。第IV部(第12章)では、メモリ管理・数学演算・文字列処理・入出力制御などを提供するミニマルなオペレーティングシステムを構築し、最終的に第I部で作ったハードウェア上で、第II部・第III部で作ったソフトウェアスタックを通じてJackで書いたプログラム(テトリスのようなゲームを含む)が実際に動作するところまで到達する。末尾の章は日本語版で「さらなる冒険へ」(2015年版は「さらに先へ」)と題されているが、内容は確認できない。2021年には内容を刷新した第2版がMIT Pressより刊行され、日本語版も斎藤康毅の翻訳でオライリー・ジャパンから発行されている。

主要な内容

本書が徹底しているのは「抽象化の各層を、下位の層をブラックボックスとして信頼しながら独立に構築する」という計算機科学の中心的な方法論の体感である。ハードウェア部門では、NANDゲートの組み合わせだけで任意の論理関数が構成可能であること(NANDの万能性)を出発点に、順序回路によって「状態」と「時間」の概念を回路に導入し、最終的にプログラムカウンタとALU(算術論理演算装置)を備えたノイマン型アーキテクチャのCPUを完成させる過程が丁寧に構成されている。ソフトウェア部門では、スタックベースの仮想マシンアーキテクチャ(後年のJVMやCLIにも通じる設計)を経由することで、コンパイラの実装を「高水準言語→中間言語」と「中間言語→機械語」の2段階に分割し、それぞれの実装難易度を大きく下げる工学的な設計判断そのものを追体験できる構成になっている。構文解析の章では再帰下降構文解析法を用いてJack言語の文法を解析する手法が扱われ、コンパイラ理論の基礎(トークナイザ、パーサ、コード生成)を実装レベルで理解できる。オペレーティングシステムの章では、動的メモリ確保(malloc/free相当の実装)、固定小数点演算による乗除算、画面描画やキーボード入力のための低レベルAPIなど、OSが提供すべき最小限の機能セットを自作する経験を通じて、普段は意識しないOSの役割が可視化される。全体を通じて、下位層のバグは上位層の開発を著しく困難にするため、各章末で自作したモジュールをあらかじめ用意されたテストスクリプト(.tstファイル)と比較しながら段階的に検証を進める「各層ごとの単体テストの徹底」という開発規律も、本書が繰り返し強調する実践的な教訓である。ハードウェア部門で構築されるHackアーキテクチャは、16ビットのワード長、32Kワードの命令メモリと16Kワードのデータメモリ、A命令(アドレス指定)とC命令(演算)の2種類のみからなる極めてシンプルな命令セットを持つ設計で、複雑な実プロセッサの機能を極限まで削ぎ落とすことで、命令セットアーキテクチャの本質的な構成要素だけを教材として提示している。

具体例

各章の課題(プロジェクト)そのものが具体例であり、たとえば第1章では基本ゲート(AND、OR、XOR、マルチプレクサなど)をNANDのみから合成する演習を行い、第3章ではDフリップフロップから16ビットレジスタと64KBのRAMチップを構築する。第5章の最終課題であるHackコンピュータの構築では、命令フェッチ・デコード・実行というCPUの基本サイクルを回路として実装し、書籍付属のCPUエミュレータ上でアセンブリプログラム(例えば2つの数の最大値を求めるプログラム)を実際に実行して動作確認する。第7〜8章の仮想マシンの実装では、スタックへのプッシュ・ポップ操作と算術・論理演算、分岐命令、関数呼び出し時のコールスタック管理を段階的に実装し、複数の高水準言語からの利用を想定した中間表現の設計思想を体験する。第9章から第11章にかけては、Jack言語で書かれたシンプルな対話型プログラム(数当てゲームや簡単な描画プログラムなど)を題材に、字句解析・構文解析・コード生成の各段階を実装し、最終的にはOSモジュールと組み合わせてスクリーン上にグラフィックスを描画したりキーボード入力を処理したりするプログラムが、第I部で自作したハードウェア上で実際に動くという、書名の「Tetris」が象徴する到達点が用意されている。第12章のオペレーティングシステムの実装では、Jackで書かれたMathクラス・Stringクラス・Arrayクラス・Outputクラス・Screenクラス・Keyboardクラス・Memoryクラス・Sysクラスという8つの標準クラスライブラリを自作し、乗算をビットシフトと加算の繰り返しで実現する、平方根をニュートン法に類する二分探索で近似計算するといった、普段は言語処理系やハードウェアが隠蔽している基本演算の実装方法も具体的な課題として扱われる。

実践への応用

本書で得られる知識は、直接的にはCPU設計・組み込みシステム開発・コンパイラ開発・OS開発といった低レイヤー領域のエンジニアリングに応用できるが、より広い意味では、日常的に扱っている高水準言語やフレームワークの「下に何があるのか」を具体的なイメージとして持つことで、パフォーマンスチューニング、メモリ管理の理解、バグの根本原因追跡といった実務上のデバッグ能力・システム理解力の底上げに寄与する。ソフトウェアエンジニアリング企業においては、新人研修や技術力強化プログラムの教材としてNand2Tetrisのプロジェクトを利用するケースがあり、抽象化の各層を横断的に理解した技術者を育てる目的で活用されることが多い。また、FPGAを用いた実機実装への拡張教材(NANDGameなどのWeb版シミュレータ含む)も派生的に登場しており、ハードウェア記述言語(Verilog、VHDL)学習への橋渡しとしても位置づけられる。

位置づけ・評価

本書はコンピュータサイエンス教育において「積み木を一段ずつ積み上げる」体験学習の代表例として高く評価されており、著者らが開講した同名のオンラインコースはCourseraで数十万人規模の受講者を集めた人気講座となった。2021年には第2版がMIT Pressより刊行され(日本語版は斎藤康毅訳でオライリー・ジャパンより発行)、ハードウェア部門の教材がより最新のツールチェーンに対応する形でアップデートされている。抽象化の階層構造をボトムアップに実装しながら理解する本書のアプローチは、SICPがトップダウンに抽象化の概念を扱うのとは対照的なアプローチとして、しばしば両書が比較・併読される形で紹介される。実務上は、本書の内容が実際の産業用CPUやOSの設計と比べて大幅に単純化されている点(Hackアーキテクチャは教育目的の16ビット簡易CPUであり、実プロセッサのパイプライン化や割り込み処理、キャッシュ階層などは扱われない)には留意が必要だが、「なぜコンピュータは動くのか」を自分の手で腹落ちさせる教材として、独学者・大学教育の双方で高い評価を得ている。