---
title: "Nand to Tetrisとは？NANDからCPU・OSまで自作する12プロジェクトの進め方と所要時間"
url: "https://www.issoh.co.jp/tech/details/9784/"
published: 2025-11-13
updated: 2026-10-19
categories: ["開発"]
publisher: "株式会社一創"
---

# Nand to Tetrisとは？NANDからCPU・OSまで自作する12プロジェクトの進め方と所要時間

Nand to Tetris（nand2tetris）は、NANDゲートという1種類の論理素子を出発点に、16ビットCPU・アセンブラ・VM変換器・コンパイラ・OSまでを自分で組み上げる教材です。テトリスを作る講座だと思われがちですが、作るのは**テトリスのようなアプリが動く土台のコンピュータ**で、提出課題は12本のプロジェクトに分かれています。この記事では、各プロジェクトの提出物、Web IDEでの始め方、所要時間、実装言語の選び方、書籍『コンピュータシステムの理論と実装 第2版』との対応を、公式資料と公式IDEでの実測をもとに整理します。

## まとめ：Nand to Tetrisの全体像と着手前に押さえる要点

- **提出課題は12プロジェクト、書籍は全13章**。Part I（ハードウェア）がプロジェクト1〜6、Part II（ソフトウェア）が7〜12で、書籍13章に対応する課題はありません。
- **ツールはブラウザ版のWeb IDEを使います**。Java製のデスクトップ版は公式ページで「主に後方互換のため」の提供とされ、配布の案内文書（v2.7）には「no longer supported」と廃止予定が明記されています。
- **所要時間の公称値は、Part Iが週10時間で4週間、Part IIが週10時間で2.5か月**（Coursera表示）。Part IIのほうが倍以上重く、個人の完走記では10か月かかった例もあります。
- **プロジェクト6〜8・10〜11の変換プログラムは好きな言語で書けます**。公式はJavaとPythonをよく選ばれる例に挙げています。新しい言語の練習を兼ねると、その分だけ期間が延びます。
- **難所はプロジェクト5（CPU）と8（関数呼び出し）**。ここだけは時間を厚く見積もってください。
- **公式は解答を公開しないよう要請しています**。公式ライセンスページがブログ等への解答掲載を控えるよう求めているため、この記事にも完成コードは載せていません。

## Nand to Tetrisの全体像：12プロジェクトで作るHackコンピュータ

Nand to Tetris は Noam Nisan 氏と Shimon Schocken 氏による教材で、原著『The Elements of Computing Systems』の第2版はMIT Pressから2021年に出ています。公式サイトは[大学・高校・ブートキャンプを合わせて400以上で教えられている](https://www.nand2tetris.org/)と案内しています。ゴールは **Hack** という16ビットコンピュータを、論理ゲートからOSまで通しで作り切ることです。1段前に作ったものが次の段の部品になる構成で、上の層は下の層の実装に依存しますが、詰まったときは組み込み版で代用して先へ進めます。

### 12プロジェクトの提出物と書籍13章の対応

[公式のコースページ](https://www.nand2tetris.org/course)が並べる12プロジェクトに、各プロジェクトページに書かれた提出物の形式と、邦訳書第2版の章を並べると次のとおりです。

| No | 課題名                          | 作るもの（入力→出力）               | 書籍の章             |
| -- | ---------------------------- | ------------------------- | ---------------- |
| 1  | Boolean Logic                | 論理ゲート15チップ（.hdl）          | 1章 ブール論理         |
| 2  | Boolean Arithmetic           | 加算器とALU（.hdl）             | 2章 ブール算術         |
| 3  | Memory                       | レジスタ・RAM・PC（.hdl）         | 3章 メモリ           |
| 4  | Machine Language             | アセンブリ2本（.asm）             | 4章 機械語           |
| 5  | Computer Architecture        | Memory・CPU・Computer（.hdl） | 5章 コンピュータアーキテクチャ |
| 6  | Assembler                    | アセンブラ（.asm→.hack）         | 6章 アセンブラ         |
| 7  | VM I: Stack Arithmetic       | VM変換器 前半（.vm→.asm）        | 7章 仮想マシン1        |
| 8  | VM II: Program Control       | VM変換器 後半（ディレクトリ→1本の.asm）  | 8章 仮想マシン2        |
| 9  | High-Level Language          | Jackアプリ1本（.jack）          | 9章 高水準言語         |
| 10 | Compiler I: Parsing          | 構文解析器（.jack→.xml）         | 10章 コンパイラ1       |
| 11 | Compiler II: Code Generation | コンパイラ（.jack→.vm）          | 11章 コンパイラ2       |
| 12 | Operating System             | Jack OSの8クラス（.jack）       | 12章 OS           |
| \- | （課題なし）                       | \-                        | 13章 さらなる冒険へ      |

「全12章」と書く解説もありますが、書籍は13章構成です。13章は読み物で、公式GitHubリポジトリ nand2tetris/projects の `projects/13` には `more fun to go.txt` という案内テキスト1本しかありません。

表の「作るもの」を見ると性格の違いがはっきりします。1〜5は**HDLで回路を書く**回（4だけはアセンブリ）、6〜8と10〜11は**自分の好きな言語で変換プログラムを書く**回、9と12は**Jackでプログラムを書く**回です。

### Hackコンピュータの仕様とメモリマップ

Hackは16ビットのマシンで、命令メモリは `ROM32K`、汎用RAMは `RAM16K` です。データ側のアドレス空間には、画面とキーボードのメモリマップも含まれます。公式配布の `Memory.hdl` のヘッダによると、使われるのは 16K＋8K＋1 ワードで、**0x4000（10進16384）から 0x5FFF がスクリーンのメモリマップ、0x6000（同24576）がキーボード**、0x6000 を超えるアクセスは不正です。画面は512列×256行の白黒で、8Kワードがそのまま画素のビット列に対応します。

CPU側は、`CPU.hdl` のヘッダが「ALU、AとDという2本のレジスタ、PCという名前のプログラムカウンタから構成される」と定義しています。画面出力もメモリ書き込みだけで完結し、割り込みもデバイスドライバも登場しません。[FPGAとは？LUTで回路を組む仕組みとCPU・ASIC・CPLDとの違い](/tech/details/9296/)で扱うような実チップの制約は入らない、教育用に絞り込んだ設計です。

## ハードウェア編：論理ゲートからCPUまでの構築（プロジェクト1〜5）

Part I の記述言語は教材専用のHDLで、VerilogでもVHDLでもありません。チップの入出力を宣言し、部品チップの結線を並べるだけの小さな言語です。

### プロジェクト1で実装する15チップとHDLの書き方

プロジェクト1で作るのは Not、And、Or、Xor、Mux、DMux、Not16、And16、Or16、Mux16、Or8Way、Mux4Way16、Mux8Way16、DMux4Way、DMux8Way の15チップです。Nandは対象外で、[公式のプロジェクト1ページ](https://www.nand2tetris.org/project01)は「except for the Nand chip, which is considered primitive, and thus there is no need to implement it.」と明記しています。**プロジェクト1ではNandを原始チップとして使い、残りの15チップを実装します**。後続の課題ではDFFや画面・キーボード、命令ROMなども組み込み部品として与えられます。

配布される `.hdl` ファイルは、入出力の宣言だけが書かれた骨組みです。たとえば `Mux.hdl` は次の状態で渡されます。

```
CHIP Mux {
    IN a, b, sel;
    OUT out;

    PARTS:
    // Put your code here:
}
```

学習者は `PARTS:` の下に部品チップの結線を1行ずつ書き足します。完成コードを載せないのは、[公式ライセンスページ](https://www.nand2tetris.org/license)が「we request that you don’t post solutions publicly on the web, e.g. in blogs, forums, or Github-like places.」と求めているためです。考え方だけ示すと、**Not は NAND の両端に同じ信号を入れれば得られます**。And はその Not を NAND の出力に重ねる形、Or はド・モルガンの法則から両入力を反転して NAND に通す形、Xor は Not・And・Or を部品として組み合わせる形になります。

### .tstと.cmpで進める合否判定の流れ

実装したHDLは、Hardware Simulatorにテストスクリプトを読ませて検証します。プロジェクトごとに `.tst`（テスト手順）と `.cmp`（期待出力）が最初から配られているので、答え合わせは自動です。`Not.tst` の中身はこうなっています。

```
load Not.hdl,
output-file Not.out,
compare-to Not.cmp,
output-list in%B3.1.3 out%B3.1.3;

set in 0,
eval,
output;

set in 1,
eval,
output;
```

対応する `Not.cmp` は次の3行です。

```
|  in   |  out  |
|   0   |   1   |
|   1   |   0   |
```

シミュレータが生成した `.out` と `.cmp` は空白文字の違いを無視して比較され、値が異なる行があると不一致で止まるので、独学でも合否がはっきりします。`.hdl` を置いていないチップはシミュレータが組み込み実装で肩代わりするので、プロジェクト2以降で上流のチップに自信が無いときも、組み込み版に任せて先に進めます。

### プロジェクト2〜5：ALU・記憶素子・CPUの組み立て

プロジェクト2は HalfAdder、FullAdder、Add16、Inc16、ALU の5チップです。プロジェクト3は記憶素子で、組み込みチップとして与えられるD型フリップフロップ（DFF）からBitとRegisterを組み立て、RAM8からRAM16KまでRAMの容量とアドレス幅を広げます。PCは別途、命令の実行位置を保持するプログラムカウンタとして実装します。プロジェクト4はハードウェアを離れ、R0とR1の積をR2に求める `Mult.asm` と、キー入力に応じて画面を塗りつぶす `Fill.asm` をHack機械語で書きます。この回はCPU Emulatorの使用が必須で、アセンブラの使用は任意です。

山はプロジェクト5です。作るのは `Memory.hdl`、`CPU.hdl`、`Computer.hdl` の3本だけですが、CPUは命令のデコード・ALUへの入力選択・ジャンプ判定・PCの更新を1枚のHDLに詰め込みます。公式はCPUを書籍のFigure 5.9の提案実装に沿って組み、MemoryとCPUを単体テストしてからComputerへ進むよう案内しています。**プロジェクト5は3チップでも、CPU内部の制御と部品間の接続をまとめて確認する工程です**。

## 機械語とアセンブラ：A命令・C命令の16ビット符号化（プロジェクト4・6）

Hack機械語の命令は2種類だけです。`@値` と書くA命令は `0vvvvvvvvvvvvvvv` で、先頭が0、残り15ビットに値かアドレスが入ります。計算を指示するC命令は `111accccccdddjjj` で、先頭3ビットが `111`、続く7ビット（aを含む `comp`）が演算内容、3ビットの `dest` が格納先、3ビットの `jump` が分岐条件です。

プロジェクト6のアセンブラは、`ファイル名.asm` を読んで `ファイル名.hack` を出力します。最初に通す公式サンプル `Add.asm` は、RAM\[0\] に 2＋3 を書き込むだけのプログラムです。

```
// Computes R0 = 2 + 3  (R0 refers to RAM[0])

@2
D=A
@3
D=D+A
@0
M=D
```

これを仕様どおりに符号化すると、次の6ワードになります。

| アセンブリ | 機械語（2進16ビット）     | 種別  |
| ----- | ---------------- | --- |
| @2    | 0000000000000010 | A命令 |
| D=A   | 1110110000010000 | C命令 |
| @3    | 0000000000000011 | A命令 |
| D=D+A | 1110000010010000 | C命令 |
| @0    | 0000000000000000 | A命令 |
| M=D   | 1110001100001000 | C命令 |

4行目の `D=D+A` を分解すると、先頭 `111`、a ビットが 0（Aレジスタを参照）、comp が `000010`（D+A）、dest が `010`（Dへ格納）、jump が `000`（分岐なし）です。実装で手間がかかるのはこの符号化よりも**シンボル解決**のほうで、前方参照を解決する方法として、ラベル定義を集める1パス目と命令を出力する2パス目に分ける実装が分かりやすいでしょう。公式もシンボルなしの変換を先に作り、シンボル対応を後から足す2段階を勧めています。アセンブラ・コンパイラ・リンカが実務の開発環境でどう連なるかは[ツールチェーン(toolchain)とは？構成要素と言語別の実例・GradleのJava Toolchain設定](/tech/details/7073/)で整理しています。

## ソフトウェア編：VM変換器・コンパイラ・OS（プロジェクト7〜12）

### プロジェクト7・8：スタックマシン方式のVM変換器

高水準言語からHack機械語への変換は、式の評価結果をRAMに退避すれば直接行うこともできますが、この教材ではコンパイラを高水準言語側と機械依存側に分けて実装します。その間に挟む中間層がスタックマシンのVMです。プロジェクト7の変換器は `ファイル名.vm` を `ファイル名.asm` へ変換し、`push`／`pop`／算術命令を扱います。公式サンプル `SimpleAdd.vm` は3行です。

```
// Pushes and adds two constants.
push constant 7
push constant 8
add
```

これを検証する `SimpleAdd.tst` は実行前に `set RAM[0] 256` でスタックポインタを初期化し、期待値ファイル `SimpleAdd.cmp` は **RAM\[0\]=257、RAM\[256\]=15** を要求します。定数を2つ積んで加算した結果、スタックの底に15が残り、ポインタが1つだけ進んでいる状態を数値で突き合わせる仕組みです。

難所はプロジェクト8です。分岐（`label`／`goto`／`if-goto`）と関数呼び出し（`function`／`call`／`return`）を追加し、ディレクトリ内の複数の `.vm` を1本の `ディレクトリ名.asm` にまとめます。`call` では戻りアドレスと呼び出し元の LCL・ARG・THIS・THAT をスタックに退避し、`return` で正しい順序に復元します。

もう一つ、命令メモリの容量も意識しておくべき制約です。公式リポジトリの `projects/06/pong/Pong.asm` は、Jackで書いたPongをJackコンパイラでVMコードにし、VM変換器でHackアセンブリにしたものだとヘッダに書かれています。ラベルを見ると、OSの8クラスの関数も同じファイルに入っています。コメント・空行・ラベル行を除いて命令を数えると**27,483命令で、ROM32K（32,768ワード）の83.9%**を占めていました。残りは約5,300ワードしかないため、VM命令1つあたりに出すアセンブリが公式の変換器より長いと、OSを含むアプリはROMに収まりにくくなります。

### プロジェクト9〜11：Jack言語とコンパイラ

プロジェクト9で扱う Jack は、Java風の教材専用言語です。公式Web IDEに含まれるJackの文法定義では、型は `int`・`char`・`boolean`・クラス名の4種類だけ、式は「項と演算子の並び」を平坦に受けるだけで**演算子の優先順位が定義されていません**。プロジェクト9は、自分で考えたアプリをJackで1本書き、配布のJackCompilerでコンパイルしてVM Emulatorで動かす回です。

優先順位が無いことの影響を、公式Web IDEのJackコンパイラで確かめました。[nand2tetris/web-ide](https://github.com/nand2tetris/web-ide) の2026年5月16日時点のソース（package.jsonの版は2026.19.0）をビルドし、Node.js 26.5.0 で、次の1行をMainクラスのmain関数内に置き、末尾にreturn文を加えてコンパイルし、VMで実行しています。

```
do Memory.poke(8000, 2 + 3 * 4);
```

出力されたVMコードの式の部分です。

```
push constant 2
push constant 3
add
push constant 4
call Math.multiply 2
```

先に `2 + 3` を足し、その結果に4を掛けています。実行後の RAM\[8000\] は **20** でした。`2 + (3 * 4)` と括弧を付けると14になり、`10 - 2 - 3` は左から順に計算されて5です。`*` はCPU命令ではなく `Math.multiply` の呼び出しになっており、掛け算はプロジェクト12で自分が書くOSの関数に依存します。

プロジェクト10の構文解析器は、入力した各 `.jack` ファイルに対して構文木の `.xml` を出力します。プロジェクト11ではそのXML出力をVMコード生成に差し替え、ディレクトリ内の `.jack` をそれぞれ `.vm` へ変換します。10と11が分かれているのは構文解析の正しさを先に確定させるためで、段階を分けてテストすると、構文解析とコード生成のどちらに誤りがあるかを絞り込みやすくなります。

### プロジェクト12：Jack OSの8クラス

最後のプロジェクト12は、Jackで書く標準ライブラリです。`projects/12` に置かれた実装対象は `Math`、`Memory`、`Screen`、`Output`、`Keyboard`、`String`、`Array`、`Sys` の8クラスで、プロセス管理もファイルシステムもスケジューラもありません。`Math` では `multiply`・`divide`・`sqrt`、`Memory` ではヒープの `alloc`・`deAlloc`、`Screen` では直線・矩形・円の描画（円は半径181以下）を書きます。**ここでいうOSは標準ライブラリの意味**で、カーネルは登場しません。実際のOSとの差は[カーネルとは？OSの中核が担う役割と仕組みを実装目線で解説【2026年版】](/tech/details/13534/)と読み比べるとはっきりします。8クラスを自作の実装に差し替えたうえで Pong のような Jack アプリが動けば完走です。

## 教材と学習環境：Web IDEの始め方と書籍第2版

講義スライド、課題のひな形、テストスクリプト、ツールは nand2tetris.org で無料で揃います。公式ライセンスページは教材とツールを**CC BY-NC-SA 3.0（非営利）**の対象としているので、社内研修など営利の場で使うなら先に条件を確認してください。なお、Web IDEのGitHubリポジトリに置かれたLICENSEはMIT Licenseで、教材とは別に定められています。

### Web IDEの6ツールとデスクトップ版の扱い

ツールは [nand2tetris.github.io/web-ide](https://nand2tetris.github.io/web-ide/) をブラウザで開くだけで使えます。[公式のソフトウェアページ](https://www.nand2tetris.org/software)は「web-based, meaning that you don’t have to download anything」と説明しています。作成したファイルはブラウザ内に自動保存されるため、作業の区切りごとにPCへダウンロードして保管してください。IDEのソースに登録されているツールは次の6つです。

- **Hardware Simulator**：HDLの編集とテスト（プロジェクト1〜3・5）
- **CPU Emulator**：Hack機械語の実行（プロジェクト4、7・8で自作変換器の出力を試すとき）
- **Assembler**：公式のアセンブラ（プロジェクト6で自作版の出力と見比べる）
- **VM Emulator**：VMコードの実行（プロジェクト7・8で入力の挙動を確かめる、プロジェクト9でアプリを動かす）
- **Jack Compiler**：公式のコンパイラ（プロジェクト9・12でJackをVMへ変換）
- **Bitmap Editor**：画面に描くビットマップの作成

デスクトップ版のJavaツールは、公式ソフトウェアページ自体が「The desktop version is provided mainly for backward compatibility.」と位置づけており、同ページから配布されている案内文書には、版がv2.7であることと「This version of the Nand to Tetris tools is no longer supported, and will be decommissioned soon.」が明記されています。同じ文書は、推奨ツールはすべてオンラインIDEに揃っていてオフラインでも使えると書いています。古い解説記事のようにJavaを入れる必要はありません。**これから始めるならWeb IDE一択**です。

### 書籍第2版と第1版の違い

日本語で読むなら邦訳書『コンピュータシステムの理論と実装 第2版 モダンなコンピュータの作り方』（オライリー・ジャパン、2024年12月2日発行、472ページ、ISBN 978-4-8144-0087-4、斎藤康毅 訳）が現行版です。付録に「オンラインIDEの使い方」が加わっているので、Web IDE前提で学ぶなら第2版を選んでください。第1版との違いは下のよくある質問にまとめました。なお公式のコースページは、各プロジェクトから参照する書籍の章は主に原著第1版だと断っています。

## 所要時間と、自作部分の実装言語の選び方

### 公称の所要時間と完走までの期間

Courseraの講座ページは、Part Iの[Build a Modern Computer from First Principles: From Nand to Tetris](https://www.coursera.org/learn/build-a-computer)を「4 weeks to complete at 10 hours a week」、[Nand to Tetris Part II](https://www.coursera.org/learn/nand2tetris2)を「2.5 months to complete at 10 hours a week」と表示しています。単純に掛けるとPart Iが約40時間、Part IIが約100時間です。Part Iは「no previous computer science or engineering knowledge」を前提にしているのに対し、Part IIは入門レベルのプログラミング能力を前提にしています。

総学習時間が同じだとして単純に換算すると、週5時間なら週10時間の場合の約2倍、週約3時間なら約3倍の期間が必要です。Rustで書いて完走した[個人の完走記](https://yuroyoro.hatenablog.com/entry/2020/12/10/120236)は「全部完走するまで10ヶ月ちょっと」と書いており、時間を食ったのは言語の習得だったと振り返っています。計画を立てるなら、**Part Iを1〜2か月、Part IIを3〜6か月**で区切り、プロジェクト6を終えた時点で一度見直すのが無理のない線です。

### プロジェクト6〜8・10〜11の実装言語の選び方

公式サイトは、アセンブラ・VM変換器・コンパイラは任意のプログラミング言語で開発できるとしています。プロジェクト6のページはJavaとPythonをよく選ばれる言語として挙げています。求められるのは、テキストファイルを1行ずつ読み、文字列を分解し、別のテキストファイルへ書き出す処理です。ここで迷ったら次の基準で選んでください。

- **普段いちばん速く書ける言語を選ぶ**。学ぶ対象は変換の設計で、文字列処理と辞書（ハッシュマップ）が手軽な言語なら何でも足ります。
- **新しい言語の練習を兼ねるのは、期間に余裕があるときだけにする**。上の完走記のように、詰まる原因が教材でなく言語の習得になります。
- **プロジェクト6・7・8・10・11を同じ言語で通す**。7で作るVM変換器は8で拡張し、10の構文解析器は11でそのままコード生成器に作り替えるので、途中で言語を替えると書き直しが増えます。

## 詰まりやすい工程と、着手を見送るべきケース

12プロジェクトの難易度は均等ではありません。最初の関門は**プロジェクト5のCPU**です。プロジェクト3で状態とクロックを扱う順序回路を、4でアセンブリを学んだうえで、16ビットの命令語から制御信号を生成する回路を自分で組み立てます。二つ目が**プロジェクト8の関数呼び出し**で、スタックフレームの退避と復元のずれは、呼び出し箇所から離れた場所で症状が出ることがあります。呼び出し前後のスタックと各ポインタを記録し、退避・復元の順序を追ってください。VM Emulatorで同じVMコードを動かし、自作変換器の出力をCPU Emulatorで動かした結果と、RAMの値を突き合わせるのが近道です。

着手を見送ったほうがよいケースもはっきりしています。**業務で使うスキルを最短で得たい人には向きません**。作るのは実在しない教育用アーキテクチャで、Verilogも書かず、x86やArmの命令セットも扱いません。実チップの設計フローを学びたいなら[OpenLane2とは？LibreLaneへの改称とインストール・使い方【2026年10月】](/tech/details/10733/)で扱うRTLからGDSIIまでの流れを追うほうが目的に合います。判断の分かれ目は「何かを作れるようになりたいのか、仕組みを納得したいのか」で、層と層のつながりを自分の手で確かめたいならやる価値があります。

## 類似教材との違い：NandGame・Turing Complete・CPUの創りかた・OS自作

「NANDからCPUを作る」目的には、Nand to Tetris以外の選択肢もあります。到達点と作業の形が違います。

| 教材                 | 形態            | 到達点          | Nand to Tetrisとの違い |
| ------------------ | ------------- | ------------ | ------------------ |
| Nand to Tetris     | Web IDE＋講義・書籍 | CPU・コンパイラ・OS | \-                 |
| NandGame           | ブラウザのパズル      | コンピュータ一式     | 回路を画面上で配線する        |
| Turing Complete    | Steamの有料ゲーム   | CPUと独自アセンブリ  | 命令セットを自分で設計できる     |
| CPUの創りかた（2003年）    | 書籍＋実物のIC      | 4ビットCPU（TD4） | ICを使って実機を組む        |
| ゼロからのOS自作入門（2021年） | 書籍＋PC／QEMU    | x86-64で動くOS  | OSを本格的に作る、CPUは作らない |

[Turing CompleteのSteamページ](https://store.steampowered.com/app/1444480/Turing%5FComplete/)は「Everything in a computer can be constructed from a basic component called a NAND gate.」で始まり、NANDから演算・メモリ・CPUアーキテクチャまでをパズルとして進めます。ゲームとして手を動かしたいならこちら、HDLとテストで仕様どおりに作る経験と、コンパイラ・OSまでの全層が欲しいならNand to Tetrisです。前掲のyuroyoro氏の完走記でも、OSの内容は物足りなかったと述べられており、その先を求めるならOS自作の書籍か、実在のLinuxを組み上げる[Linux From Scratch（LFS）とは？13.1の構築手順・必要スペックと日本語版](/tech/details/10028/)に進むのが自然な順序です。

## よくある質問

### Nand to Tetris は日本語で学べますか？

公式サイト・Web IDE・課題ファイルは英語ですが、テキストは邦訳されています。邦訳書第2版で13章すべてと付録A〜Gが日本語で読めます。課題ファイルのコメントやテストスクリプトは英語のままですが、書式が定型なので読解の負担は小さいです。

### 『コンピュータシステムの理論と実装』第2版は第1版と何が違いますか？

本編は両版とも13章で、扱うプロジェクトの範囲も同じです。原著第2版では全章・全プロジェクトが改稿され、抽象化と実装を分けた説明や図・例が拡充されています。邦訳版の分量と付録を比べると、第1版（2015年3月25日発行）の416ページ・付録A〜Cの3本に対し、第2版（2024年12月2日発行）は472ページ・付録A〜Gの7本です。第2版の付録には「オンラインIDEの使い方」が加わりました。章タイトルも、3章が「順序回路」から「メモリ」へ、13章が「さらに先へ」から「さらなる冒険へ」へ改められています。

### NANDゲートだけであらゆる論理演算を作れるのはなぜですか？

NANDは機能的完全性を持つ演算だからです。両入力に同じ信号を入れた NAND は NOT として働き（NAND(x, x) = NOT x）、NAND の出力を反転すれば AND が得られます。OR はド・モルガンの法則から、両入力を反転して NAND に通せば求まります。AND・OR・NOT がそろえば任意の論理関数を構成できるので、NANDひとつを原始素子に置けば足ります。

### プログラミング未経験でもCPUを自作できますか？

プロジェクト1〜3・5ではHDLによる回路設計、4ではHackアセンブリによるプログラミングを学びます。未経験者も、各課題の仕様と講義を順に学びながら取り組めます。Coursera版のPart Iもコンピュータサイエンスの予備知識を前提にしていません。プロジェクト6〜8・10〜11では、アセンブラ・VM変換器・コンパイラを**自分で選んだ言語で実装する**課題になり、Part IIは入門レベルのプログラミング能力を前提にしています。未経験から始めるなら、Part I を終えた時点で一度プログラミング言語の学習に戻るのが現実的です。

### テトリスは自分で作るのですか？

テトリスの実装は必須ではありません。プロジェクト9ではJackでアプリを作り、その題材としてテトリスを選ぶこともできます。名前は「NANDゲートから出発してテトリスが動くところまで到達する」という射程を表していて、作るのはテトリスを動かす側のコンピュータです。公式リポジトリには Jack で書かれた Pong が同梱されています。

## 関連記事

- [FPGAとは？LUTで回路を組む仕組みとCPU・ASIC・CPLDとの違い](/tech/details/9296/)
- [カーネルとは？OSの中核が担う役割と仕組みを実装目線で解説【2026年版】](/tech/details/13534/)
- [ツールチェーン(toolchain)とは？構成要素と言語別の実例・GradleのJava Toolchain設定](/tech/details/7073/)
- [JITコンパイラとは？仕組み・AOTとインタプリタとの違いと主要言語の実装](/tech/details/3314/)
- [Linux From Scratch（LFS）とは？13.1の構築手順・必要スペックと日本語版](/tech/details/10028/)

---

出典: [Nand to Tetrisとは？NANDからCPU・OSまで自作する12プロジェクトの進め方と所要時間](<https://www.issoh.co.jp/tech/details/9784/>)（株式会社一創）
