索引 / 001 ZH-TW
Engineering a Compiler(編譯器工程) cover

電腦科學

電腦科學

Engineering a Compiler(編譯器工程)

Keith D. Cooper; Linda Torczon

英文原名: Engineering a Compiler

一本為大學部編譯器設計課程所寫的教科書,順著編譯器從原始碼到目的碼的流程展開。在萊斯大學開發研究用編譯器的庫柏與托爾森,對掃描與剖析只做精簡說明,而把大量篇幅留給中間表示、最佳化、指令選擇、指令排程與暫存器配置,反映現代編譯器的實際打造方式。

需要的基礎: 資料結構與演算法、計算機組織課程,以及至少一種編譯式語言的程式設計經驗。

難度等級
中級
學術層次
研究所
compilersparsingintermediate representationscode optimizationcode generation教科書

01 / 導讀

導讀

引用

Cooper, K. D., & Torczon, L. (2022). Engineering a Compiler (3rd ed.). Morgan Kaufmann (Elsevier).

章節概要

全書共十四章和兩個附錄,正文約 755 頁。出版社稱第三版涵蓋了編譯器技術的最新進展,新增的章節涉及語義細化(即從生成式語法分析器中臨時拼湊的語法制導翻譯方案生成程式碼時出現的問題)、對命名和可定址性的執行時支援,以及表示式、賦值和控制結構的程式碼形態。下面的頁數是根據已釋出的頁碼範圍推算出的各章篇幅。

第 1 章:Overview of Compilation(編譯概述)

篇幅 26 頁的開篇一章是編譯概覽,先於講述各個階段的章節。

第 2–3 章:Scanners(掃描器);Parsers(語法分析器)

兩個前端章節分別約 58 頁和 73 頁,處理識別程式中的單詞及其語法結構。兩章合計約佔正文的六分之一,與後面的章節相比份額不大。

第 4 章:Intermediate Representations(中間表示)

本章(49 頁)轉向編譯器在分析和變換程式時用來存放程式的內部形式。

第 5 章:Syntax-Driven Translation(語法制導翻譯)

第 5 章(65 頁)涵蓋由源程式語法驅動的翻譯。出版社對語義細化新增內容的描述,指的是從生成式語法分析器中臨時拼湊的語法制導翻譯方案生成程式碼,這正是本章標題所指向的主題。

第 6 章:Implementing Procedures(實作程式)

本章(51 頁)講程式是如何實作的。出版社把對命名和可定址性的執行時支援列為獲得新處理的主題之一,這與本章的內容相符。

第 7 章:Code Shape(程式碼形態)

程式碼形態一章(52 頁)討論為表示式、賦值和控制結構生成的程式碼的形式,出版社也把它列為新增的章節主題。

第 8–10 章:Introduction to Optimization(最佳化概述);Data-Flow Analysis(資料流分析);Scalar Optimization(標量最佳化)

三個最佳化章節合計約 194 頁。它們由最佳化概述(69 頁),經資料流分析(68 頁,即最佳化所依賴的分析機制),到標量最佳化(57 頁)。

第 11–13 章:Instruction Selection(指令選擇);Instruction Scheduling(指令排程);Register Allocation(暫存器分配)

程式碼生成各章(42、46 和 50 頁)涵蓋選擇目標指令、為指令排序,以及為值分配暫存器。出版社指出,本書涵蓋區域性範圍內自底向上的暫存器分配方法。

第 14 章:Runtime Optimization(執行時最佳化)

最後一章(43 頁)討論在程式執行期間進行的最佳化。

附錄 A–B

附錄 A(ILOC,12 頁)和附錄 B(資料結構,23 頁)之後是參考文獻和索引。

核心概念

第 1–7 章:從源程式到程式碼

  • 編譯器結構:程式在編譯器中經過的各個階段。
  • 中間表示:用於分析和變換的內部程式形式。
  • 語義細化與語法制導翻譯:由分析結果產生含義和程式碼。
  • 程式、命名與程式碼形態:名字、程式呼叫和表示式如何在生成的程式碼中實作。

第 8–14 章:最佳化與後端

  • 資料流分析:最佳化背後的分析。
  • 標量最佳化:對單個程式的程式碼做改進。
  • 指令選擇、排程與暫存器分配:程式碼生成的三個步驟。
  • 執行時最佳化:在執行時進行的最佳化。

評析

優點

  • 重點體現在結構上。 最佳化和程式碼生成(第 8 至 14 章)約佔正文的一半,而掃描器和語法分析器兩章約佔六分之一,這與出版社所說本書特別關注程式碼最佳化和程式碼生成相符。
  • 關注抽象。 出版社說,本書集中討論編譯器(和直譯器)如何實作抽象,並把內容與學生已知的語言聯絡起來。
  • 出自實際的編譯器構建者。 據出版社的作者簡介,Cooper 領導萊斯大學的 Massively Scalar Compiler 專案,Torczon 是該專案的主要研究者之一;出版社稱本書把基本原理與他們構建先進編譯器的經驗結合在一起。
  • 課程配套材料。 Elsevier 列出了兩門課程(COMP 412 和 COMP 506)的教師課程檔案、圖片集和其他資源,作者簡介也說 Cooper 講授本科和研究生層次的編譯器構造課程。

侷限

  • 篇幅大。 包括附錄和索引在內超過 800 頁,課程需要從中取捨。
  • 偏重後端。 前端只佔兩章,想深入學習詞法分析和語法分析的讀者需要另一本書,而且沒有一章專講語言設計或型別系統。
  • 讀者層次。 出版社給出的讀者物件主要是研究生,兼顧部分本科生、專業編譯器開發者和系統軟體開發者,這表明對第一門編譯課程來說內容要求較高。
  • 僅限教師的資源。 課程檔案和其他教學資源只提供給註冊教師,所以自學者需要自己設計專案。

在課程中的定位

Cooper 和 Torczon 的這本書是本課程書目中偏重後端的教材。Aho、Lam、Sethi 和 Ullman 的 Compilers: Principles, Techniques, and Tools(「龍書」)在一冊中涵蓋詞法分析、語法分析、語法制導翻譯、中間程式碼、程式碼生成和最佳化,是長期使用的參考書,兩書可以互相替代或互補。對於第一個專案式的入門,Nystrom 的 Crafting Interpreters 為一種小語言構建兩個直譯器,並可線上免費閱讀;Thain 的 Introduction to Compilers and Language Design 是適合一學期課程的簡明教材,可免費獲得,內容是把一種類 C 小語言編譯成彙編。兩者都可以排在本書之前。

Pierce 的 Types and Programming Languages 是對型別系統的研究生層次論述,以語言理論補充本書側重最佳化的特點,而這方面 Cooper 和 Torczon 並沒有專門設章。

如何使用本書

本書面向已有資料結構與演算法、一些系統背景,並想弄清編譯器如何生成和最佳化程式碼的讀者。它適合高年級的編譯原理課程、研究生的第一門課,以及編譯器和系統軟體開發者。

實用的安排:

  • 核心: 第 1 章,然後是第 4 至 7 章,它們把已解析的程式與生成的程式碼聯絡起來。如果已熟悉掃描和語法分析,第 2、3 章可以快速讀過,或換成較輕量的書。
  • 最佳化: 按順序讀第 8 至 10 章,因為資料流分析(第 9 章)是標量最佳化(第 10 章)的基礎。
  • 後端: 第 11 至 13 章,可以依次讀,也可以按興趣選讀。
  • 可選: 第 14 章,以及作為參考的附錄(ILOC 和資料結構)。
  • 練習: 一邊閱讀一邊構建一個小型編譯器,每次增加一個階段,並用各章習題檢驗對每個演算法的掌握。