前言

本文为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所需要的知识也就很明白了:

  1. JLS
  2. JVMS
  3. (option) JSR 269
  4. (option) JSR 199

另外,既然是一个编译器,自然逃不过编译原理的范畴.

build javac

javac的源代码可以在如下地址中找到: javac源代码.下载下来后,按照 官方说明build说明 进行build即可.

不过,我这里采用的是build jdk的方式构建的.现说明如下:

  1. 在 下载链接 中下载openjdk 8 的源代码.
  2. 由于本人是在mac 上进行构建的,因此需要对源码做如下修改:

    1. 在hotspot/src/share/vm/code/relocInfo.hpp 中,将 datalen = 0 改为 datalen. 如图所示:

      搜索 int datalen, 第 462 行,改为 int datalen = 0.如图所示:

    2. 在hotspot/src/share/vm/opto/loopPredicate.cpp中,将 _igvn.type(rng)->is_int() >= 0 改成 _igvn.type(rng)->is_int()->_lo >= 0 如图所示:

    3. 在hotspot/src/share/vm/runtime/virtualspace.cpp中,将 base() > 0 改成 base() != 0 如图所示:

    4. 修改 nashorn/make/BuildNashorn.gmk 中的 第 80 行 -cp 修改为 -Xbootclasspath/p . 如图所示:

  3. 然后,创建一个 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

  4. 进行build。

    1. 执行如下命令:

      bash ./configure \
      --with-target-bits=64 \
      --with-debug-level=slowdebug --enable-debug-symbols \
      ZIP_DEBUGINFO_FILES=0
    2. 执行命令:

      make all

    至此,就会看到build 成功的输出

  5. 进行测试,如图所示:

  6. 添加编译的jdk到eclipse中,如图所示:

  7. 创建一个java 项目,使用我们自己build的jdk.然后将javac的源代码赋值到该项目中, javac的源代码在 openjdk/langtools/src/share/classes/com/sun/tools 下.导入后,如图所示:

  8. 写两个类进行测试,代码如下:

    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源代码相关推荐

  1. 傲游浏览器怎么看网页源代码 网页源代码查看方法简述

    网页源代码,顾名思义就是指在网页制作过程中需要用到的一些特殊的"语言",设计人员向通过对这些"语言"进行组织编排制作出网页,再由浏览器进行"翻译&qu ...

  2. 如何看懂源代码--(分析源代码方法) 1

    如何看懂源代码--(分析源代码方法)  -- 转载 作者: fandyst 出处: http://www.cnblogs.com/todototry/ 原文: https://www.cnblogs. ...

  3. 如何看懂源代码--(分析源代码方法)(转)

    ps:近日,也在看别人写的框架,有点水雾缭绕的感觉,找到这篇好文,并分享之 摘自(繁体中文Traditional Chinese):http://www.ithome.com.tw/itadm/art ...

  4. (原创) 看电影 源代码 有感——量子力学的玄妙

    有很多人说电影结尾停在那一吻就好了! 我觉得正是那一吻之后的最后几分钟,让电影上升了一个档次! 向观众展示了一下量子力学的玄妙!(实际上美国人还拍过一些展示量子力学的电影,比如科恩兄弟的<严肃的 ...

  5. 如何看懂源代码–(分析源代码方法)

    我们在写程式时,有不少时间都是在看别人的代码.例如看小组的代码,看小组整合的守则,若一开始没规划怎么看, 就会"噜看噜苦(台语) " 不管是参考也好,从开源抓下来研究也好,为了了解 ...

  6. 看python源代码的顺序_查看“Python-2020-fall”的源代码

    因为以下原因,您没有权限编辑本页: 您所请求的操作仅限于该用户组的用户使用:用户 您可以查看与复制此页面的源代码.== Python程序设计课程主页(2020年秋季学期) == Teacher: [h ...

  7. 互联网本来很简单,但为啥人们看的那么复杂

    昨天有朋友问我互联网,说互联网怎么怎么创新. 我说你看到的都是像.佛说佛有十万身.这都是像,不是相. (1) 500多年前,意大利美第奇家族为了给教皇运送全欧洲信民们的捐赠,所以建立了一张天网一张地网 ...

  8. 怎样看python源代码-如何直接从IDE读取Python源代码

    正如你所说,一大块python是用C语言编写的,但这些不包含在发行版中.因此,您无法从IDE中读取源代码.这些主要是编译源,这意味着解释器只使用字节码.并非所有函数都是用C语言编写的,其中大部分都是用 ...

  9. python pytorch fft_看PyTorch源代码的心路历程

    1. 起因 曾经碰到过别人的模型prelu在内部的推理引擎算出的结果与其在原始框架PyTorch中不一致的情况,虽然理论上大家实现的都是一个算法,但是从参数上看,因为经过了模型转换,中间做了一些调整. ...

  10. Android之Eclipse下面如何看Android源代码

    在看代码的时候,会经常用到 ctrl+鼠标左键 去看自己写的类,有时候点到java的类或者android的类就无法打开,显示no class found之类的东西, 1.拿Button举例,ctrl加 ...

最新文章

  1. HarmonyOS 设置图标在Text 旁边
  2. java基础相关知识
  3. 自定义手势解锁锁控件
  4. 带你看看获得鲁班奖的数据中心工程建设的有多完美!!
  5. hdu 4046 Panda 线段树
  6. SQL Server使用视图做权限控制
  7. javaWeb Note1
  8. puppet kick 功能
  9. 如何设计日志系统_架构 - 如何设计一个百亿级日志系统
  10. 通过rtcwake命令设置系统S3(休眠到内存)/S4(挂起到硬盘)一段时间后自动唤醒
  11. 亿佰特物联网通信专家:蓝牙模块和 Zigbee协议模块的区别
  12. 源码mysql5.7安装过程_mysql5.7 源码安装步骤
  13. 大数据职业理解_大数据带给我们职业三大根本改变
  14. python变量分类_Python 入门系列 —— 5. 三大变量类型介绍
  15. 【转】linux命令:ifconfig命令
  16. ubuntu 开源镜像_Ubuntu手机可能对开源意味着什么
  17. python表白代码-520使用Python实现quot;我爱你”表白
  18. 波士顿房价数据集 Boston house prices dataset
  19. Linux打印服务-CUPS的安装、配置和使用
  20. 去百度还是去创新工厂? 信开复还是信彦宏?

热门文章

  1. 一个前端报表设计器的设计分析
  2. Lambda表达式的练习1
  3. 微信小程序防抖功能的实现
  4. C语言:带你轻松干掉 腾讯笔试大题 带环链表
  5. chunxunnet
  6. 寒江独钓windows 内核安全编程学习笔记(双机调试)
  7. pythonalist是什么意思_3. Python3轻食丨一个故事看懂List所有用法:1年级1班的班级生活...
  8. USRPx310的射频板UBX160
  9. Reflection in Java
  10. 在cmd的命令下 用Mysql中建立一个表