一、简述

Java代码编译和执行的整个过程包含了三个重要的机制:①Java源码编译机制;②类加载机制;③类执行机制

二、Java源码编译机制

Java代码编译是由Javac编译器来完成,流程如图:

Javac是一种编译器,能将一种语言规范转化成另外一种语言规范,通常编译器都是将便于人理解的语言规范转化成机器容易理解的语言规范,如C/C++或者汇编语言都是将源代码直接编译成目标机器码,这个目标机器代码是CPU直接执行的指令集合。这些指令集合也就是底层的一种语言规范。

Javac的编译器也是将Java这种对人非常友好的编程语言编译成对所有机器都非常友好的一种语言。这种语言不是针对某种机器或某个平台。怎么消除不同种类,不同平台之间的差异这个任务就有JVM来完成,而Javac的任务就是将Java源代码语言转化为JVM能够识别的一种语言,然后由JVM将JVM语言再转化成当前这个机器能够识别的机器语言。

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

编译器把一种语言规范转化为另一种语言规范的这个过程需要哪些步骤?参照《编译原理》,总结过程如下:

1️⃣词法分析:读取源代码,一个字节一个字节的读进来,找出这些词法中定义的语言关键词如:if、else、while等,识别哪些if是合法的哪些是不合法的。这个步骤就是词法分析过程。

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

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

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

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

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

4️⃣字节码生成:将会根据经过注释的抽象语法树生成字节码,也就是将一个数据结构转化为另外一个数据结构。就像将所有的中文词语翻译成英文单词后按照英文语法组装文英文语句。代码生成器的结果就是生成符合java虚拟机规范的字节码。这个过程中的需要的组件如下图:

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

最后生成的class文件由以下部分组成:

①结构信息。包括class文件格式版本号及各部分的数量与大小的信息。

②元数据。对应于Java源码中声明与常量的信息。包含类、继承的超类、实现的接口的声明信息、域与方法声明信息和常量池。

③方法信息。对应Java源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息。

三、类执行机制

Java字节码的执行是由JVM执行引擎来完成,流程图如下:

JVM是基于栈的体系结构来执行class字节码的。线程创建后,都会产生程序计数器和栈,程序计数器存放下一条要执行的指令。栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是由局部变量区和操作数栈两部分组成,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。栈的结构如下图:

java代码编译过程_Java代码编译和执行的整个过程相关推荐

  1. MDK编译过程及ARM编译工具链

    欢迎加入[Linux C/C++/Python社区]一起探讨和分享Linux C/C++/Python/Shell编程.机器人技术.机器学习.机器视觉.嵌入式AI相关领域的知识和技术. MDK编译过程 ...

  2. python通过解释器来编译_python 解释器与编译过程,代码的搬运工

    虚拟机工作前: python 在运行.py 文件的时候,先进行编译字节码的形式来进行存在,字节码的存在是为了优化速度. 字节码的更改是通过时间戳来进行.字节码发送的python 虚拟机之中,虚拟机是p ...

  3. PX4IO的编译过程、代码构架以及与PX4FMU的通讯分析

    看到很多教程中讲到PX4飞控的协处理器的作用,包括各类遥控器信号的输入.PWM信号输出.以及与FMU的通讯.但是究竟如何实现的,最近几天自己看代码总算搞懂了,在这里分享一下. 一,代码的组成和编译过程 ...

  4. java 源码分析_Java 源代码编译成 Class 文件的过程分析

    原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...

  5. java编译机制_java的编译机制

    我们通常写的文件都是java文件,最后要在JVM上运行则需要将java文件编译成class(二进制文件). 各厂商在实现JDK时通常会符合java语言规范的源码编译为class文件的编译器.编译器的好 ...

  6. java程序优化快捷键_Java 代码中针对性能优化的总结方案

    在一个好的项目中代码优化是永远离不开的话题,如果有充足的时间开发和维护代码,必须考虑每个可以优化的细节,日积月累,项目的质量才会上升,代码优化是绝对有必要的工作.代码优化的主要目的是减少代码块,提升代 ...

  7. java 反编译 下载_java反编译工具

    java反编译工具是一款反向翻译Java工具,能够帮助用户将.class文件反向编译成Java文件,还可以还批量处理.class文件..jar文件,使用多页面编辑功能能大大提高操作人员反向编译效率,非 ...

  8. Java编译过程、JIT编译详解、类加载过程

    文章目录 Java编译执行过程 类加载过程 即时编译JIT JIT编译优化中的常见技术 方法内联 逃逸分析 栈上分配 锁消除 小总结 Java编译执行过程 提到编译,可能大多数人想到的就是将**.ja ...

  9. java代码混淆加密_Java代码混淆和加密--Jocky(转)

    1.1 什么是Jocky? 我们知道,Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在运行期动态链接. 这样,编译后的类文件中将包含有符号 ...

最新文章

  1. 大厂需要这样的Java工程师
  2. hashmap应用场景_京东4面(Java研发):事务隔离+乐观锁+HashMap+秒杀设计+微服务
  3. OSPF Unicast Multicast and Network Type(OSPF的单播多播与网络类型辩析)
  4. 小波滤波器与其他滤波器的区别_滤波器国产 VS 国外
  5. 6 岁就成“大厂团宠”,这门编程语言竟引 Linux、谷歌、亚马逊共“折腰” !
  6. Spring boot工程创建
  7. 三星电子首次公布李在镕薪酬 看起来一点儿也不高
  8. cloudstack基础知识
  9. Android开发学习(3)Hello Android!
  10. 9种常见的HR数据分析方法
  11. Windows 10 开启卓越性能模式
  12. Tomcat修行之路-3.类加载机制的原理
  13. Windows 解决teamview远程必须mstsc连接
  14. Keil5最新版本下载(MDK 5.25, C51v959)
  15. c语言中用户验证程序,C语言用户登录系统账户密码比对
  16. 黑白照片修复彩色软件免费有哪些?分享这三个实用的软件给你
  17. 华科大考研计算机系834大纲之数据结构(六)
  18. 阿里新版java开发手册(2019华山版、2020泰山版)
  19. JavaScriptJQuery_jQuery简介
  20. 微信自动加人软件安装使用

热门文章

  1. 倍福--清除随机分配的内存地址
  2. 自媒体工具:文本内容转音频文件实用小工具
  3. u盘运行的linux系统软件,在linux系统中,有什么软件可以做U盘开启盘
  4. zzuli--1055: 兔子繁殖问题
  5. 【线性模型引论】王松桂著 课后习题3.9参考答案
  6. VMware下载安装教程
  7. 一文搞懂CDN加速原理
  8. python游戏开发框架_用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块1)...
  9. ctf,show msic入门
  10. Deep learning in video multi-object tracking A survey 论文笔记