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学习笔记30(全局变量的两种解决办法)
先看程序: >>> count = 0 >>> def fuc(count): print count count +=1 >>> for i i ...
- 20145120 《Java程序设计》实验一实验报告
20145120 <Java程序设计>实验一实验报告 实验名称:Java开发环境的熟悉 实验目的与要求: 1.使用JDK编译.运行简单的Java程序:(第1周学习总结) 2.编辑.编译.运 ...
- 10.30Daily Scrum
出席人员 任务分配完成情况 明天任务分配 王皓南 研究代码,讨论实现方法及实现的动能 研究代码,学习相应语言,讨论设计思路 申开亮 研究代码,讨论实现方法及实现的动能 研究代码,学习相应语言,讨论设计 ...
- 1996: [Hnoi2010]chorus 合唱队 - BZOJ
Description Input Output Sample Input41701 1702 1703 1704Sample Output8HINT 水题,区间dp,f[l,r,k]表示区间[l,r ...
- sed 详解
sed 详解 1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕 ...
- Eclipse 创建Maven工程
前言 开发环境 sts-3.7.2.RELEASE 创建步骤 1.开启eclipse,右键new——>other,如下图找到maven project 2.选择maven project,显示创 ...
- 【树形DP/搜索】BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会
1827: [Usaco2010 Mar]gather 奶牛大集会 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 793 Solved: 354[Sub ...
- 【POJ】【1739】Tony's Tour
插头DP 楼教主男人八题之一! 要求从左下角走到右下角的哈密顿路径数量. 啊嘞,我只会求哈密顿回路啊……这可怎么搞…… 容易想到:要是把起点和重点直接连上就变成一条回路了……那么我们就连一下~ 我们可 ...
- C# 读取枚举描述信息实例
using System;using System.Collections;using System.Collections.Generic;using System.Linq;using Syste ...
- 用户 IIS APPPOOL\DefaultAppPool 登录失败的解决方法
解决方案 1.先查看你的网站使用的是哪个应用程序池 2.设置应用程序池的选项 3.标识选项 选LocalSystem或NetworkService就可以解决问题