# Compiler_javac **Repository Path**: BinGo2014_admin/compiler_javac ## Basic Information - **Project Name**: Compiler_javac - **Description**: JAVAC源码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-02-02 - **Last Updated**: 2024-02-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: jvm, openjdk, 源码, javac, javac编译器 ## README # JAVAC源码 ## 1 介绍 > 分析源码是了解一项技术的实现内幕最彻底的手段,Javac编译器不像HotSpot虚拟机那样使用C++语言(包含少量C语言)实现,它本身就是一个由Java语言编写的程序,这为纯Java的程序员了解它的编译过程带来了很大的便利。 > 在JDK 6以前,Javac并不属于标准Java SE API的一部分,它实现代码单独存放在tools.jar中,要在程序中使用的话就必须把这个库放到类路径上。在JDK 6发布时通过了JSR 199编译器API的提案,使得Javac编译器的实现代码晋升成为标准Java类库之一,它的源码就改为放在JDK_SRC_HOME/langtools/src/share/classes/com/sun/tools/javac中 [1] 。到了JDK 9时,整个JDK所有的Java类库都采用模块化进行重构划分,Javac编译器就被挪到了jdk.compiler模块(路径为:JDK_SRC_HOME/src/jdk.compiler/share/classes/com/sun/tools/javac)里面。虽然程序代码的内容基本没有变化,但由于本节的主题是源码解析,不可避免地会涉及大量的路径和包名,这就要选定JDK版本来讨论了,本次笔者将会以JDK 9之前的代码结构来进行讲解。 > Javac编译器除了JDK自身的标准类库外,就只引用了JDK_SRC_HOME/langtools/src/share/classes/com/sun/*里面的代码,所以我们的代码编译环境建立时基本无须处理依赖关系,相当简单便捷。以Eclipse IDE作为开发工具为例,先建立一个名为“Compiler_javac”的Java工程,然后把JDK_SRC_HOME/langtools/src/share/classes/com/sun/*目录下的源文件全部复制到工程的源码目录中 ## 2 源码下载 javac的源码只在OpenJDK中才包含,下载链接如下:[https://download.java.net/openjdk/jdk8u43/ri/openjdk-8u43+b03_src.zip](https://download.java.net/openjdk/jdk8u43/ri/openjdk-8u43+b03_src.zip) ## 3 运行示例 导入了Javac的源码后,就可以运行com.sun.tools.javac.Main的main()方法来执行编译了,可以使用的参数与命令行中使用的Javac命令没有任何区别,编译的文件与参数在Idea的“Run/Debug Configurations”面板中的“Arguments”页签中指定。 注意指明需要编译源代码的路径: ![img.png](image/img.png) ![img.png](image/img3.png) 执行完后会生成 `Test.class` 字节码文件 ![img.png](image/img2.png) ## 4 通过以上示例,即可阅读源码,跟踪`javac`的执行流程 ## 5 Test.java 需要被编译的源码示例 ```java public class Test { public static void main(String[] args) { System.out.println("hello world"); } } ```