图书信息
图书目录

现代编译器设计与实现




本书是“关键计算技术核心课程系列教材”之一。本书系统地介绍了编译器从0到1的基本构造技术,以及与LoongArch自主指令集的适配,包括前—中—后三段式的先进设计思想、开发管理和支撑工具,涵盖语言形式化描述、中间代码理解、面向体系结构的后端编程等,重点关注学生创新意识、系统能力和工程化思维的培养。

全书分为四部分,共9章。第一部分准备篇(第1、2章),介绍编译技术的基本概念和思想、开发环境的配置与准备。第二部分前篇(第3章),介绍源语言的形式化描述、语言解释器的前端设计、Bison和Flex等解析器生成工具的使用方法。第三部分中篇(第4、7、8章),介绍兼容LLVM的自研中间代码框架LightIR的架构与编程接口、中间代码生成器的设计方法、机器无关的中间代码优化种类与实现。第四部分后篇(第5、6、9章),介绍LoongArch指令集的架构与编程方式、基于栈式内存分配的汇编代码生成器的设计与实现、寄存器的分配方法、后端代码优化等。本书引入工业界编译工具链LLVM、国产自主指令集LoongArch、代码管理软件Git、调试工具GDB等先进的系统软件,以常规实验为主体,以创新开放实验为延伸,帮助学生深入理解编译原理基础理论知识和核心技术,系统性地培养学生的工程实践能力和创新能力,进而为国产芯片生态建设、国产编译技术发展储备更多人才。

本书可作为高等学校计算机类相关专业编译原理课程的实践教材或独立教材,也可作为计算机类专业研究生相关课程的教材和软件工程师的参考用书。



作者:
李诚 徐伟 张昱 编著

定价:
49.80 元

出版时间:
2026-06-08

ISBN:
978-7-04-066204-7

物料号:
66204-00

读者对象:
高等职业教育

一级分类:
计算机大类

重点项目:
暂无

版面字数:
430.00千字

开本:
16开

装帧形式:
平装

版次:
1

最新版次
印刷时间:
2026年
  • 前辅文
  • 第1章 绪论
    • 1.1 编译技术概述
    • 1.2 编译技术的发展
    • 1.3 国产芯片产业的发展
    • 1.4 编译实践教学的困境
    • 1.5 本书特色
    • 1.6 本书内容简介
  • 第2章 系统环境搭建
    • 2.1 引言
    • 2.2 运行环境安装与测试
      • 2.2.1 VirtualBox虚拟机软件简介
      • 2.2.2 下载并安装VirtualBox
      • 2.2.3 Ubuntu软件简介
      • 2.2.4 使用VirtualBox与Ubuntu镜像文件搭建实验运行环境
    • 2.3 实验辅助软件的安装与测试
      • 2.3.1 辅助软件简介
      • 2.3.2 辅助软件的安装
      • 2.3.3 辅助软件安装测试
      • 2.3.4 实验运行环境验证
    • 2.4 开发环境安装与测试
      • 2.4.1 使用VS Code通过SSH协议远程连接虚拟机
      • 2.4.2 配置VS Code开发环境下的代码自动补全
    • 2.5 实验版本管理工具Git教程
      • 2.5.1 Git简介
      • 2.5.2 Git命令
      • 2.5.3 Git信息配置
      • 2.5.4 创建并拉取远程仓库
      • 2.5.5 远程仓库同步本地修改
      • 2.5.6 设置上游仓库并解决合并冲突
      • 2.5.7 版本回溯
    • 2.6 实验调试工具教程
      • 2.6.1 GDB简介及使用方法
      • 2.6.2 GDB命令
      • 2.6.3 GDB的安装
      • 2.6.4 GDB命令行调试
      • 2.6.5 GDB图形化调试
    • 2.7 LOG简介及使用方法
    • 2.8 后端环境配置
      • 2.8.1 LoongArch架构简介
      • 2.8.2 交叉编译环境安装
      • 2.8.3 交叉编译环境下的GDB使用
    • 2.9 学生常见问题
    • 2.10 本章小结
  • 第3章 源语言解析器的设计与实现
    • 3.1 引言
    • 3.2 Flex简介
      • 3.2.1 Flex工具的起源和功能
      • 3.2.2 Flex源程序结构
      • 3.2.3 Flex的安装与编译
      • 3.2.4 正则表达式
      • 3.2.5 稍复杂的Flex词法解析示例
      • 3.2.6 Flex关于二义性的处理
    • 3.3 Bison简介
      • 3.3.1 Bison工具的起源和功能
      • 3.3.2 Bison源程序结构
      • 3.3.3 Bison的安装与编译
      • 3.3.4 Bison关于二义性的处理
    • 3.4 极简语言解析示例
      • 3.4.1 极简语言定义
      • 3.4.2 极简语言词法分析
      • 3.4.3 极简语言语法分析
      • 3.4.4 极简语言源程序
      • 3.4.5 极简语言分析器编译与运行
    • 3.5 Cminusf语言简介
      • 3.5.1 Cminusf语言概要
      • 3.5.2 Cminusf语言的文法
    • 3.6 语言解析器实验
      • 3.6.1 实验内容
      • 3.6.2 实验框架目录结构
      • 3.6.3 编译、运行与验证
      • 3.6.4 思考题
    • 3.7 学生常见问题
    • 3.8 本章小结
  • 第4章 中间代码自动化生成
    • 4.1 引言
    • 4.2 C++知识回顾
      • 4.2.1 标准模板库
      • 4.2.2 运行时类型识别
      • 4.2.3 智能指针
    • 4.3 Light IR简介
      • 4.3.1 LLVM简介
      • 4.3.2 Light IR简介
      • 4.3.3 Light IR指令假设
      • 4.3.4 Light IR指令详解
      • 4.3.5 人工编写Light IR示例
    • 4.4 Light IR C++库
      • 4.4.1 Light IR C++库核心类介绍
      • 4.4.2 使用Light IR C++库生成Light IR示例
    • 4.5 手动编写Light IR预热实验
      • 4.5.1 实验内容
      • 4.5.2 实验框架目录结构
      • 4.5.3 编译、运行与验证
    • 4.6 使用Light IR库手动生成IR实验
      • 4.6.1 实验内容
      • 4.6.2 实验框架目录结构
      • 4.6.3 编译、运行与验证
    • 4.7 Cminusf语言的语义
      • 4.7.1 Cminusf语法规则的语义解释
      • 4.7.2 编译框架中预定义的函数
    • 4.8 Light IR自动生成实验框架
      • 4.8.1 访问者模式
      • 4.8.2 抽象语法树
      • 4.8.3 符号表Scope
      • 4.8.4 CminusfBuilder类
    • 4.9 自动化生成IR实验
      • 4.9.1 实验内容
      • 4.9.2 实验框架目录结构
      • 4.9.3 编译、运行与测试
    • 4.10 学生常见问题
    • 4.11 本章小结
  • 第5章 围绕LoongArch64指令集的编程
    • 5.1 引言
    • 5.2 指令编码格式
      • 5.2.1 指令汇编助记格式
      • 5.2.2 基础指令寄存器
      • 5.2.3 基础整数指令概述
      • 5.2.4 基础浮点数指令概述
    • 5.3 龙架构应用程序二进制接口ABI
      • 5.3.1 指令与数据对齐
      • 5.3.2 函数栈帧
      • 5.3.3 函数调用过程
      • 5.3.4 参数传递和返回值
      • 5.3.5 汇编代码示例
    • 5.4 龙芯汇编代码实验
    • 5.5 学生常见问题
    • 5.6 本章小结
  • 第6章 龙架构汇编代码自动化生成
    • 6.1 引言
    • 6.2 代码生成
      • 6.2.1 代码生成概述
      • 6.2.2 指令翻译模板
    • 6.3 栈式分配
      • 6.3.1 栈式分配原理
      • 6.3.2 栈式分配示例
    • 6.4 后端实验框架
      • 6.4.1 后端实验框架总览
      • 6.4.2 入口函数
      • 6.4.3 基本类
      • 6.4.4 辅助函数
    • 6.5 汇编代码自动化生成实验
      • 6.5.1 实验内容
      • 6.5.2 实验框架目录结构
      • 6.5.3 编译、运行与测试
    • 6.6 学生常见问题
    • 6.7 本章小结
  • 第7章 静态单赋值中间代码转化
    • 7.1 引言
    • 7.2 前置概念
      • 7.2.1 静态单赋值
      • 7.2.2 控制流图与支配树
    • 7.3 Mem2Reg功能介绍
      • 7.3.1 Mem2Reg优化示例
      • 7.3.2 基于栈的到达定义分析
      • 7.3.3 phi函数的引入
    • 7.4 Mem2Reg算法
      • 7.4.1 插入phi函数
      • 7.4.2 变量重命名
    • 7.5 后端适配
    • 7.6 静态单赋值实验
      • 7.6.1 实验内容
      • 7.6.2 实验框架目录结构
      • 7.6.3 编译、运行与测试
    • 7.7 学生常见问题
    • 7.8 本章小结
  • 第8章 机器无关的高级优化
    • 8.1 引言
    • 8.2 循环搜索
      • 8.2.1 循环和控制流图
      • 8.2.2 基于Tarjan算法的循环查找
    • 8.3 循环搜索代码阅读实验
      • 8.3.1 代码阅读内容
      • 8.3.2 思考题
    • 8.4 循环不变式外提
      • 8.4.1 功能简介
      • 8.4.2 算法原理
    • 8.5 循环不变式外提实验
      • 8.5.1 实验内容
      • 8.5.2 实验框架目录结构
      • 8.5.3 编译、运行与测试
    • 8.6 常量传播
      • 8.6.1 功能简介
      • 8.6.2 算法原理与解析
    • 8.7 常量传播实验
      • 8.7.1 实验内容
      • 8.7.2 实验框架目录结构
      • 8.7.3 编译、运行与测试
    • 8.8 全局值编号
      • 8.8.1 算法简介
      • 8.8.2 值编号及相关概念
      • 8.8.3 数据流分析框架
      • 8.8.4 GVN算法及伪代码讲解
      • 8.8.5 GVN示例
    • 8.9 全局值编号实验
      • 8.9.1 实验内容
      • 8.9.2 实验框架目录
      • 8.9.3 编译、运行与测试
    • 8.10 学生常见问题
    • 8.11 本章小结
  • 第9章 面向体系结构的后端代码优化
    • 9.1 引言
    • 9.2 活跃变量分析
      • 9.2.1 经典活跃变量分析
      • 9.2.2 变量活跃区间
      • 9.2.3 伪线性序
      • 9.2.4 活跃区间计算
    • 9.3 寄存器分配算法
      • 9.3.1 图着色分配
      • 9.3.2 线性扫描
    • 9.4 phi函数的特殊处理
      • 9.4.1 接合操作
      • 9.4.2 phi函数消除
    • 9.5 代码生成
      • 9.5.1 代码生成概述
      • 9.5.2 代码生成模板
      • 9.5.3 代码生成示例
    • 9.6 后端代码优化实验
      • 9.6.1 实验内容
      • 9.6.2 实验框架目录结构
      • 9.6.3 编译、运行与测试
    • 9.7 本章小结
  • 参考文献
1