索引 / 001 ZH-CN
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 和数据结构)。
  • 练习: 一边阅读一边构建一个小型编译器,每次增加一个阶段,并用各章习题检验对每个算法的掌握。