1.理解前端编译的规格
在正式阅读OpenJDK前端编译器源码之前,建议先阅读笔者的这几篇文章,可以对JVM的前端编译的规格有一定了解:
【编译引擎】-2-学习阅读Class文件结构(16进制版)-上
【编译引擎】-2-学习阅读Class文件结构(16进制版)-中
【编译引擎】-2-学习阅读Class文件结构(16进制版)-下
当我们对前端编译器的规格、术语、概念有了一定了解后,就可以阅读如下几个基础模块的代码,建立阅读前端编译器核心代码的基础。
2.前端编译器基础模块1-javac的入口类
这部分代码可以参考这篇文章中的"3.javac的入口解读"章节,此处不赘述
3.前端编译器基础模块2-参数管理
javac主要通过如下三个类实现了参数管理:
com/sun/tools/javac/main/Option.java
com/sun/tools/javac/main/OptionHelper.java
com/sun/tools/javac/util/Options.java
3.1.com/sun/tools/javac/main/Option.java
Option是一个枚举类,是参数管理的核心类
从关键属性看
Option的关键属性有:text
、kind
、group
、argsNameKey
、descrKey
、choiceKind
、choices
。
具体见如下代码标注:
|
|
从枚举值看
javac支持的命令行参数就是与Option类的枚举值对应的。笔者将javac官方文档与Option类的枚举值进行了对应:
javac官方文档:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html
javac文档中的Standard Options、Cross-Compilation Options、Compact Profile Option
|
|
javac官方文档的Nonstandard Options
|
|
javac官方文档的Command-Line Argument Files
|
|
javac官方文档上没有对应的枚举值的隐藏参数
除了前两个被定义为EXTEND类型的参数,后面的都是被定为为HIDDEN类型的参数
|
|
结论
从上述源码的分析,我们可以得到以下结论:
javac的命令行参数被分为了STANDARD、EXTENDED、HIDDEN。其中,
STANDARD参数会写进javac官方文档的Standard Options、Cross-Compilation Options、Compact Profile Option章节;
EXTENDED会写进javac官方文档Nonstandard Options章节;
延伸
其它JDK自带的命令行工具,都有类似的Option模块处理命令行参数(如下java.c
源码中)。
源码中有如此机制,我们可以得到一下命令行工具学习的新思路:
我们可以在学习JDK命令行工具的时候,不仅局限于对应的官方文档,还可以通过Options类的枚举值探索一些隐藏的命令行参数。
从构造函数看
如下N个构造函数,支撑了各个枚举值的定义。
从方法看
Option的方法如下:
关键方法是process方法,它通过将待处理的Option对象加入到OptionHelper中,支撑了2.1章节涉及的Main#processArgs方法
。
|
|
从周边关系看
在Main#optionHelper中,实现了OptionHelper的匿名类 在Main#options中,维护了Options对象
3.2.OptionHelper和Options
com/sun/tools/javac/util/Options.java和com/sun/tools/javac/main/OptionHelper.java两个类都是Option类的辅助类,
主要是一些集合的CRUD操作,读者有兴趣可以自行阅读。
4.总结
- 本文回顾了JVM前端编译器的规格。
- 本文分析了前端编译器的基础模块—javac的入口模块
- 本文分析了前端编译器的基础模块——参数配置模块