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规范的代码。
一般编辑的过程是:将源文件---->目标文件-----> 可执行文件(机器码)
编译阶段:
前端包括词法分析、词法分析、语义分析,以及相关的错误处理和符号表的建立.前端依赖于源程序并在很大程度上独立于目标机器。
后端主要包括代码优化、代码生成和相关错误处理.后端依赖于目标机器。后端处理对象是由前端产生的结果,即中间代码.
Java语言的编译采用的是前端后端方式。前端生成与平台无关的字节码.后端是由与平台有关的解释器对所生成的字节码文件进行解释执行.
编译的若干阶段通常是以一遍来实现的,每遍读一次输入文件、产生一个输出文件。
javac编译过程的更多相关文章
- javac 编译过程
javac 编译过程 一.解析与填充符号表: 1. 语法.此法分析: a) 语法分析:将源代码字符流转换为标记(Token:编译过程最小元素)集合. b) ...
- OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式
在阅读Javac源码的过程中,发现一个上下文对象Context. 这个对象用来确保一次编译过程中的用到的类都只有一个实例,即实现我们经常提到的"单例模式". 今天,特意对这个上下文 ...
- OpenJDK源码研究笔记(十一):浅析Javac编译过程中的抽象语法树(IfElse,While,Switch等语句的抽象和封装)
浅析OpenJDK源码编译器Javac的语法树包com.sun.source.tree. 抽象语法树,是编译原理中的经典问题,有点难,本文只是随便写写. 0.赋值语句 public interface ...
- javac 编译与 JIT 编译
编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...
- Javac编译和JIT编译
编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...
- Javac编译与JIT编译
本文转载自:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的 ...
- 【深入Java虚拟机】之七:Javac编译与JIT编译
转载请注明出处:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理 ...
- java编译过程(字节码编译和即时编译)
Javac编译与JIT编译 简介: 编译包括两种情况: 1,源码编译成字节码 2,字节码编译成本地机器码(符合本地系统专属的指令) 解释执行也包括两种情况: 1,源码解释执行 2,字节码解释执行 解释 ...
- Java虚拟机 - Javac编译与JIT编译
[深入Java虚拟机]之七:Javac编译与JIT编译 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤 ...
随机推荐
- python学习小结2:if和while控制语句
if语句 if语句中,代码块是按缩进的空格数量来判断的,也就是说空格数量一致的相邻行会被当作一个代码块,当if的条件成立的时候它就会得到执行. x = 100 if x > 50: print ...
- Java 8 VM GC Tuning Guide Charter3-4
第三章 Generations One strength of the Java SE platform is that it shields the developer from the compl ...
- android 有时候stroke不起作用
如下: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android=&quo ...
- C# WinForm开发系列 - ZedGraph
ZedGraph是用于创建任意数据的二维线型.条型.饼型图表的一个类库,也可以作为Windows窗体用户控件和Asp.Net网页控件.这个类库具有高度的适应性,几乎所有式样的图表都能够被创建.这个类库 ...
- iOS开发之数据存取2-CoreData后台查询数据
注意:本人所讲的后台查询必须在使用CoreData时选择存储类型为“SQLite”,因为二进制或者XML存储方式会在打开的时候直接读到内存中. 1.CoreData数据后台查询出现的情况 CoreDa ...
- C# 连接Oracle数据库
最近项目要用Oracle数据库,之前没搞过,近2天遇到好多问题,现在总结一下,做个备份. 一.关于Oracle安装 1.服务器端 从Oracle官网下载文件,file1和file2,解压之后安装就行了 ...
- oracle 表空间 用户
Oracle创建表空间.创建用户以及授权.查看权限 创建临时表空间 CREATE TEMPORARY TABLESPACE test_temp TEMPFILE 'C:\oracle\product\ ...
- DllImport的具体用法
现在是更深入地进行探讨的时候了.在对托管代码进行 P/Invoke 调用时,DllImportAttribute 类型扮演着重要的角色.DllImportAttribute 的主要作用是给 CLR 指 ...
- hdu 4038 Stone
思路: 如果负数的个数为偶数则不必改变,为奇数就将最大负数变为正: 对于正数,尽量将1,2变为3即可. 代码如下: #include<cstring> #include<iostre ...
- GitHub 开源工具整理
技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 ...