首页>参考读物>计算机科学与技术>软件与程序设计

深入解析Java编译器:源码剖析与实例详解
作者 : 马智 著
出版日期 : 2019-12-16
ISBN : 978-7-111-64338-8
定价 : 179.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 668
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

本书针对Java语言的编译器源码进行深度剖析,所以本书面向的读者主要是那些想深入研究Java语言运行原理的人。另外本书还可以用作编译原理的学习,通过强实践来达到学习的目的,所以对于想学习编译原理的人,如软件专业的学生,也是一个很好的选择。
本书共18章,5个附录,涵盖-Javac文件系统、词法分析、语法分析、符号表、语义分析、泛型、数据流、语法糖、字节码、Class文件等大量内容。由于Java编译器有10万行以上的代码,并且逻辑周密,细节众多。为了能够让读者更好的理解其中的要点,本书将会有大量的配图和实例,并且要对重点源代码展开细致的讲解。

图书特色

广告语:
资深程序员深入剖析工业级编译器Javac的源码实现,全面讲解从Java源代码到生成Class文件的每个过程。掌游天下姚宝栓蚂、蚁金服陈峰、京东数科王帅力荐!用大量图示和实例带领读者真正掌握Java编译器的具体实现

图书前言

为什么要写这本书?
  Java是一门流行多年的高级编程语言,相关的就业岗位很多,但是最近几年却出现了用人单位招不到人,大量研发人员找不到工作的尴尬局面。究其根本原因还是岗位对技术的要求高,不但要会应用,更要懂其内部的运行原理。对于想要深入研究Java的从业者来说,目前国内市场上还没有一本剖析Java编译器(Javac)源码的书籍,也没有一本剖析工业级编译器源码的书籍,这正是本书要填补的市场空白。
  本书围绕市面上的主流编译器Javac进行源代码剖析,详细介绍了词法分析、语法分析、语义分析及代码生成等各个阶段的具体实现。另外,本书有大量的配图和实例,以便读者能更好地理解书中的要点。
本书有何特色
  1.内容丰富,讲解详细
  本书对Java编译器的词法分析、语法分析、语义分析及代码生成等各个阶段的源代码实现做了详细介绍,可以帮助读者系统地掌握Java编译器的实现原理。
  2.原理分析与实例并重
  本书对Java编译器各个编译阶段的源代码实现都进行了重点介绍,同时也简单介绍了一些编译器的基本原理,并给出了大量的配图和实例,能让读者真正掌握Java编译器的具体实现。
  3.分析工业级编译器的源码实现
  本书分析的编译器Javac是一个工业级的编译器,它是大部分Java开发人员将Java源代码转换为Class文件的首选编译器。对于Java从业人员来说,本书可以让他们学习到Javac是如何支持Java语言的相关特性的,如泛型;而对于那些对编译器感兴趣的人来说,本书则可以让他们真正学习到如何将编译器的相关理论知识应用到开发实践中。
本书内容
  本书深入剖析了Javac的源代码实现,每一章都会对重点的源代码实现进行解读。各章的内容简单介绍如下:
  第1章介绍了Javac的目录结构及源代码调试,同时对Javac支持的编译命令的实现进行了简单介绍。
  第2章介绍了Javac操作文件(如读取.java文件、读取JAR包)相关的类。
  第3章介绍了Javac将读取到的Java源代码的字符流转换为Token流的过程。
  第4章介绍了抽象语法树的每个树节点,这些树节点可以大概划分为定义及声明、语句与表达式。
  第5章介绍了如何建立抽象语法树,即Javac根据Token流建立一个完整的抽象语法树。
  第6章介绍了符号表的结构,同时也对Javac中使用的符号及类型做了详细介绍。
  第7章进行符号表的填充,分两个阶段对抽象语法树进行扫描,然后向符号表中填充相关的符号。
  第8章介绍了插入式注解的具体实现过程。
  第9章介绍了Java的类型转换,重点介绍了赋值转换、方法调用转换、强制类型转换及数字提升这些上下文环境中的类型转换实现。
  第10章介绍了语法检查,主要是对类型定义、变量定义及方法定义的合法性进行检查。
  第11章介绍了引用消解,主要是查找表达式中所引用的唯一符号,Resolve类中提供了对类型引用、变量引用及方法引用的具体查找方法。
  第12章对抽象语法树进行了类型与符号标注,重点介绍了一些重要树节点,如JCIdent和JCFieldAccess等的具体标注过程。
  第13章介绍了泛型的实现。泛型类型或泛型方法等与泛型相关的特性完全由编译器来支持,而在后续生成Class文件的过程中需要对泛型进行擦除。
  第14章介绍了数据流分析,分别从变量赋值、语句活跃性及异常这3个方面对if判断语句、循环语句及try语句等进行分析。
  第15章介绍了语法糖去除,分别对简单的语法糖、语句语法糖、枚举类语法糖与内部类语法糖进行分析。
  第16章介绍了字节码指令的生成,通过简单模拟Java虚拟机运行时的情况来更好地生成字节码指令。
  第17章介绍了重要结构的字节码指令生成,对一些常见的控制结构,如if语句、循环语句、switch语句及try语句等指令的生成过程进行了详细介绍。
  第18章介绍了Class文件的生成,根据Class文件规范生成可被Java虚拟机加载运行的文件。
  附录A介绍了Javac支持的命令。
  附录B介绍了Java语言涉及的文法。
  附录C介绍了对类型的常见操作。
  附录D介绍了对符号的常见操作。
  附录E介绍了虚拟机字节码指令。
本书读者对象
  阅读本书需要读者有一定的编程经验,最好是对Java语言有一定的了解。具体而言,本书主要适合以下读者阅读:
* 想深入学习Java语言特性的Java从业人员;
* 想通过实践学习编译器理论的人员,如高校相关专业的学生;
* 想借鉴编译器架构的人员;
* 对大型工程源代码感兴趣的人员。
本书阅读建议
  本书每一章都和前后章形成了承前启后的关系,所以建议读者在阅读本书的过程中,严格按照章节的顺序进行阅读,同时也建议读者在阅读每一章的过程中对书中给出的实例进行实践,以便更好地理解本书所讲的内容。
  Javac有10万行以上的源代码实现,并且代码的逻辑密度非常大。读者阅读相关源代码的实现时,建议不要过分纠结于每个实现细节,否则会陷入细节的“汪洋大海”中。本书对Javac的重点源代码进行了解读,读者可以参考书中对这些重点源代码的讲解进行阅读和调试即可。
本书配套资源获取方式
  本书涉及的Javac源代码已经开源,可以通过多种途径获取。读者可以直接访问以下网址获取:
  https://download.java.net/openjdk/jdk7。
读者反馈
  由于笔者水平所限,书中可能还存在一些疏漏,敬请读者指正,笔者会及时进行调整和修改。联系邮箱:hzbook2017@163.com。
致谢
  在本书的写作过程中,得到了很多朋友及同事的帮助和支持,在此表示由衷的感谢!
  感谢欧振旭编辑在本书出版过程中给予笔者的大力支持与帮助!
  最后感谢我的家人在写作时给予我的理解与支持,在我遇到挫折和问题时,家人都坚定地支持着我。爱你们!

马智

上架指导

计算机\程序设计

封底文字

业内点评:

在日常的程序开发中,开发人员可能很少思考Javac编译器是如何运行的,以及如何对代码进行优化。本书从编译器源码剖析的角度,详细介绍了Javac如何实现编译,以及如何结合Java的特性而实现编译优化等相关内容,从而让开发者能更好地掌控Java这个“神兽”,编写出更加利于编译器优化的高性能代码。
——掌游天下玉米广告部门经理 姚宝栓

马智用他的专业知识和丰富的开发经验,深入剖析了工业级编译器Javac的源码实现过程。对于任何一个使用Java语言做开发的人来说,本书可以帮助他们更加深入地理解Javac编译器,从而提高开发水平,提升职场竞争力。
——蚂蚁金服工程师 陈峰

本书将Java语言复杂的底层编译逻辑用简单明了的语言和生动的图示进行讲解,读后给人一种“大彻大悟”的感觉,推荐给那些想要透彻理解Java语言的人阅读。
——京东数科高级工程师 王帅

编辑推荐:
资深程序员深入剖析工业级编译器Javac的源码实现
全面讲解从Java源代码到生成Class文件的每个过程
对Java编译器各编译阶段的源代码实现进行了详细介绍
用大量图示和实例带领读者真正掌握Java编译器的具体实现
帮助读者深入理解Javac如何支持Java语言的诸多特性
让读者能真正理解如何将编译器的相关理论知识应用到开发实践中
本书核心内容:
Javac介绍
Javac文件系统
词法分析
语法分析之认识树节点
语法分析之建立抽象语法树
符号表的组织、填充符号表
插入式注解的实现
语义分析之类型转换
语义分析之语法检查
语义分析之引用消解
语义分析之语法树标注
泛型的实现
数据流检查
语法糖去除
字节码指令生成
重要结构的字节码指令生成
生成Class文件
Javac命令
文法
类型常见操作
符号常见操作
虚拟机字节码指令表

图书目录

前言
第1章 Javac介绍 1
1.1 初识Javac 1
1.2 Javac源码与调试 4
1.3 Javac命令 7
第2章 Javac文件系统 12
2.1 文件相关实现类 12
2.2 文件的管理 25
2.2.1 获取JavacFileManager对象 25
2.2.2 StandardLocation类 28
2.2.3 JavacFileManager类 31
第3章 词法分析 38
3.1 字符编码 38
3.2 获取字符输入流 40
3.3 Token与Name 43
3.3.1 Token介绍 44
3.3.2 Name对象的生成与存储 47
3.3.3 Name映射为Token 51
3.4 生成Token流 52
第4章 语法分析之认识树节点 67
4.1 定义及声明 68
4.1.1 JCCompilationUnit类 68
4.1.2 JCImport类 69
4.1.3 JCClassDecl类 70
4.1.4 JCModifiers类 71
4.1.5 JCTypeParameter类 72
4.1.6 JCVariableDecl类 72
4.1.7 JCMethodDecl类 74
4.2 语句 75
4.2.1 JCBlock类 75
4.2.2 JCIf类 76
4.2.3 JCWhileLoop、JCDoWhileLoop、JCForLoop与JCEnhancedForLoop类 78
4.2.4 JCSwitch与JCCase类 79
4.2.5 JCTry、JCCatch与JCThrow类 81
4.2.6 JCLabeledStatement、JCReturn、JCContinue与JCBreak类 82
4.2.7 JCSynchronized类 83
4.2.8 JCAssert类 83
4.3 表达式 83
4.3.1 基本表达式 84
4.3.2 含运算符的表达式 88
4.3.3 类型相关表达式 94
4.3.4 注解表达式 97
4.4 生成树节点 98
第5章 语法分析之建立抽象语法树 101
5.1 定义及声明的抽象语法树 101
5.2 语句的抽象语法树 112
5.3 表达式的抽象语法树 121
5.3.1 基本表达式 122
5.3.2 含有运算符的表达式 134
5.4 遍历抽象语法树 140
第6章 符号表的组织 143
6.1 符号的定义 143
6.1.1 Symbol类 144
6.1.2 TypeSymbol及其子类 150
6.1.3 VarSymbol类 154
6.1.4 MethodSymbol及OperatorSymbol类 154
6.2 符号表的组织 160
6.2.1 Env类介绍 160
6.2.2 AttrContext类介绍 162
6.2.3 Scope类介绍 163
6.2.4 符号表的建立 164
6.3 类型的定义 169
6.3.1 普通类型的定义 169
6.3.2 泛型相关类型的定义 175
第7章 填充符号表 180
7.1 依赖的处理 180
7.1.1 创建包或类符号 180
7.1.2 输入包或类下的成员符号 184
7.2 符号输入的第一阶段 189
7.2.1 Enter类 190
7.2.2 visitTopLevel()方法 192
7.2.3 visitClassDef()方法 193
7.2.4 visitTypeParameter()方法 196
7.3 符号输入第二阶段 197
7.3.1 MemberEnter类 197
7.3.2 visitImport()方法 200
7.3.3 visitMethodDef()方法 207
7.3.4 visitVarDef()方法 209
第8章 插入式注解的实现 211
8.1 注解处理器基础 211
8.1.1 编写注解处理器 211
8.1.2 注解配置 215
8.1.3 工具类 215
8.2 初始化注解处理器 222
8.3 运行注解处理器 226
第9章 语义分析之类型转换 233
9.1 类型转换的种类 233
9.2 赋值转换 245
9.3 方法调用转换 253
9.4 强制类型转换 254
9.5 数字提升 266
第10章 语义分析之语法检查 269
10.1 类型定义的检查 269
10.1.1 父类及实现接口的检查 269
10.1.2 类型定义的唯一性检查 273
10.1.3 类型中方法的兼容性检查 276
10.1.4 类型中实现方法的检查 287
10.2 变量定义的检查 294
10.3 方法定义的检查 296
10.3.1 方法的唯一性检查 296
10.3.2 方法的隐藏 298
10.3.3 方法的覆写 303
第11章 语义分析之引用消解 307
11.1 Resolve类介绍 307
11.2 类型引用的消解 310
11.3 变量引用的消解 320
11.4 方法引用的消解 323
第12章 语义分析之语法树标注 345
12.1 Attr类介绍 346
12.2 表达式相关树节点的标注 348
12.2.1 JCUnary树节点标注 348
12.2.2 JCBinary树节点的标注 350
12.2.3 JCAssignOp树节点的标注 351
12.3 JCIdent树节点的标注 351
12.4 JCFieldAccess树节点的标注 354
第13章 泛型的实现 361
13.1 泛型类型 361
13.2 泛型方法 364
13.2.1 类型推断 365
13.2.2 钻石语法 383
13.3 泛型擦除 386
第14章 数据流检查 396
14.1 Flow类介绍 396
14.1.1 语句的活跃性分析 396
14.1.2 变量赋值检查 398
14.1.3 异常检查 405
14.2 if语句的分析 405
14.2.1 if语句 405
14.2.2 一元表达式与if语句 409
14.2.3 二元表达式与if语句 410
14.2.4 三元表达式与if语句 412
14.3 循环语句的分析 413
14.3.1 for语句 413
14.3.2 中断循环语句 416
14.4 try语句与throw语句的分析 419
14.4.1 抛出异常 419
14.4.2 异常检查 424
14.4.3 变量赋值状态及语句的活跃性 430
第15章 语法糖去除 435
15.1 简单语法糖 436
15.1.1 变长参数 436
15.1.2 条件编译 437
15.1.3 自动装箱与拆箱 438
15.2 语句语法糖 440
15.2.1 foreach语句 440
15.2.2 switch语句 442
15.2.3 try-with-resources语句 447
15.3 枚举类语法糖 452
15.4 内部类语法糖 453
15.4.1 调用私有构造方法 454
15.4.2 引用成员 457
15.4.3 super关键字引用父类成员 470
15.4.4 访问自由变量 472
第16章 字节码指令生成 486
16.1 字节码指令集 486
16.2 生成字节码指令 492
16.2.1 实现本地变量表 492
16.2.2 实现操作数栈 495
16.2.3 常量池信息的存储 497
16.2.4 Code类介绍 499
16.3 Gen类介绍 502
16.4 可寻址实体Item 506
16.4.1 LocalItem类 508
16.4.2 ImmediateItem类 512
16.4.3 StackItem类 514
16.4.4 AssignItem类 515
16.4.5 StaticItem类 517
16.4.6 MemberItem类 520
16.4.7 SelfItem类 523
16.4.8 IndexedItem类 524
第17章 重要结构的字节码指令生成 527
17.1 控制转移指令与地址回填 527
17.1.1 认识控制转移指令 527
17.1.2 地址回填 529
17.2 语句的条件判断表达式 530
17.2.1 CondItem类 530
17.2.2 一元与二元条件判断表达式 533
17.2.3 三元条件判断表达式 534
17.3 if语句 536
17.4 循环语句 537
17.5 switch语句 539
17.6 异常与finally语句 545
17.6.1 异常的抛出 545
17.6.2 异常的捕获与finally语句 545
第18章 生成Class文件 553
18.1 Class文件的结构 553
18.2 魔数与版本 556
18.3 常量池 556
18.4 类定义的基本信息 562
18.4.1 访问标识符 562
18.4.2 类、父类及接口集合 564
18.5 字段集合 565
18.6 方法集合 570
18.7 类属性集合 575
18.8 描述符和签名 581
18.8.1 描述符 581
18.8.2 签名 582
18.8.3 描述符与签名的实现 585
附录A Javac命令 589
附录B 文法 592
附录C 类型常见操作 600
C.1 supertype()方法 600
C.2 interfaces()方法 604
C.3 asSuper()方法 606
C.4 asOuterSuper()方法 608
C.5 isSameType()方法 609
C.6 L()与U()方法 615
C.7 lowerBound()与upperBound()方法 616
C.8 containsType()方法 617
C.9 hasSameArgs()方法 621
C.10 subst()方法 623
C.11 memberType()方法 626
C.12 erasure()与erasureRecursive()方法 628
附录D 符号常见操作 632
D.1 isInheritedIn()方法 632
D.2 hiddenIn()方法 633
D.3 isMemberOf()方法 634
D.4 overrides()方法 635
D.5 implementation()方法 639
附录E 虚拟机字节码指令表 645
E.1 加载与存储指令 645
E.2 运算指令 648
E.3 类型转换指令 650
E.4 对象操作指令 651
E.5 操作数栈管理指令 652
E.6 控制转移指令 652
E.7 方法调用和返回指令 653
E.8 异常抛出指令 654
E.9 同步指令 654

教学资源推荐
作者: 刁成嘉 刁 奕
作者: 郝玉洁
作者: [美]梁勇(Y.Daniel Liang) 著
参考读物推荐
作者: James EHarmon
作者: [美] 苏妮塔·钱德拉塞克兰(Sunita Chandrasekaran) [德]吉多· 杰克兰德(Guido Juckeland) 编