📖 課程概述
Nand2Tetris(全稱 The Elements of Computing Systems)由 Noam Nisan 和 Shimon Schocken 開發,是電腦科學領域最具影響力的專案式課程之一。從最基礎的 NAND 閘開始,逐步建構出完整電腦系統,涵蓋硬體平台、虛擬機器、編譯器和作業系統。
本頁收錄 課程程式碼解答,包含每個專案的完整實作。
Part I: 硬體 (專案 1–6)
- 布林邏輯與算術運算
- 循序邏輯與記憶體
- 機器語言與電腦架構
- 組譯器
Part II: 軟體 (專案 7–12)
- 虛擬機器 (堆疊與控制流)
- Jack 高階語言
- 編譯器 (語法分析與程式碼生成)
- 作業系統 (Math, Memory, Screen, Keyboard...)
🏗️ 完整堆疊
點擊各層查看對應專案的解決方案:
⚡ Part I: 硬體
布林邏輯
▶從 NAND 閘開始,建構所有基本邏輯閘:Not, And, Or, Xor, Mux, DMux,以及它們的 16 位元和多重變體。
布林運算
▶建構算術運算單元:半加器、全加器、16 位元加法器、增量器,最後是完整的 ALU。
記憶體
▶從 D 型正反器出發,建構 1 位元暫存器、16 位元暫存器,逐步擴展為 RAM8 → RAM64 → RAM512 → RAM4K → RAM16K,最後是程式計數器 (PC)。
機器語言
▶學習 Hack 組合語言,撰寫乘法 (Mult) 和螢幕控制 (Fill) 程式。Hack 有兩種指令:A 指令 (位址設定: @value) 和 C 指令 (計算+跳躍: dest=comp;jump)。
電腦架構
▶組合 CPU、Memory、以及週邊晶片 (Screen, Keyboard),建構完整的 Hack 電腦。CPU 包含 ALU、A 暫存器、D 暫存器、程式計數器 (PC),執行 A 和 C 兩種指令。
CPU 核心
Memory 映射
組譯器
▶將 Hack 組合語言轉換為機器碼。支援 A 指令 (@symbol) 和 C 指令 (dest=comp;jump) 的編碼,以及標籤和變數解析。
本課程提供 C++、C 和 Python 三種實作。
🛠️ Part II: 軟體
虛擬機器 I — 堆疊算術
▶實作 VM 轉譯器,將中間層級的 VM 指令轉換為 Hack 組合語言。本章涵蓋堆疊算術指令 (add, sub, neg, eq, gt, lt, and, or, not) 和記憶體存取 (push/pop)。
虛擬機器 II — 程式控制
▶擴充 VM 轉譯器以支援分支指令 (label, goto, if-goto) 和函數呼叫 (function, call, return)。實作虛擬記憶體區段 (local, argument, this, that, pointer, temp, static)。
高階語言 — Jack
▶使用 Jack 高階語言撰寫程式。Jack 語法類似 Java/C,支援類別、方法、陣列、字串。習題包含 aⁿbⁿ、運算式解析、流程控制、函數呼叫等。
編譯器 I — 語法分析
▶實作 Jack 編譯器的詞法分析器和語法分析器,將 Jack 程式解析為 XML 語法樹。本課程以 Python 實作完整的 Jack 編譯器。
編譯器 II — 程式碼生成
▶擴充編譯器以產生 VM 指令。包含符號表管理 (class-level 和 subroutine-level 作用域)、變數解析 (static, field, local, argument)、運算式編譯、控制流生成。
作業系統
▶用 Jack 語言實作 Hack 電腦的作業系統函式庫,包含以下類別:
| 類別 | 功能 |
|---|---|
| Math | 乘法、除法、平方根、絕對值、最大值、最小值 |
| Memory | 記憶體配置 (alloc/dealloc)、記憶體區塊操作 (peek/poke) |
| Screen | 像素繪圖、矩形/圓/線條繪製 |
| Output | 字元/字串輸出到螢幕 |
| Keyboard | 鍵盤輸入 (readChar, readInt, readLine) |
| String | 動態字串 (concat, substring, parseInt, setCharAt...) |
| Sys | 系統初始化、程式終止、等待 |
| Array | 動態陣列配置 |
🔗 延伸資源
- Nand2Tetris 官方網站 — 課程大綱、軟體工具、教材下載
- 課程解答原始碼 (GitHub) — 完整實作
- Nand2Tetris 簡介頁 — 課程基本介紹