写在前面 JDK & JRE 

JRE(Java Runtime Enviroment)是Java的运行环境。面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序。JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java核心类库。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。

JDK(Java Development Kit)又称J2SDK(Java2 Software Development Kit),是Java开发工具包,它提供了Java的开发环境(提供了编译器javac等工具,用于将java文件编译为class文件)和运行环境(提 供了JVM和Runtime辅助包,用于解析class文件使其得到运行)。如果你下载并安装了JDK,那么你不仅可以开发Java程序,也同时拥有了运行Java程序的平台。JDK是整个Java的核心,包括了Java运行环境(JRE),一堆Java工具tools.jar和Java标准类库 (rt.jar)。

JDK also could be called as SDK(Software Development Kit) for Java.


1.Javac是什么?

Javac是一种编译器,能将一种语言规范转化为另外一种语言规范。通常编译器都是将便于人理解的语言规范转化成机器容易理解的语言规范。

Javac的任务就是将java源码编译成java字节码,也就是JVM能够识别的二进制码。表面上来看就是将.java文件转化为.class文件,实际上是将java的源代码转化成一连串有格式的二进制数字,只有JVM能够正确识别它们到底表达了什么意思。

2.Javac的工作流程及类比

  2.1 寻找语法关键词 比如if else for while 等,这个过程称为词法分析  (词法分析的结果是从源代码中找出一些规范化的Token流

  类比:人类语言中分辨 词语 标点符号 动词 名词

  2.2 检查这些关键词组合在一起是否符合Java语言规范,这个过程称为语法分析 (语法分析的结果是一个符合Java规范的抽象语法树

  类比: 人类语言中是不是有主谓宾 主谓宾组合的是否正确 语法是否正确

  2.3 将难懂的、复杂的语法转化为更加简单的语法,这个过程称为语义分析 (比如说将foreach转成for,结果是生成了一个注解过后的抽象语法树,这棵树更加接近目标语言的语法规则)

  类比:人类语言中将难懂的文言文翻译为白话文

  2.4 通过字节码生成器生成字节码,将经过注解的抽象语法树生成字节码,也就是将一个数据结构转化为另一个数据结构

  类比:将中文词语翻译为英文单词后,按照英文语法组装成英文语句

  综上所述,Javac主要有四个模块,分别是词法分析器、语法分析器、语义分析器和代码生成器。

3.词法分析器

 package compile;

 public class Cifa {
int a;
int c = a+1;
}

词法分析器的分析结果就是将这个类中的所有关键词匹配到token类的所有项中的任何一项。上述代码的匹配结果如下图

4.语法分析器 

词法分析器的作用是将Java源文件的字符流转变成对应的Token流,而语法分析器是将Token流组建成更加结构化的语法树,也就是将一个个单词组装成一句话。

 public class Yufa{
int a;
private int c =a +1; public int getC(){
return c;
} public void setC(int c){
this.c = c;
}
}

这段代码对应的语法树

5.语义分析器

经过语法分析器生成的语法树过于粗糙,此时需要在这颗语法树的基础上再做一些处理,比如给类添加构造函数、检查变量在使用前是否初始化、将一些常量进行合并处理,检查操作变量类型是否匹配,检查所有的操作语句是否可达,检查checked exception异常是否已经捕获或抛出,接触Java语法糖(泛型,装拆包),去除一些永不为真的条件判断,内部类会被分离出去但是持有一个外部类的引用

6.代码生成器

将Java方法中的代码块转化成符合JVM语法的命令形式,JVM的操作都是基于栈的,所有的操作都必须经过出栈和进栈来完成。

按照JVM的文件组织格式将字节码输出到以class为扩展名的文件中

Javac 编译原理的更多相关文章

  1. 第二章 Javac编译原理

    注:本文主要记录自<深入分析java web技术内幕>"第四章 javac编译原理" 1.javac作用 将*.java源代码文件转化为*.class文件 2.编译流程 ...

  2. Knowledge Point 20180303 对比编译器、解释器与Javac编译原理

    编译器与Javac编译原理 在前文我们知道了Java是一种编译语言和解释语言,它的源代码经过编译器Javac编译为能够被JVM识别的二进制语言,然后JVM将其解释为能够被平台识别的机器语言.那么什么是 ...

  3. javac编译原理(一)

    我们都知道,计算机只能识别二进制语言,是不能直接识别java c c++等高级语言的.将高级语言转化成计算机可以是别的二进制语言,这个过程就叫编译. 有次面试,面试官问了一道“java的编译原理是什么 ...

  4. Javac编译原理 《深入分析java web 技术内幕》第四章

    javac编译的四个主要的流程: 词法分析器:将源码转换为Token流 将源代码划分成一个个Token(找出java语言中的关键字) 语法分析器:将Token流转化为语法树 将上述的一个个Token组 ...

  5. 第四章 Javac编译原理

    4.1 Javac是什么 是一种编译器,将JAVA源代码(.java文件)语言先转化成JVM能够识别的一种语言(.class文件),然后由JVM将JVM语言再转化成当前机器可以识别的机器语言. 4.2 ...

  6. 第四章 Javac编译原理(待续)

    Javac是什么 Javac编译器的基本结构 Javac工作原理分析 设计模式解析之访问者模式

  7. javac编译原理

    javac编译器的作用就是将符合java语言规范的源代码转化成符合java虚拟机规范的java字节码 经历:词法分析器->语法分析器->语义分析器->编译字节码 四个过程生成字节码文 ...

  8. javac 编译与 JIT 编译

    编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...

  9. Javac编译和JIT编译

    编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...

随机推荐

  1. 4_SSRF

    SSRF SSRF(服务请求伪造)是一种由攻击者构造形成由服务器端发起请求的一个安全漏洞,它将一个可以发起网络请求的服务当作跳板来攻击其他服务器,SSRF的攻击目标一般是内网.当服务器提供了从其他服务 ...

  2. 入侵拿下DVBBS php官网详细过程(图)

    几 个月前,DVBBS php2.0暴了一个可以直接读出管理员密码的sql注入漏洞,当时这个漏洞出来的时候,我看的心痒,怎么还会有这么弱智的漏洞,DVBBS php2.0这套代码我还没仔细看过,于是5 ...

  3. Java GUI学习心得

    虽然GUI的应用已经不是特别广泛了,但是如果了解一点,可以做些自己想要的工具,最近做了一个工具(是什么就不提了),当然碰到很多的问题,都意义解决了,现在分享出来. 1.关于窗体面板的显示问题 可能会遇 ...

  4. HTML (Hyper Text Markup Language) 常用标签

    HTML是什么?  英文全称:Hyper Text Markup Language  中文全称:超文本标记语言  网页主要由 机构  表现 行为  组成 什么是标签?    < > 里的叫 ...

  5. tomcat设置文件编码

    tomcat修改bin文件夹下面的catalina.bat文件可以解决乱码在文件中加上JAVA_OPTS="-server -Xms128M -Xmx4096M -XX:PermSize=5 ...

  6. adb命令安装apk 来学习吧

    1.将需要安装的apk放在platform-tools下 2.将手机和电脑连接,在cmd中输入 adb devices查看 3.使用adb命令安装apk,在cmd中输入:adb install apk ...

  7. 初学者入门web前端:C#基础知识:函数

    入行前端对函数的掌握程度有可能直接影响以后工作的效率,使用函数可以高效的编写编码,节省时间,所以我整理了C#中最基础的函数知识点,虽然我在学习中 遇到很多问题,但是只要能够解决这些问题,都是好的. 一 ...

  8. [iOS] file patterns: The `public_header_files` pattern did not match any file.

    由于之前集成私有pod,遇到问题, 默认的头文件目录设置为:s.public_header_files = ‘Pod/Classes/**/*.h’:但是如果Classes目录中,你的代码文件夹层次结 ...

  9. 201521123024《Java程序设计》第3周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...

  10. 201521123077 《Java程序设计》第2周学习总结

    1. 本周学习总结 动态数组 标识控制符的意义 ArrayList ,BigDecimal,BigInteger 等类的使用 组合,继承,多态等概念的了解 2. 书面作业 Q1.使用Eclipse关联 ...