码迷,mamicode.com
首页 > 其他好文 > 详细

第一章

时间:2018-09-23 12:01:18      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:article   mac   tail   rac   alt   openjdk   log   resource   tree   

 

 

1、Javac概述 

编译器可以将编程语言的代码转换为其他形式,如Javac,将Java语言转换为虚拟机能够识别的.class文件形式。而这种将java源代码(以.java做为文件存储格式)转换为class文件格式的过程一般也称为编译器的前端。要将字节码变为机器码还需要后端编译器,如JIT编译器(Just In Time Compiler)。或者还可以通过AOT编译器直接将Java源代码编译为本地机器代码。本书涉及的主要内容就是Sun的Javac编译器。 

 在转换的过程中自然要遵循各种各样的规范,涉及到的主要的规范有:

(1)java语法规范The Java Language Specification (JLS)

(2)虚拟机规范 The Java Virtual Machine Specification (JVMS) 所定义

(3)同时,该编译器会处理注解,这是被Pluggable Annotation Processing API (JSR 269). 所定义的. 同样,该编译器还支持 the Java Compiler API (JSR 199)

Javac将Java源代码转变为字节码的过程中涉及到词法分析、语法分析、语义分析及代码生成等阶段,如下图所示。

技术分享图片 

 

(1)词法分析

词法分析的主要作用就是将源码转换为Token流,如下示例。 

package compile; 
package->PACKAGE
compile->IDENTIFIER
;->SEMI

public class TJavac { String v = "helloworld!"; }
public->IDENTIFIER
class ->CLASS
TJavac->IDENTIFIER
{->BRACE
String->STRING
v->IDENTIFIER
=->EQ
"helloworld!"->STRINGLITERAL
;->SEMI
}->	RBRACE	

 

可以看到,词法分析过程将Java源代码按照Java关键字、自定义关键字、符号等按顺序分解为了可识别的Token流。

 

(2)语法分析

将进行词法分析后形成的Token流中的Token组合成遵循Java语法规范的语法节点,形成一颗基本的语法树。如下图所示。

 

(3)语义分析

语义分析过程最为复杂,这个过程涉及到的细节众多,除了对代码编写者写出的代码根据JLS规范进行严格的检查外,还必须为后面的代码生成阶段准备各种数据,如符号表、标注抽象语法树节点的符号及类型等。上面例子中是否可将常量字符串"helloworld!"赋值给类型为String的变量v也是在这一阶段做校验。

 

(4)代码生成 

将语义分析后的注解语法树转化成字节码,并将字节码写入*.class文件。

  • 将java的代码块转化为符合JVM语法的命令形式,这就是字节码,然后
  • 按照JVM的文件组织格式将字节码输出到*.class文件中

 

 

 

2、Javac源码与调试 

首先需要下载openJDK源码,本书涉及的源码都是基于JDK7的,所以读者也可以到https://download.java.net/openjdk/jdk7下载源代码的zip包,下载的包为

openjdk-7-fcs-src-b147-27_jun_2011.zip 

解压后在openjdk/langtools/src/share/classes/com/sun/tools路径下找到javac,在Eclipse中创建一个java项目,然后将javac的源代码复制到该项目中, 如图所示:

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 –> 工具类

 

参考文章:https://blog.csdn.net/qq_26000415/article/details/82254426 

 

4、Javac支持命令及相关实现

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第一章

标签:article   mac   tail   rac   alt   openjdk   log   resource   tree   

原文地址:https://www.cnblogs.com/extjs4/p/9691900.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!