登入帳戶  | 訂單查詢  | 購物車/收銀台(0) | 在線留言板  | 付款方式  | 聯絡我們  | 運費計算  | 幫助中心 |  加入書簽
會員登入   新用戶註冊
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2024年度TOP分類閱讀雜誌 香港/國際用戶
最新/最熱/最齊全的簡體書網 品種:超過100萬種書,正品正价,放心網購,悭钱省心 送貨:速遞 / 物流,時效:出貨後2-4日

2025年09月出版新書

2025年08月出版新書

2025年07月出版新書

2025年06月出版新書

2025年05月出版新書

2025年04月出版新書

2025年03月出版新書

2025年02月出版新書

2025年01月出版新書

2024年12月出版新書

2024年11月出版新書

2024年10月出版新書

2024年09月出版新書

2024年08月出版新書

2024年07月出版新書

『簡體書』编译器设计实战:基于Python的增量式设计 [美]杰里米·G. 希克 编译器 编译原理 编译器优化 编译器设计 编程语言设计 龙书

書城自編碼: 4155047
分類: 簡體書→大陸圖書→計算機/網絡操作系統/系統開發
作者: [美]杰里米·G. 希克
國際書號(ISBN): 9787111789376
出版社: 机械工业出版社
出版日期: 2024-12-01

頁數/字數: /
書度/開本: 16开 釘裝: 平装

售價:NT$ 454

我要買

share:

** 我創建的書架 **
未登入.



新書推薦:
美学四讲
《 美学四讲 》

售價:HK$ 332
不可辨识的生命—影像 融合文化研究、后现代视角与图像学,评析戏剧影视艺术,洞察社会思潮,思想美学并重
《 不可辨识的生命—影像 融合文化研究、后现代视角与图像学,评析戏剧影视艺术,洞察社会思潮,思想美学并重 》

售價:HK$ 398
大国重器—中国盾构机创新发展之路
《 大国重器—中国盾构机创新发展之路 》

售價:HK$ 551
长路行(带你看民国顶级书香世家的真实生活日常)
《 长路行(带你看民国顶级书香世家的真实生活日常) 》

售價:HK$ 347
人体脂肪的秘密
《 人体脂肪的秘密 》

售價:HK$ 352
社会史:理论与实践(增订版)(德国著名社会史学家于尔根·科卡重要文集。全面展现德国社会史学派的兴起与
《 社会史:理论与实践(增订版)(德国著名社会史学家于尔根·科卡重要文集。全面展现德国社会史学派的兴起与 》

售價:HK$ 500
津巴多时间心理学 首次系统论述时间观疗法 菲利普·津巴多 著 自我觉察 活在当下 津巴多 心理学 当
《 津巴多时间心理学 首次系统论述时间观疗法 菲利普·津巴多 著 自我觉察 活在当下 津巴多 心理学 当 》

售價:HK$ 352
亲爱的族人:菲利普王之战的新叙事(横扫北美史学界各项大奖 以印第安女王视角重写北美大陆的反殖民之战)
《 亲爱的族人:菲利普王之战的新叙事(横扫北美史学界各项大奖 以印第安女王视角重写北美大陆的反殖民之战) 》

售價:HK$ 653

編輯推薦:
编译器向来被视为最难教授和理解的程序之一。大多数编译书籍按阶段逐章讲解,这种结构掩盖了语言特性如何驱动设计选择的逻辑。相比之下,这本创新教材采用增量式方法,让学生能够亲自编写每一行代码。书中引导读者为一种小型但功能强大的编程语言构建自己的编译器,并随着章节推进逐步添加复杂的语言特性。作者阐释了现代编译器背后的核心概念、算法和数据结构,为读者学习后续高级主题奠定了基础。
本书特色:
将编译器构建的复杂挑战分解为易于掌握的小块内容。
通过将语言特性与编译器设计选择联系起来,增强学习效果。
采用“做中学”方法,加深读者对程序如何映射到计算机硬件的理解。
经过课堂验证,在GitHub上配有源代码。
內容簡介:
本书将带领读者使用Python语言动手构建编译器,通过循序渐进的方法,在设计和实现编译器的过程中了解基本概念、算法和数据结构等相关知识。本书将每章作为构建编译器的一个基本“步骤”,逐步为编译器添加功能。全书涵盖变量、寄存器、条件、循环、元组、函数、动态类型、通用类型等内容。本书适合作为高等院校编译原理等课程的教材,也适合相关技术人员参考。
關於作者:
杰里米·G. 希克(Jeremy G. Siek)
印第安纳大学信息、计算与工程学院的计算机科学教授。他的主要研究方向为编程语言设计、类型系统、使用证明助手的机械化定理证明以及编译器优化。Jeremy曾出版The Boost Graph Library,还设计了C 的受限模板。他发明了渐变类型,这是一种在同一编程语言中整合动态类型和静态类型的类型系统。2009年,他获得美国国家科学基金会(NSF)教师早期职业发展奖,以资助其“弥合原型与生产之间的差距”项目;2010年和2015年,他获得苏格兰信息学与计算机科学联盟(SICSA)杰出访问学者奖学金。他是印第安纳大学编程系统中心的成员。
目錄
目  录
Essentials of Compilation: An Incremental Approach in Python
译者序
前言
第1章 预备知识 1
1.1 抽象语法树 1
1.2 语法 3
1.3 模式匹配 5
1.4 递归函数 6
1.5 解释器 7
1.6 编译器示例:部分求值器 10
第2章 整数与变量 12
2.1 LVar语言 12
2.1.1 通过方法覆盖来扩展
解释器 13
2.1.2 LVar的定义性解释器 14
2.2 x86Int汇编语言 16
2.3 规划x86汇编之旅 20
2.4 移除复杂操作数 21
2.5 选择指令 23
2.6 分配变量存储 24
2.7 修补指令 25
2.8 生成起始和收尾代码 26
2.9 挑战:LVar的部分求值器 26
第3章 语法分析 28
3.1 词法分析和正则表达式 28
3.2 文法和解析树 30
3.3 二义性文法 32
3.4 从解析树到抽象语法树 33
3.5 Earley算法 34
3.6 LALR(1)算法 39
3.7 进一步阅读 42
第4章 寄存器分配 43
4.1 寄存器和调用约定 44
4.2 活跃性分析 46
4.3 构建干涉图 49
4.4 利用数独进行图着色 50
4.5 修补指令 55
4.6 生成起始和收尾代码 56
4.7 挑战:传送偏置 57
4.8 进一步阅读 59
第5章 布尔值和条件表达式 61
5.1 LIf语言 62
5.2 LIf 程序的类型检查 64
5.3 CIf中间语言 67
5.4 x86If 语言 68
5.5 收缩LIf语言 70
5.6 移除复杂操作数 70
5.7 详细控制 71
5.8 选择指令 77
5.9 寄存器分配 78
5.9.1 活跃性分析 78
5.9.2 构建干涉图 79
5.10 修补指令 79
5.11 生成起始和收尾代码 79
5.12 挑战:优化块和移除跳转 81
5.12.1 优化块 81
5.12.2 移除跳转 82
5.13 进一步阅读 83
第6章 循环和数据流分析 84
6.1 LWhile语言 84
6.2 循环控制流和数据流分析 86
6.3 移除复杂操作数 89
6.4 详细控制 89
6.5 寄存器分配 90
第7章 元组和垃圾回收 91
7.1 LTup语言 91
7.2 垃圾回收 94
7.2.1 双空间复制收集器 94
7.2.2 通过Cheney算法进行图的
复制 96
7.2.3 数据表示 97
7.2.4 垃圾回收器的实现 98
7.3 显露分配 99
7.4 移除复杂操作数 101
7.5 详细控制和CTup语言 101
7.6 选择指令和x86Global语言 102
7.7 寄存器分配 106
7.8 生成起始和收尾代码 106
7.9 挑战:数组 107
7.9.1 数据表示 110
7.9.2 重载解析 111
7.9.3 边界检查 111
7.9.4 显露分配 111
7.9.5 移除复杂操作数 112
7.9.6 详细控制 112
7.9.7 选择指令 112
7.10 进一步阅读 112
第8章 函数 114
8.1 LFun语言 114
8.2 x86汇编下的函数 118
8.2.1 调用约定 118
8.2.2 高效的尾调用 120
8.3 收缩LFun语言 121
8.4 揭示函数和LFunRef语言 121
8.5 限制函数 122
8.6 移除复杂操作数 122
8.7 详细控制和CFun语言 123
8.8 选择指令和语言 124
8.9 寄存器分配 126
8.9.1 活跃性分析 127
8.9.2 构建干涉图 127
8.9.3 分配寄存器 127
8.10 修补指令 127
8.11 生成起始和收尾代码 128
8.12 翻译举例 129
第9章 词法作用域函数 131
9.1 Lλ语言 132
9.2 赋值和词法作用域函数 136
9.3 唯一化变量 137
9.4 赋值转换 138
9.5 闭包转换 140
9.6 显露分配 142
9.7 详细控制和CClos 143
9.8 选择指令 143
9.9 挑战:优化闭包 144
9.10 进一步阅读 146
第10章 动态类型 147
10.1 LDyn语言 147
10.2 标记值的表示 151
10.3 LAny语言 151
10.4 强制转换插入:编译LDyn为
LAny 154
10.5 揭示强制转换 155
10.6 赋值转换 156
10.7 闭包转换 156
10.8 移除复杂操作数 156
10.9 详细控制和CAny 156
10.10 选择指令 157
10.11 LAny语言的寄存器分配 159
第11章 渐变类型 161
11.1 类型检查L  162
11.2 解释LCast 166
11.3 重载解析 170
11.4 插入强制转换 170
11.5 低层类型转换 171
11.6 区分代理 172
11.7 揭示强制转换 174
11.8 闭包转换 174
11.9 选择指令 174
11.10 进一步阅读 176
第12章 泛型 178
12.1 编译泛型 183
12.2 解析实例化 184
12.3 擦除泛型类型 185
附录 x86指令集快速参考 188
参考文献 190
內容試閱
前  言
Essentials of Compilation: An Incremental Approach in Python
这是一个神奇的时刻:当程序员按下运行按钮时,软件开始执行。不知何故,一个用高级语言编写的程序可以在一台只能进行位操作的计算机上运行。在这里,我们将揭示使这一时刻成为可能的魔法。从20世纪50年代巴克斯(Backus)及其同事的开创性工作开始,计算机科学家发展出了一种技术,用于构建称为编译器的程序,编译器可以将高级语言程序自动翻译成机器代码。
我们将带你踏上这样的旅程:为一种规模小但功能强大的语言构建自己的编译器。在这个过程中,我们将解释编译器背后的基本概念、算法和数据结构。帮助你理解程序是如何映射到计算机硬件的,这有助于推断硬件和软件交界处的属性,例如软件的执行时间、软件错误和安全漏洞等。对于那些有志于以构造编译器为职业的人,本书的目标是作为日后研究更深入主题的基石,例如即时编译、程序分析和程序优化;对于那些对设计和实现编程语言感兴趣的人,本书则把语言设计中的可能选择与这些选择对编译器和生成的代码的影响联系了起来。
编译器通常组织为一系列阶段,通过这些阶段逐步将程序转换为在硬件上运行的代码。我们将这一方法发挥到了极致,将编译器划分为大量微编译遍,每个微小过程执行单一的任务。这样,我们就可以独立地测试编译过程的每一个编译遍,并可集中注意力于相应的编译遍,从而使编译器工作过程更易理解。
描述编译器最常见的方法是每章只介绍一个编译遍。对于如何根据语言特性挑选编译器的设计方案,这种方法对此问题的回答是模糊的。与此相反,我们采用增量式方法,在每章中都将构建一个完整的编译器,从只包含算术和变量的小型输入语言开始,在后续章节中不断添加新的语言特性,并根据需求对编译器进行相应的扩展。
我们选择的语言特性旨在引出编译器中使用的基本概念和算法。
从第1章和第2章的整数算术和局部变量开始,介绍编译器构造的基本工具:抽象语法树和递归函数。
第3章,将学习如何使用Lark语法分析器框架为整数算术和局部变量语言创建分析器。将了解Lark内部的分析算法,包括Earley和LALR(1)。
第4章,应用图着色算法来将程序中的变量分配给机器的寄存器。
第5章添加了条件表达式,它激发出了一个优雅的递归算法,将条件表达式转换为条件goto语句。
第6章加入了循环语句,该语句的处理需要在寄存器分配器过程中进行数据流分析。
第7章增加了堆分配的元组,引出了内存垃圾回收。
第8章将函数添加为没有词法作用域的第一类值,类似于C编程语言中的函数(Kernighan and Ritchie 1988)。读者将了解过程调用栈和调用约定,以及它们如何与寄存器分配和内存垃圾回收相互作用。本章还描述了如何生成有效的尾调用。
第9章添加了具有词法作用域的匿名函数,即λ表达式。读者将了解闭包转换,其中的λ表达式被转换为函数和元组的组合。
第10章增加了动态类型。在此之前讨论的输入语言都是静态类型的。本章使用Any类型扩展静态类型语言,该类型用作编译动态类型语言的目标类型。
第11章使用第10章引入的Any类型来实现一种渐变类型语言,其中程序的不同区域可以是静态类型或动态类型。读者将可实现对代理的运行时支持,这些代理允许值在不同类型区域之间安全地移动。
第12章添加了带有自动装箱的泛型,它是借助第10章和第11章中开发的Any类型和类型强制转换来实现的。
许多语言特性还没有包括在本书的讨论中。我们的选择平衡了语言特性附带的复杂性和它所展示的基本概念。例如,本书包含元组而没有包含记录,因为尽管它们都需要研究堆分配和垃圾回收,但记录处理伴随着更大的复杂性。
自2009年以来,本书的草稿一直作为科罗拉多大学和印第安纳大学的高年级本科生和一年级研究生的16周编译原理课程的教科书。参加学习的学生已经学完了编程、数据结构和算法以及离散数学的基础知识。学生在课程开始时就分成两到四人的小组。从第2章开始,会根据学生的兴趣选择所包含的章节,同时兼顾图0.1所示的各章节之间的依赖关系,各小组大约每两周完成一章的学习。第8章(函数)只在有效尾调用的实现中依赖于第7章(元组)的实现。课程的最后两周包括一个期末项目,学生在其中设计并实现自己所选内容的编译器的扩展。最后几章可以用来支持这些项目。许多章节中都包含了我们分配给研究生的富有挑战性的问题。
图0.1 各章依赖关系图
对于季度制(大约十周)的大学编译原理课程,我们建议完成第7章或第8章前的课程内容,并为编译器相关的编译遍给学生提供一些框架代码。本课程可以通过跳过第6章(循环)和第9章(λ表达式)来强调函数式语言;而通过将第10章加入到课程中,本课程可以适应动态类型语言的编译原理课程的学习。
本书已经在下述大学的编译原理课程中使用:加州州立理工大学、波特兰州立大学、罗斯–霍尔曼理工学院、弗莱堡大学、马萨诸塞大学洛厄尔分校和佛蒙特
大学。
本书使用Python来实现编译器和输入语言,所以读者应该精通Python语言。有许多学习Python的优秀资源(Lutz 2013;Barry 2016;Sweigart 2019;Matthes 2019)。本书的支持代码位于以下GitHub存储库中:
https://github.com/IUCompilerCourse/
编译器针对x86汇编语言(Intel 2015),所以,如果读者已经选修了计算机系统课程(Bryant and O’ Hallaron 2010),将会非常有帮助(但不是必需的)。书中介绍了编译器中需要使用的x86-64汇编语言的部分。我们遵循了UNIX系统V调用约定(Bryant and O’ Hallaron 2005;Matz et al. 2013),因此在英特尔硬件上运行的Linux或MacOS操作系统中使用GNU C编译器(gcc)进行编译时,所生成的汇编代码都可以与运行时系统(用C语言编写)一起工作。在Windows操作系统上,gcc使用了Microsoft x64调用约定(Microsoft 2018, 2020)。因此,我们生成的汇编代码不能在Windows运行时系统中工作。一种解决方法是使用带有Linux的虚拟机作为客户机操作系统。
致谢
印第安纳大学编译器构造的教学传统可以追溯到Daniel Friedman在20世纪70年代和80年代对编程语言的研究和课程。他的学生Kent Dybvig实现了Chez Scheme(Dybvig 2006),这是一个高效的、产品质量级的Scheme编译器。在20世纪90年代和21世纪初,Dybvig教授进行编译器课程教学,并继续开发Chez Scheme。编译器课程逐渐融入了新颖的教学理念,同时也包含了现实世界中编译器的元素。Friedman的想法之一是将编译器分成许多小的“遍”。另一个被称为“对战”(the game)的想法是使用解释器测试每遍生成的代码。
Dybvig在他的学生Dipanwita Sarkar和Andrew Keep的帮助下,开发了支持这种方法的基础平台,并发展了使用更小的微编译遍(Sarkar, Waddell, and Dybvig 2004;Keep 2012)的方法。本书中的许多编译器设计决策都受到了Dybvig和Keep(2010)课程作业的启发。在20世纪00年代中期,Dybvig的一位名叫Abdulaziz Ghuloum的学生观察到,课程中的前端–后端组织方式使得学生很难理解编译器设计的基本原理。Ghuloum于是提出了增量式方法(Ghuloum 2006),本书就基于这一方法。
我要感谢在印第安纳大学编译原理课程中担任助教的许多学生,包括Carl Factora、Ryan Scott、Cameron Swords和Chris Wailes。我要感谢Andre Kuhlenschmidt在垃圾回收器和x86解释器方面的工作,Michael Vollmer在高效尾调用方面的工作,以及Michael Vitousek在印第安纳大学首次提供增量式编译原理课程方面的帮助。
我要感谢各位教授:Bor-Yuh Chang、John Clements、Jay McCarthy、Joseph Near、Ryan Newton、Nate Nystrom、Peter Thiemann、Andrew Tolmach和Michael Wollowski。他们基于本书草稿开设编译原理课程并及时进行了反馈。感谢美国国家科学基金会对这项工作的资助:资助号为1518844、1763922和1814460。
我要感谢Ronald Garcia在21世纪初帮助我熬过了Dybvig的编译原理课程,尤其是帮助我找到了那个让垃圾回收器白费精力的软件缺陷!
Jeremy G. Siek  
印第安纳州布卢明顿市

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 台灣用户 | 香港/海外用户
megBook.com.tw
Copyright (C) 2013 - 2025 (香港)大書城有限公司 All Rights Reserved.