索引 / 001 ZH-TW
The Elements of Computing Systems: Building a Modern Computer from First Principles(計算機系統要素:從頭打造一台現代電腦) cover

電腦科學

電腦科學

The Elements of Computing Systems: Building a Modern Computer from First Principles(計算機系統要素:從頭打造一台現代電腦)

Noam Nisan; Shimon Schocken

英文原名: The Elements of Computing Systems: Building a Modern Computer from First Principles

這是一本以專題實作為主軸的計算機入門書:讀者從最基本的邏輯閘開始,逐步打造一台完整的通用電腦,最後完成編譯器與簡易作業系統。每一層都在隨書提供的軟體工具與模擬器上完成,不需要實體硬體。

需要的基礎: 具備一些高階語言的程式設計經驗;不需要電子學或硬體背景。

難度等級
入門
學術層次
大學部
computer architecturedigital logicassembly languagevirtual machinescompilers教科書

01 / 導讀

導讀

引用

Nisan, N., & Schocken, S. (2021). The Elements of Computing Systems: Building a Modern Computer from First Principles (2nd ed.). MIT Press.

章節概要

第二版約344頁,透過12個各自搭配一個專題的章節,帶領讀者打造一套簡單而完整的電腦系統:先是硬體平台,再是建立在其上的軟體層級。這段被稱為「從Nand到俄羅斯方塊」(Nand to Tetris)的旅程,從最基本的邏輯閘Nand出發,終點是一台能夠執行俄羅斯方塊或任何其他程式的通用電腦。根據出版社的說明,這一版經過大幅修訂:全書分為第一部「硬體」和第二部「軟體」,各含六個專題;所有章節與專題都經過改寫,強調把抽象與實作分開;並新增內容充實的附錄,集中討論技術與理論主題。所有專題都使用作者的Nand to Tetris網站上的免費軟體工具完成,包括硬體模擬器、CPU模擬器和VM模擬器,因此不需要任何實體硬體。Google Books以簡短形式列出各章標題,網站上的專題頁面則指出哪兩章談虛擬機器、哪兩章談編譯器。

第1章:Boolean Logic(布林邏輯)

以Nand閘作為唯一的基本元件,讀者組出各種基本邏輯閘(Not、And、Or、Xor、多工器與解多工器)及其16位元與多路版本,它們是之後構造CPU和RAM的積木。

第2章:Boolean Arithmetic(布林算術)

實現二進位算術的邏輯閘電路:半加器與全加器、16位元加法器與遞增器,最後是Hack電腦的算術邏輯單元(ALU)——在這一系列晶片中,它是唯一專屬於此架構的晶片。

第3章:Memory(記憶體)

邏輯閘如何隨時間保存位元,以及如何對記憶體暫存器定址。以資料正反器為基本元件,讀者依序組出1位元暫存器、16位元暫存器、由8個到16K個暫存器構成的RAM,以及程式計數器。

第4章:Machine Language(機器語言)

從程式設計師的角度描述電腦:完成後的硬體將執行的Hack機器語言及其符號化的組合語言形式。在專題中,讀者撰寫兩個低階組合語言程式(其中一個做乘法),並在提供的CPU模擬器上測試。

第5章:Computer Architecture(電腦架構)

把前幾章的ALU和RAM組裝成Hack CPU、完整的記憶體位址空間和最上層的Computer晶片:一台能執行以第4章機器語言撰寫之程式的通用電腦。

第6章:Assembler(組譯器)

第一個軟體專題:把符號化的Hack組合語言翻譯成二進位機器碼的程式。本章結束第一部;第二部「軟體」從下一頁開始,並有自己的導言。

第7–8章:Processing(處理);Control(控制)

談虛擬機器的兩章。本書仿照Java和.NET平台,定義一種以堆疊為基礎的VM語言,並讓讀者撰寫把VM程式碼翻譯成Hack組合語言的翻譯器。第7章(專題7「VM I:堆疊運算」)涵蓋VM規格、算術與邏輯指令、針對八個記憶體區段的記憶體存取指令,以及VM對Hack平台的對應;第8章(專題8「VM II:程式控制」)把翻譯器擴充到分支與函式呼叫。

第9章:High-Level Language(高階語言)

介紹Jack,一種簡單、類似Java、以物件為基礎的語言。在對應的專題中,讀者利用Jack作業系統提供的服務,以Jack撰寫一個小遊戲或互動程式,以便在編譯它之前先熟悉這門語言。

第10–11章:Syntax Analysis(語法分析);Code Generation(程式碼產生)

談編譯器的兩章(專題10和11,「編譯器I」和「編譯器II」)。Jack編譯器分為兩層:第7–8章打造了它的後端,這兩章則打造前端。第10章開發詞彙分析器與遵循Jack文法的剖析器,並以產生XML輸出的方式測試;第11章篇幅超過三十頁,是全書最長的一章,它加入符號表,並把剖析器改造成輸出VM程式碼的程式碼產生器。

第12章:Operating System(作業系統)

把作業系統視為填補硬體與應用軟體之間落差的一組服務。讀者以Jack本身實作Jack作業系統的八個類別(Math、Memory、Array、String、Output、Screen、Keyboard和Sys);專題頁面指出,這會接觸到一系列應用資訊科學中的經典演算法。

第13章:More Fun to Go(樂趣還在後頭)

四頁的收尾章節。

附錄

約四十頁的附錄集中說明支撐各專題的技術與理論主題。

核心概念

第一部:硬體(第1–6章)

  • Nand作為通用閘:其他所有邏輯閘,進而整台電腦,都可以由Nand閘組成。
  • 組合邏輯與循序邏輯:輸出只取決於當下輸入的晶片,以及能跨時脈週期保存狀態的晶片。
  • 算術邏輯單元:對二進位數計算算術與邏輯函數的晶片。
  • 機器語言與儲存程式電腦:存放在記憶體中、由CPU執行的指令。
  • 組譯器:把符號化組合語言翻譯成二進位機器碼的翻譯程式。

第二部:軟體(第7–13章)

  • 虛擬機器:介於高階語言與機器碼之間、以堆疊為基礎的中介抽象。
  • 堆疊運算與記憶體區段:VM如何在堆疊上運算並為變數定址。
  • 語法分析:依照文法剖析原始碼。
  • 程式碼產生:把剖析後的程式翻譯成較低階的程式碼。
  • 作業系統服務:讓高階語言能存取記憶體與輸入輸出的函式庫常式。
  • 抽象與實作:本版所強調的原則,即把每一層的介面與其建構方式分開規定。

評析

優點

  • 由讀者親手打造的一套連貫系統。 12章各有一個專題,其成果會在後續章節中使用,因此學生體會到的是邏輯閘、CPU、組譯器、VM、編譯器和作業系統如何組合在一起,而不是在不同課程中分別學習它們。出版社列舉可透過這種方式學到的領域,包括硬體、架構、作業系統、程式語言、編譯器、資料結構與演算法,以及軟體工程。
  • 免費而完整的工具。 作者網站為每個專題提供模擬器、測試腳本與比對檔;正如專題7的頁面所示,每個專題都附有精確的規格與分階段的測試。在非營利用途下,這一切都免費且開放原始碼;網站表示,Nand to Tetris課程已在400多所大學、高中與程式訓練營開設。
  • 抽象與實作分離。 出版社表示,第二版的每一章都為了把抽象與實作分開而改寫;專題頁面也反映了這一點:每個專題都規定了一份契約(晶片介面、VM規格與對應、API),學生的實作必須符合它並據以測試。
  • 架構彈性。 由於全書分成各含六個專題的兩部,課程可以只上硬體部分或只上軟體部分。網站也提供一份典型課程的詳細課綱,並介紹提供結業證書的付費Coursera課程。

局限

  • 刻意簡化的機器。 Hack電腦是為教學而設計;本書不涉及管線化、快取記憶體、效能量測或真實的指令集,這些是標準計算機結構教科書的內容。
  • 軟體部分要求高。 第二部的專題(組譯器、VM翻譯器、編譯器和作業系統)要求讀者以自選語言具備相當的程式設計能力,並投入大量時間;談程式碼產生的第11章是全書最長的一章。
  • 免費資料存在版本差異。 網站說明,部分專題頁面連結的書籍章節主要來自第一版,其章節架構與標題有所不同(例如第一版第3章題為「Sequential Logic」,第二版則為「Memory」)。把免費章節與第二版搭配使用的讀者,需要確認自己用的是哪個版本。

在課程中的定位

對初學者而言,本書是計算機結構課程中注重動手的核心。查爾斯·佩措爾德的 Code 涵蓋相近的內容——從開關和邏輯閘到一顆能運作的CPU——但以敘事方式展開、沒有習題;它可以作為第一部的平緩鋪墊,或在專題顯得抽象時作為參照。哈里斯夫婦的 Digital Design and Computer Architecture, RISC-V Edition 把硬體部分推得更遠,引入硬體描述語言、真實的指令集和管線化處理器,是讀完第1–5章後很自然的下一步。

布萊恩特和歐哈拉倫的 Computer Systems: A Programmer's Perspective 從程式設計師的角度檢視真實的機器(機器碼、記憶體、連結、行程),與第二部互為補充。亨尼西和派特森的 Computer Architecture: A Quantitative Approach,以及沈和利帕斯蒂的 Modern Processor Design,討論現代處理器的效能技術,需要先修計算機組織課程;應在讀完本書之後再讀,而不是用它們取代本書。

如何使用本書

本書適合修計算機系統或計算機組織課程的一二年級學生、想了解高階程式碼底下究竟是什麼的自學者,以及開設實作課程的教師。不需要電子學背景。第二部要求讀者以自選語言撰寫組譯器、VM翻譯器和編譯器,因此需要具備某種高階語言的程式設計經驗。

  • 依序完成。 每個專題都依賴前一個專題。先讀章節,再以提供的工具實作專題,並在繼續之前執行提供的測試。
  • 只學硬體: 第1–6章構成一門包含六個專題、涵蓋硬體與組譯器的完整課程。
  • 只學軟體: 第二部可以單獨學習;提供的工具與書中的規格可以取代硬體。
  • 為第10–11章預留時間。 編譯器是工作量最大的單項任務。
  • 附錄: 依專題需要查閱。

從Nand to Tetris網站下載工具與專題檔案,並嚴格依照專題頁面的建議使用分階段測試:先對小元件做單元測試,再測試整體。若使用網站連結的免費第一版章節,動手實作之前要先與第二版的規格對照。保留每個專題中自己撰寫的程式碼,因為後面的專題要以它為基礎。