我的书籍《深入解析Java编译器:源码剖析与实例详解》就要出版了
一个十足的技术迷,2013年毕业,做过ERP、游戏、计算广告,在大公司呆过,但终究不满足仅对技术的应用,在2018年末离开了公司,全职写了一本书《深入解析Java编译器:源码剖析与实例详解》,在近期就会上市销售了。
1、为什么要写这本书?
从去年年底离职到今天7月交完《深入解析Java编译器:源码剖析与实例详解》书稿,到现在上市发行也差不多一年过去了,也算是给了自己这一年一个交待吧。写书不赚钱,估计首次拿到的稿费还不如我在大公司呆一个月的收入吧,但是花费的时间和精力却是巨大的,而且这种研究工业级编译器的书籍也鲜有参考资料,写起来难度着实不小。不过我觉得还是值得的,至少觉得要比工作更有意义吧,最重要的是喜欢,而且写书不仅是对自己所学知识的总结,同时也是一次分享,尤其是能与大众进行讨论,更好的提升自己。
2、书籍介绍
本书共有18章,详细介绍了Javac从Java源代码到Class文件编译的每个过程,由于Javac是工业级的编译器,所以代码与一些Demo编译器比起来,功能完善且对异常及错误的处理更加合理,但也导致Javac的代码量过大,细节众多,所以如果读者阅读相关源代码实现时,建议不要过分纠结每个实现细节,否则会陷入细节的汪洋大海中。本书对Javac的重点源代码进行了解读,读者可参考本书对这些重点源代码进行阅读调试即可。书的封面如下图所示:

下面简要介绍一下《深入解析Java编译器:源码剖析与实例详解》这本书的内容,如下:
|
章节 |
描述 |
|
第1章 |
介绍了Javac的目录结构及源代码调试,同时对Javac支持的编译命令的实现进行了简单介绍 |
|
第2章 |
介绍了Javac操作文件(如读取.java文件、读取JAR包)相关的类 |
|
第3章 |
介绍了Javac将读取到的Java源代码的字符流转换为Token流的过程 |
|
第4章 |
认识抽象语法树的每个树节点,这些树节点可以大概划分为定义及声明、语句与表达式 |
|
第5章 |
建立抽象语法树,Javac根据Token流建立一个完整的抽象语法树 |
|
第6章 |
介绍了符号表的结构,同时也对Javac中使用的符号及类型做了详细介绍。关于类型的常见操作在附录C中进行了介绍,对符号常见的操作在附录D中进行了介绍 |
|
第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 |
介绍了Java支持的命令 |
|
附录B |
介绍了文法 |
|
附录C |
介绍了对类型的常见操作 |
|
附录D |
介绍了对符号的常见操作 |
|
附录E |
介绍了虚拟机字节码指令 |
3、书籍面向的读者
阅读本书需要读者有一定的编程经验,建议读者最好对Java语言有一定的了解。具体而言,本书主要适合以下读者阅读:
- 想深入了解Java语言特性的Java从业人员;
- 想通过实践学习编译器理论的人,如高校相关专业的学生;
- 想借鉴编译器架构的人;
- 对大型工程的源代码感兴趣的人;
4、先读为快
由于纸书出版的延后,目前还不能在市面上购买,不过读者可以在纸质版书籍出版前先阅读电子版内容,有需要的同学可以扫描下图中的二维码直接进行购买,这个定价包括阅读电子版的权限以及本书出版后的纸质版书籍一本。

由于Javac编译器的实现细节众多,逻辑稠密,所以书中在对源代码实现进行介绍时,难免会有错误和漏洞,期望读者有更多的反馈,也希望能在华章的鲜读上与读取有更多的交流!
5、写在最后
写完这本书,我的第一阶段目标也算完成了。接下来还要继续研究Java虚拟机Hotspot的源代码实现,期望后续会有类似这种《深入解析Hotspot:源码剖析与实例详解》的书籍出现在市面上。总之目标只有一个,彻底搞清楚Java语言底层的实现机制。
一个人的力量总是单薄的,如果有志同道合的朋友想一起研究Javac编译器或Hotspot虚拟机,亦或是对我的书籍有什么疑问,请加我微型mazhimazh,我拉你进群,备注信息:姓名-学校或公司-研究领域。
我的书籍《深入解析Java编译器:源码剖析与实例详解》就要出版了的更多相关文章
- Java 容器源码分析之集合类详解
集合类说明及区别 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └W ...
- Lua5.4源码剖析:二. 详解String数据结构及操作算法
概述 lua字符串通过操作算法和内存管理,有以下优点: 节省内存. 字符串比较效率高.(比较哈希值) 问题: 相同的字符串共享同一份内存么? 相同的长字符串一定不共享同一份内存么? lua字符串如何管 ...
- Java ArrayList源码剖析
转自: Java ArrayList源码剖析 总体介绍 ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现.除该类未实现同步外 ...
- nginx源码分析线程池详解
nginx源码分析线程池详解 一.前言 nginx是采用多进程模型,master和worker之间主要通过pipe管道的方式进行通信,多进程的优势就在于各个进程互不影响.但是经常会有人问道,n ...
- 【集合框架】JDK1.8源码分析之ArrayList详解(一)
[集合框架]JDK1.8源码分析之ArrayList详解(一) 一. 从ArrayList字表面推测 ArrayList类的命名是由Array和List单词组合而成,Array的中文意思是数组,Lis ...
- java中List的用法和实例详解
java中List的用法和实例详解 List的用法List包括List接口以及List接口的所有实现类.因为List接口实现了Collection接口,所以List接口拥有Collection接口提供 ...
- Spring源码之九finishRefresh详解
Spring源码之九finishRefresh详解 公众号搜索[程序员田同学],专职程序员兼业余写手,生活不止于写代码 Spring IoC 的核心内容要收尾了,本文将对最后一个方法 finishRe ...
- Java并发包源码学习系列:详解Condition条件队列、signal和await
目录 Condition接口 AQS条件变量的支持之ConditionObject内部类 回顾AQS中的Node void await() 添加到条件队列 Node addConditionWaite ...
- 转:【Java集合源码剖析】LinkedHashmap源码剖析
转载请注明出处:http://blog.csdn.net/ns_code/article/details/37867985 前言:有网友建议分析下LinkedHashMap的源码,于是花了一晚上时 ...
随机推荐
- Spring Cloud zuul网关服务 一
上一篇进行Netflix Zuul 1.0 与 gateway的对比.今天来介绍一下 zuul的搭建及应用 Zuul 工程创建 工程创建 cloud-gateway-zuul.还是基于之前的工程 po ...
- 使用Wireshark成功解决JavaWeb项目的页面一直加载中的问题
现象 打开 服务器页面 10.2.155.100,然后发现页面JS显示 加载中..F12浏览器看起来像是发起css等静态资源时卡死.一时定位还以为时 前端的问题. 解决过程 上服务器抓包: tcpdu ...
- [NOI2001]食物链(并查集拓展域)&& [HAOI2006]旅行(Kruskal)
题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...
- Mac高效开发之iTerm2、Prezto和Solarized主题
本文首发于个人网站:Mac高效开发之iTerm2.Prezto和Solarized主题 工欲善其事必先利其器,作为开发,我追求极致的高效,因此会在很多细节上追求效率,例如:命令行窗口敲命令的时候,如果 ...
- chrome安装json美化软件 JSONView
安装效果如下: 安装步骤: 1.下载地址: github地址:https://github.com/gildas-lormeau/JSONView-for-Chrome 2.解压文件 3.打开谷歌浏览 ...
- Pyhton网络爬虫之CrawlSpider
一.什么是CrawlSpider? 在学习CrawlSpider之前如果我们想爬取某网站前100页的内容的话,我们可以使用的方法是通过Request模块手动发起请求,递归调用parse方法,写起来非常 ...
- Java HashSet对txt文本内容去重(统计小说用过的字或字数)
Java HashSet对txt文本内容去重(统计小说用过的字或字数) 基本思路: 1.字节流读需要去重的txt文本.(展示demo为当前workspace下名为utf-8.txt的文本) 2.对读取 ...
- Vim任意代码执行漏洞(CVE-2019-12735)
Vim通过Modelines执行任意代码 漏洞概要: 在8.1.1365之前的Vim和在0.3.6之前的Neovim很容易通过打开特制的文本文件而通过模型执行任意代码. 复现条件: 确保未禁用mode ...
- C++学习笔记4_new和delete
1. 默认的new和delete操作符new和delete是和c里面的mlloc和free是一样的,在堆中创建空间.堆中创建的,都要自己释放.C中void test(){ int *p=(int *) ...
- MIT线性代数:2.消元法