class文件的编译过程

编译器主要分为3类:前端编译器、JIT编译器、AOT编译器

前端编译器:把*.Java文件转变成*.class文件——Sun的Javac

JIT编译器:就是即时编译器,将class文件转变成机器码的过程——HotSpotVM的C1、C2

AOT编译器:直接把*.java文件编译成本地代码的过程——Excelsior JET

Javacde 编译过程主要分为以下3种

①解析与填充符号的过程

1.词法、语法分析

词法分析是将源代码的字符流转变为标记集合(单个字符是程序编写过程的最小元素、而标记则是编译过程的最小元素,关键字、变量名、字面量都可以成为标记)

如int a=b+2;包含了6个标记

语法分析是根据标记序列构造抽象语法树的过程(语法树的每一个节点都代表着程序序列中的一个语法结构,如包、类型、修饰符)

2.填充符号表

符号表是由一组符号地址和符号信息构成的表格,可以将符号表想象成哈希表中K-V值对的形式(实际上不一定是哈希表的信息,可以是有序符号表、树状符号表、栈结构符号表等)

在语义分析中,符号表所登记的内容将用于语义检查和产生中间代码

在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据

②插入式注解处理器的注解处理过程

在JDK1.6中,提供了一组插入式注解处理器的标准API在编期间对注解进行处理,可以将它看作是编译器的插件,这些插件可以读取、修改、添加抽象语法树中的任意元素。当这些插件在注解处理期间对语法树进行修改,编译器将回到解析及填充符号表的过程重新处理,直到所有的插入式注解处理器都没有再对语法树进行修改为止。

③分析与字节码生成过程

语义分析的主要任务:对结构上正确的源程序进行上下文有关性质的审查,如进行类型审查。

1.标注检查

标注检查:检查的内容包括变量使用前是否已被声明、变量与赋值之间的数据类型是否匹配等,其中一个重要的动作称为常量折叠,如int a=1+1,折叠之后就变为int a=2.

2.数据及控制流分析

数据及控制流分析是对程序上下文逻辑更进一步的验证,他可以检验出诸如程序局部变量在使用前是否有赋值、方法的每条路径是否都有返回值、是否所有的受检查异常都被正确处理了等问题。编译期间的数据及控制流分析与类加载时的数据及控制流分析的目的基本一致,但校验范围有所区别,有一些校验项只有在编译期或运行期才能运行。如将局部变量声明为final,对运行期是没有影响的,变量的不变性仅仅由编译器在编译期间保证。

3.解语法糖

Java中最常用的语法糖主要是:泛型、变长参数、自动装箱和拆箱等,在编译阶段还原回简单的基础语法结构,该过程称为解语法糖

4.字节码生成

字节码生成阶段不仅仅把前面各个步骤所生成的信息(语法树、符合表)转化成字节码写到磁盘中去,编译器还添加了少量的代码和转换工作。如实例构造器<init>()方法和<clinit>()方法,就是在该过程添加到语法树之中。完成语法树的遍历和调整后,就会把填充了所有的符号交给ClassWrite类,生成字节码。

时间: 2024-10-07 18:20:48

class文件的编译过程的相关文章

[转]c++应用程序文件的编译过程

原文地址 这里讲下C++文件的编译过程及其中模板的编译过程: 一:一般的C++应用程序的编译过程.    一般说来,C++应用程序的编译过程分为三个阶段.模板也是一样的. 在cpp文件中展开include文件. 将每个cpp文件编译为一个对应的obj文件. 连接obj文件成为一个exe文件(或者其它的库文件). 下面分别描述这几个阶段.1.include文件的展开.    include文件的展开是一个很简单的过程,只是将include文件包含的代码拷贝到包含该文件的cpp文件(或者其它头文件)

【转】 Apk文件及其编译过程

Apk文件概述 Android系统中的应用程序安装包都是以apk为后缀名,其实apk是Android Package的缩写,即android安装包. 注:apk包文件其实就是标准的zip文件,可以直接用解压缩软件解开.Apk包中的内容 解压缩一个apk文件后,目录结构一般如下: *.apk ├-res │ ├+layout │ └+drawable ├-META-INF │ ├-MANIFEST.MF │ ├-CERT.SF │ └-CERT.RSA ├-resources.arsc ├-cla

2.4、uboot配置和编译过程详解

2.4.1.uboot主Makefile分析1 2.4.1.1.uboot version分析 (1)uboot版本号分为3个级别: VERSION:主版本号 PATCHLEVEL:次版本号 SUBLEVEL:再次版本号 EXTRAVERSION:另外附加的版本信息 这四个用.隔开共同构成了最终的版本号. (2)Makefile中版本号最终生成了一个变量U_BOOT_VERSION,这个变量记录了Makefile中配置的版本号 (3)include/version_autogenerated.h

uboot主Makefile分析(t配置和编译过程详解)

1.编译uboot前需要三次make make distcleanmake x210_sd_configmake -j4 make distclean为清楚dist文件. make x210_sd_config  跳转执行mkconfig用来配置并生成config.mk(board/samsung/x210目录下为指定链接地址的与主uboot目录的config.mk不同) autuconfig.mk 2.框图 3.uboot主Makefile分析 3.1.uboot version确定(Make

uboot配置和编译过程详解【转】

本文转载自:http://blog.csdn.net/czg13548930186/article/details/53434566 uboot主Makefile分析1 1.uboot version确定(Makefile的24-29行) Makefile代码部分: [plain] view plain copy VERSION = 1 PATCHLEVEL = 30 SUBLEVEL = 4 EXTRAVERSION = U_BOOT_VERSION = $(VERSION).$(PATCHL

Linux下多个.c文件的编译和Makefile文件

在编程的时候,我们可以把一个完整程序的每个函数分离出来,写成.c文件,最后再一起编译和链接.这样有利于程序功能模块化,也方便检查代码错误. .h文件:里面编辑该程序需要引用的头文件. #ifndef  /#define / #endif : 防止该头文件被重复引用. 整体用法: #ifndef  A_H             //如果没有a.h文件,#define A_H.如果有,结束定义 #define  A_H            //定义a.h文件 定义a.h需要的头文件 #endif

c++编译过程理解

1.Makefile就知道了.先直接用命令行操作,然后用集成的IDE来写代码. 2.对于编译过程,总体上是这样 <1>源代码(*.h,*.cpp/c)经过预编译,编译,生成目标文件(Windows下应该是.obj文件,Linux/unix下是.o文件) <2>然后通过链接(将各种目标文件.obj(.o) 和 目标文件的集合(动态静态库dll(windows下),so(linux/unix下))) <3>最终成功可执行文件(Windows下叫exe,Linux/unix下

uboot配置和编译过程详解

一.uboot主Makefile分析 1.uboot version确定(Makefile的24-29行) include/version_autogenerated.h文件是编译过程中自动生成的一个文件,所以源目录中没有,但是编译过后的uboot中就有了 2.HOSTARCH和HOSTOS HOSTARCH:表示主机的CPU的架构,值会影响后面的CROSS_COMPILE环境变量的值.HOSTOS:主机 3.静默编译(50-54行) 不希望看到这些编译信息,就后台编译即可.这就叫静默编译. 4

编译过程中,termcap.h 文件找不到路径 licli.a终于生成

编译过程中,termcap.h      文件找不到路径 查看是linux  源码下找不到termcap.h文件 安装了所有关于*cap*的源码包也不起作用 今天终于解决了这个问题,搜termcap.h  发现一篇文章,如下 ----------------------------------------------------------------------------------------- 安装minicom2.3出现termcap.h错误解决方法 2010-05-06 17:12: