为啥要看javac源代码
前言
本文为javac 源码解析的第一篇,主要介绍了如下内如:
- 阅读javac源代码的好处
- 阅读javac源代码的储配知识
- build javac
- javac源代码结构说明
重要说明: javac是java的编译器,内容高深,非常人所能参透,本人也同样,写本文只为了交流,因此,诸位看客发现纰漏,请指出,点拨一下小弟,不甚感激.
阅读javac源代码的好处
阅读javac的好处如下:
- 能接触java的真实面貌
- 能更早的进入到java大神的行列
- 能够获取到更多面试机会
阅读javac源代码的储配知识
按照官方的说法是: javac读取按照java语法写成的源文件,同时生产字节码文件.其中java语法被The Java Language Specification (JLS) 所定义,字节码文件则被The Java Virtual Machine Specification (JVMS) 所定义. 同时,该编译器会处理注解,这是被Pluggable Annotation Processing API (JSR 269). 所定义的. 同样,该编译器还支持 the Java Compiler API (JSR 199). 因此,阅读javac所需要的知识也就很明白了:
- JLS
- JVMS
- (option) JSR 269
- (option) JSR 199
另外,既然是一个编译器,自然逃不过编译原理的范畴.
build javac
javac的源代码可以在如下地址中找到: javac源代码.下载下来后,按照 官方说明build说明 进行build即可.
不过,我这里采用的是build jdk的方式构建的.现说明如下:
- 在 下载链接 中下载openjdk 8 的源代码.
由于本人是在mac 上进行构建的,因此需要对源码做如下修改:
在hotspot/src/share/vm/code/relocInfo.hpp 中,将 datalen = 0 改为 datalen. 如图所示:
搜索 int datalen, 第 462 行,改为 int datalen = 0.如图所示:
在hotspot/src/share/vm/opto/loopPredicate.cpp中,将 _igvn.type(rng)->is_int() >= 0 改成 _igvn.type(rng)->is_int()->_lo >= 0 如图所示:
在hotspot/src/share/vm/runtime/virtualspace.cpp中,将 base() > 0 改成 base() != 0 如图所示:
修改 nashorn/make/BuildNashorn.gmk 中的 第 80 行 -cp 修改为 -Xbootclasspath/p . 如图所示:
然后,创建一个 envsetup.sh, 内容如下:
\# 设定语言选项,必须设置 export LANG=C \# Mac平台,C编译器不再是GCC,是clang export CC=gcc \# 跳过clang的一些严格的语法检查,不然会将N多的警告作为Error export COMPILER_WARNINGS_FATAL=false \# 链接时使用的参数 export LFLAGS='-Xlinker -lstdc++' \# 是否使用clang export USE_CLANG=true \# 使用64位数据模型 export LP64=1 \# 告诉编译平台是64位,不然会按32位来编译 export ARCH_DATA_MODEL=64 \# 允许自动下载依赖 export ALLOW_DOWNLOADS=true \# 并行编译的线程数,编译时间长,为了不影响其他工作,我选择为2 export HOTSPOT_BUILD_JOBS=2 export ALT_PARALLEL_COMPILE_JOBS=2 \# 是否跳过与先前版本的比较 export SKIP_COMPARE_IMAGES=true \# 是否使用预编译头文件,加快编译速度 export USE_PRECOMPILED_HEADER=true \# 是否使用增量编译 export INCREMENTAL_BUILD=true \# 编译内容 export BUILD_LANGTOOLS=true export BUILD_JAXP=false export BUILD_JAXWS=false export BUILD_CORBA=false export BUILD_HOTSPOT=true export BUILD_JDK=true \# 编译版本 export SKIP_DEBUG_BUILD=true export SKIP_FASTDEBUG_BUILD=false export DEBUG_NAME=debug \# 避开javaws和浏览器Java插件之类的部分的build export BUILD_DEPLOY=false export BUILD_INSTALL=false \# 加上产生调试信息时需要的 objcopy export OBJCOPY=gobjcopy
然后,执行 source envsetup.sh
进行build。
执行如下命令:
bash ./configure \ --with-target-bits=64 \ --with-debug-level=slowdebug --enable-debug-symbols \ ZIP_DEBUGINFO_FILES=0
执行命令:
make all
至此,就会看到build 成功的输出
进行测试,如图所示:
添加编译的jdk到eclipse中,如图所示:
创建一个java 项目,使用我们自己build的jdk.然后将javac的源代码赋值到该项目中, javac的源代码在 openjdk/langtools/src/share/classes/com/sun/tools 下.导入后,如图所示:
写两个类进行测试,代码如下:
import com.sun.tools.javac.main.Main; public class DebugEntryPoint {public static void main(String[] args) {Main m = new Main("fx_debug");m.compile(asArray("/Users/xxxxx/Documents/2017-03-22-brabch/javac-test/src/Demo.java"));}private static <T> T[] asArray(T... args) {return args;} }
public class Demo {public void foo() {char a = 'a';a += 32; // 可以通过} }
执行后,就可以看到会生成 Demo.class
javac源代码结构说明
用官方的一张图进行说明:
在com.sun.tools.javac下有如下几个包,现说明如下:
1. api –> 实现了JavaCompiler 和javax.tools中其他的api
2. code –> 定义了Java程序的语义元素的表示,如符号、作用域和类型,在javax.lang.model.*.中实现.
3.comp –> 编译器的主要处理阶段,如标记、流分析、“解语法糖”和擦除
4. file –> 使用java.nio.file 的api来访问本地的文件系统.
5. jvm –> 读取和写class文件,生成字节码
6. main –> 编译的主要驱动代码,提供了多样的编译步骤选项
7.model –> javax.lang.model.*. 的额外实现类
8.parser –> 读取java源文件生成语法树
9.processing –> 实现了在javax.annotation.processing.*定义的api
10.resources –> 信息本地化和版本信息的资源文件
11. tree –> 编译器的语法树的表示和实用类,实现了com.sun.source.*.中定义的api
12. util –> 工具类
参考链接
compiler-package-overview
compiler-README.html#build
compiler-index
在 macOS 上编译 OpenJDK 8
如何构建javac的调试环境
为啥要看javac源代码相关推荐
- 傲游浏览器怎么看网页源代码 网页源代码查看方法简述
网页源代码,顾名思义就是指在网页制作过程中需要用到的一些特殊的"语言",设计人员向通过对这些"语言"进行组织编排制作出网页,再由浏览器进行"翻译&qu ...
- 如何看懂源代码--(分析源代码方法) 1
如何看懂源代码--(分析源代码方法) -- 转载 作者: fandyst 出处: http://www.cnblogs.com/todototry/ 原文: https://www.cnblogs. ...
- 如何看懂源代码--(分析源代码方法)(转)
ps:近日,也在看别人写的框架,有点水雾缭绕的感觉,找到这篇好文,并分享之 摘自(繁体中文Traditional Chinese):http://www.ithome.com.tw/itadm/art ...
- (原创) 看电影 源代码 有感——量子力学的玄妙
有很多人说电影结尾停在那一吻就好了! 我觉得正是那一吻之后的最后几分钟,让电影上升了一个档次! 向观众展示了一下量子力学的玄妙!(实际上美国人还拍过一些展示量子力学的电影,比如科恩兄弟的<严肃的 ...
- 如何看懂源代码–(分析源代码方法)
我们在写程式时,有不少时间都是在看别人的代码.例如看小组的代码,看小组整合的守则,若一开始没规划怎么看, 就会"噜看噜苦(台语) " 不管是参考也好,从开源抓下来研究也好,为了了解 ...
- 看python源代码的顺序_查看“Python-2020-fall”的源代码
因为以下原因,您没有权限编辑本页: 您所请求的操作仅限于该用户组的用户使用:用户 您可以查看与复制此页面的源代码.== Python程序设计课程主页(2020年秋季学期) == Teacher: [h ...
- 互联网本来很简单,但为啥人们看的那么复杂
昨天有朋友问我互联网,说互联网怎么怎么创新. 我说你看到的都是像.佛说佛有十万身.这都是像,不是相. (1) 500多年前,意大利美第奇家族为了给教皇运送全欧洲信民们的捐赠,所以建立了一张天网一张地网 ...
- 怎样看python源代码-如何直接从IDE读取Python源代码
正如你所说,一大块python是用C语言编写的,但这些不包含在发行版中.因此,您无法从IDE中读取源代码.这些主要是编译源,这意味着解释器只使用字节码.并非所有函数都是用C语言编写的,其中大部分都是用 ...
- python pytorch fft_看PyTorch源代码的心路历程
1. 起因 曾经碰到过别人的模型prelu在内部的推理引擎算出的结果与其在原始框架PyTorch中不一致的情况,虽然理论上大家实现的都是一个算法,但是从参数上看,因为经过了模型转换,中间做了一些调整. ...
- Android之Eclipse下面如何看Android源代码
在看代码的时候,会经常用到 ctrl+鼠标左键 去看自己写的类,有时候点到java的类或者android的类就无法打开,显示no class found之类的东西, 1.拿Button举例,ctrl加 ...
最新文章
- HarmonyOS 设置图标在Text 旁边
- java基础相关知识
- 自定义手势解锁锁控件
- 带你看看获得鲁班奖的数据中心工程建设的有多完美!!
- hdu 4046 Panda 线段树
- SQL Server使用视图做权限控制
- javaWeb Note1
- puppet kick 功能
- 如何设计日志系统_架构 - 如何设计一个百亿级日志系统
- 通过rtcwake命令设置系统S3(休眠到内存)/S4(挂起到硬盘)一段时间后自动唤醒
- 亿佰特物联网通信专家:蓝牙模块和 Zigbee协议模块的区别
- 源码mysql5.7安装过程_mysql5.7 源码安装步骤
- 大数据职业理解_大数据带给我们职业三大根本改变
- python变量分类_Python 入门系列 —— 5. 三大变量类型介绍
- 【转】linux命令:ifconfig命令
- ubuntu 开源镜像_Ubuntu手机可能对开源意味着什么
- python表白代码-520使用Python实现quot;我爱你”表白
- 波士顿房价数据集 Boston house prices dataset
- Linux打印服务-CUPS的安装、配置和使用
- 去百度还是去创新工厂? 信开复还是信彦宏?