javac编译原理(一)
我们都知道,计算机只能识别二进制语言,是不能直接识别java c c++等高级语言的。将高级语言转化成计算机可以是别的二进制语言,这个过程就叫编译。
有次面试,面试官问了一道“java的编译原理是什么”,当时给懵了,只知道是把java文件转换成class文件,然后由jvm执行,具体流程就不知道了。今天看了许令波编著的《深入分析java web技术内幕》一书,其中有一章讲的就是javac的编译原理,看了一遍,感觉有点云里雾里,不是很明白,接下还得多看看几遍,多上网查查资料深入透彻的学习一下。
今天先将javac编译的整体流程总结一下,然后再仔细分析学习各个流程的细节。
编译器是将源码编译成目标机器码,即计算机可以识别的二级制码,也即cpu执行的指令集合。而javac编译器和c c++ 汇编语言等不太一样的地方,是javac是将java这种高级语言编译成java虚拟机(Jvm)能够识别的一种语言,然后再由jvm将jvm语言转换当前机器能够识别的机器语言,这就是java可以跨平台的最根本原因。javac的任务是将java源码编译成java字节码,也是通常说的将.java文件转化成.class文件。
javac编译的基本流程:
1、词法分析
读取源代码,一个字节一个字节的读取,找出其中我们定义好的关键字(如java中的if else for等关键字,识别哪些if是合法的关键字,哪些不是),这就是词法分析器进行词法分析的过程,其结果是从源代码中找出规范化的Token流。
2、语法分析
通过语法分析器对词法分析后Token流进行语法分析,这一步检查这些关键字组合再一次是否符合java语言规范(如在if后面是不是紧跟着一个布尔判断表达式),词法分析的结果是形成一个符合java语言规范的抽象语法树。
3、语义分析
通过语义分析器进行语义分析。语音分析主要是将一些难懂的、复杂的语法转化成更加简单的语法,结果形成最简单的语法(如将foreach转换成for循环 ,注解等),最后形成一个注解过后的抽象语法树,这个语法树更为接近目标语言的语法规则。
4、生成字节码
通过字节码生产器将经过注解的抽象语法树转化成符合jvm规范的字节码。
javac的主要模块有4个,分别是词法分析器、语法分析器、语义分析器、代码生成器。
javac编译原理(一)的更多相关文章
- 第二章 Javac编译原理
注:本文主要记录自<深入分析java web技术内幕>"第四章 javac编译原理" 1.javac作用 将*.java源代码文件转化为*.class文件 2.编译流程 ...
- Knowledge Point 20180303 对比编译器、解释器与Javac编译原理
编译器与Javac编译原理 在前文我们知道了Java是一种编译语言和解释语言,它的源代码经过编译器Javac编译为能够被JVM识别的二进制语言,然后JVM将其解释为能够被平台识别的机器语言.那么什么是 ...
- Javac编译原理 《深入分析java web 技术内幕》第四章
javac编译的四个主要的流程: 词法分析器:将源码转换为Token流 将源代码划分成一个个Token(找出java语言中的关键字) 语法分析器:将Token流转化为语法树 将上述的一个个Token组 ...
- 第四章 Javac编译原理
4.1 Javac是什么 是一种编译器,将JAVA源代码(.java文件)语言先转化成JVM能够识别的一种语言(.class文件),然后由JVM将JVM语言再转化成当前机器可以识别的机器语言. 4.2 ...
- 第四章 Javac编译原理(待续)
Javac是什么 Javac编译器的基本结构 Javac工作原理分析 设计模式解析之访问者模式
- Javac 编译原理
写在前面 JDK & JRE JRE(Java Runtime Enviroment)是Java的运行环境.面向Java程序的使用者,而不是开发者.如果你仅下载并安装了JRE,那么你的系统只 ...
- javac编译原理
javac编译器的作用就是将符合java语言规范的源代码转化成符合java虚拟机规范的java字节码 经历:词法分析器->语法分析器->语义分析器->编译字节码 四个过程生成字节码文 ...
- javac 编译与 JIT 编译
编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...
- Javac编译和JIT编译
编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...
随机推荐
- 在EasyUI中统一判断是否有选中行,如果有则将选中行数据传入回调函数
function procossWithSeletedData(func) { var rowData = $("#tbGrid").datagrid("getSelec ...
- MVC布局页占位符@RenderSection("bscript", false)
@RenderSection("bscript", false) //false表示不是必须填充 填充bscript占位符 @section bscript{}
- Android中Menu的基本用法
一. 使用xml定义Menu 菜单资源文件必须放在res/menu目录中.菜单资源文件必须使用<menu>标签作为根节点.除了<menu>标签外,还有另外两个标签用于设置菜单项 ...
- Ubuntu安装中文字体
Ubuntu没有宋体,楷体之类的中文字体,在Libreoffice中打不出中文,-_-! 我们可以从windows中借点字体过来,哈哈. 一.准备字体 从windows7中拷贝出字体文件,拷贝的目录为 ...
- 2015.4.16-C#中ref和out的区别
如图: 输出结果是: 上面显示的是 ref 只是地址传递,所以最初改变的也只是地址,但是如果 在给其赋值,值会随之改变;如果 在方法内直接赋值,那么输出的结果 就是现在的值,之后 ...
- PHP多种序列化/反序列化的方法 (转载)
1. serialize和unserialize函数 这两个是序列化和反序列化PHP中数据的常用函数. <?php $a = array('a' => 'Apple' ,'b' => ...
- Oracle误删表空间文件后数据库无法启动
[问题描述]Oracle误删表空间文件后数据库无法启动,报错表空间文件不存在 [解决办法]sqlplus / as sysdba #以dba身份登陆数据库shutdown immediat ...
- android关于window
http://mobile.51cto.com/android-259922_all.htm http://mobile.51cto.com/android-259922.htm http://mob ...
- Snippet Compiler——代码段编译工具
原文地址:http://www.cnblogs.com/conexpress/archive/2011/07/24/2115308.html 不知道大家在工作中是否遇到过下面的情况:在项目中实现了一段 ...
- poj 1887 Testing the CATCHER_最长上升子序列
题意:题目太长没看,直接看输入输出猜出是最长下降子序列 用了以前的代码直接a了,做法类似贪心,把最小的顺序数存在数组里面,每次二分更新数组得出最长上升子序列 #include<iostream& ...