javac编译过程

编译器把一种语言规范转化为另一种语言规范的这个过程需要哪些步骤:

(1) 词法分析:读取源代码,一个字节一个字节的读进来,找出这些词法中哪些是我们定义的语言关键词如:if  else where 等 识别哪些if是合法的哪些是不合法的。

词法分析的结果:就是从源代码中找出一些规范化的token流,就像人类语言中,给你一句话你要分辨出哪些是一个词语,哪些是标点符号,哪些是动词,哪些是名词。

(2) 语法分析:就是在词法分析中得到的token流进行语言分析,这一步就是检查这些关键词组合在一起是不是符合java语言规范。如if的后面是不是紧跟着一个布尔型判断表达式。

语法分析的结果:就是形成一个符合java语言规定的抽象语法树,抽象语法树是一个结构化的语法表达形式,它的作用是把语言的主要词法用一个结构话的形式组织在一起。这棵语法树可以被我们后面按照新的规则再重新组织。

(3)语义分析:语法分析完成之后也就不从在语法问题了,语义分析的主要工作就是把一些难懂的,复杂的语法转化成更简单的语法。就如难懂的文言文转化为大家都懂的百话文,或者是注释一下一些不懂的成语。

语义分析结果:就是将复杂的语法转化为简单的语法对应到java就是将foreach转化为for,还有一些注释等。最后生成一棵抽象的语法树,这棵语法树也就更接近目标语言的语法规则。

(4)代码生成: 将会根据经过注释的抽象语法树生成字节码,也就是将一个数据结构转化为另外一个数据结构。就像将所有的中文词语翻译成英文单词后按照英文语法组装文英文语句。

代码生成器的结果就是生成符合java虚拟机规范的字节码。

代码生成器的结果就是生成符合java虚拟机规范的字节码。这个过程中的需要的组件有:

总结:

从上面的描述中我们知道编译就是将一种语言通过分析分解在按照一定的方式先形成一个简单的框架(将java源文件的字节流转化为对应的token流)然后
在通过详细的分析按照一定的规定在这个框架里添加东西使这个token流形成更加结构化的语法树(就是将前面生成的token流中的一个个单词组装成一句
话),但是这棵树我们的目标java字节码还有点差距所以在进行语义分析使那颗粗糙的树更加完整完善(给类添加默认的构造函数,检查变量在使用前有没有初
始化,检查操作变量类型是否匹配)然后javac(编译器)调用com.sun.tools.javac.jvm.Gen类遍历这棵语法树将java方法
中的代码块转换成符合JVM语法的命令形式,JVM的操作是通过入栈和出栈来完成。按照JVM的文件组织格式将字节码输出到以class为扩展名的文件
中,也就是生成最终的java字节码。

简单理解: 词法分析就是将关键词组织成token流即检查源码中的的关键词是否真确并组织成token流,而语法分析就是检查源码是否符合java
语法规范并将词组成语句。语义分析就是简化复杂的添加缺少的,检查变量类型是否合法。代码生成器就是遍历这棵树生成符合JVM规范的代码。

一般编辑的过程是:将源文件---->目标文件-----> 可执行文件(机器码)

时间: 2024-10-14 00:36:47

javac编译过程的相关文章

Javac编译和JIT编译

编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如JavaScript),而下面的那条分支就是传统编译原理中从源代码到目标机器代码的生成过程. 如今,基于物理机.虚拟机等的语言,大多都遵循这种基于现代经典编译原理的思路,在执行前先对程序源码进行词法解析和语法解析处理,把源码转化为抽象

【深入Java虚拟机】之七:Javac编译与JIT编译

转载请注明出处:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如JavaScript),而下面的那条分支就是传统编译原理中从源代码到目标机器代码的生成过程. 如今,基于物理机

javac 编译与 JIT 编译

编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如 JavaScript),而下面的那条分支就是传统编译原理中从源代码到目标机器代码的生成过程. 如今,基于物理机.虚拟机等的语言,大多都遵循这种基于现代经典编译原理的思路,在执行前先对程序源码进行词法解析和语法解析处理,把源码转化为抽

【转】 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

java和javac编译运行java程序

目录 目录 前言 编译命令介绍 javac java 代码编译与运行 java类发现规则 分离class和java文件 参考链接 前言 给自己定了一个月学习JVM虚拟机的计划,不管有没有卵用,学点新东西总是好的. 但是在学习过程中,我想在命令行测试一些JVM参数的时候,发现自己脱离了IDE,竟然无法直接编译java程序!! 我的原则不能抱怨太多,像个Loser,不会的就花时间补回来. 下面,主要是总结一些如何在命令行中编译java程序.主要是想记录总结一下java的类发现原则. 编译命令介绍 其

Android源码下载和编译过程

这是我在编译android源码时整理记录的编译步骤和错误解决方法,期间参考了一些网上的博客和教程. 第一步: 安装ubuntu12.04,分配一盘空间50G,2G内存.如果分配1G内存编译时将报错.(我是在虚拟机中安装ubuntu,分配了50G空间,编译源码需要空间较大,建议分配50G或更多,使用wubi安装最大只能分配30G). 第二步: 安装JDK,此处选用JDK版本为JDK6-6u29 32位,下载链接http://www.oracle.com/technetwork/java/javas

【转】android程序编译过程

现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统.自动生成发布文件等等.这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的每一步都做了什么,需要什么环境和工具,输入和输出是什么.那么我们就来挖掘一下Android的编译过程中的细节. 首先,我们假定你的系统(什么系统都行,不限于Linux还是Windows系统,当然,我在这里默认使用Linux系统来举例子,但在 Windows中几乎没有什么差别)已经安装了JDK和Android SDK.再假

Android工程的编译过程

现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统.自动生成发布文件等等.这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的每一步都做了什么,需要什么环境和工具,输入和输出是什么.那么我们就来挖掘一下Android的编译过程中的细节. 首先,我们假定你的系统(什么系统都行,不限于Linux还是Windows系统,当然,我在这里默认使用Linux系统来举例子,但在 Windows中几乎没有什么差别)已经安装了JDK和Android SDK.再假

javac编译原理(一)

我们都知道,计算机只能识别二进制语言,是不能直接识别java c c++等高级语言的.将高级语言转化成计算机可以是别的二进制语言,这个过程就叫编译. 有次面试,面试官问了一道“java的编译原理是什么”,当时给懵了,只知道是把java文件转换成class文件,然后由jvm执行,具体流程就不知道了.今天看了许令波编著的<深入分析java web技术内幕>一书,其中有一章讲的就是javac的编译原理,看了一遍,感觉有点云里雾里,不是很明白,接下还得多看看几遍,多上网查查资料深入透彻的学习一下. 今