一、简述

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 代码编译和执行的整个过程相关推荐

  1. JVM学习笔记(二)------Java代码编译和执行的整个过程

    Java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制: ● Java ...

  2. 60.Java 代码编译和执行的整个过程

    60.Java 代码编译和执行的整个过程 60.Java 代码编译和执行的整个过程 Java 代码编译是由 Java 源码编译器来完成,流程图如下所示: Java字节码的执行是由 JVM 执行引擎来完 ...

  3. JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)

    转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...

  4. java代码编译过程_Java代码编译和执行的整个过程

    一.简述 Java代码编译和执行的整个过程包含了三个重要的机制:①Java源码编译机制:②类加载机制:③类执行机制 二.Java源码编译机制 Java代码编译是由Javac编译器来完成,流程如图: J ...

  5. 执行引擎的工作过程、Java代码编译和执行的过程、解释器、JIT编译器

    执行引擎概述 执行引擎是Java虛拟机核心的组成部分之一. "虚拟机"是-一个相对于"物理机"的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接 ...

  6. Java在编译到执行过程的编码问题

    一.两个字符编码的参数 javac和java是JDK自带的工具,其中javac是编译工具,java工具启动Java虚拟机并执行java程序.这两个工具都带有设置字符编码的选项.本文讨论字符编码选项的使 ...

  7. idea2020shezhi代码检查级别_结合 CPU 理解一行 Java 代码是怎么执行的

    根据冯·诺依曼思想,计算机采用二进制作为数制基础,必须包含:运算器.控制器.存储设备,以及输入输出设备,如下图所示. 我们先来分析 CPU 的工作原理,现代 CPU 芯片中大都集成了,控制单元,运算单 ...

  8. Java笔记——Java代码块的执行顺序

    Java代码块的执行顺序 Java程序中代码块的执行顺序对于学习Java的人来说是必不可少需要掌握的. 代码块 在Java中,使用{}括起来的代码被称为代码块. 根据其位置和声明的不同,可以分为: 局 ...

  9. Java 版本、语言规范、API、JDK、IDE、Java 源程序编译、执行原理(跨平台性根本原因)、特殊字符用法、8 大数据类型小结

    文章目录 前言 一.三大版本类型 二.Java 语言规范 三.应用程序接口(API) 四.Java 开发工具包(JDK) 五.集成开发环境(IDE) 六.Java 运行环境(JRE) 七.Java 源 ...

最新文章

  1. SQL语句学习(二)
  2. python长连接框架_python之websocket【长连接的实现】
  3. thymeleaf+layui加载页面渲染时,TemplateProcessingException: Could not parse as expression:
  4. SpringCloud+Seata1.4+Nacos1.4+MySQL8实现分布式事务(客户端)
  5. 反恐精英代码_反恐精英20周年,为什么沙漠2(dust2)地图玩家们一直玩不腻?...
  6. 使用Faster-Rcnn进行目标检测(实践篇)
  7. Elements in iteration expect to have v-bind:key directives错误的解决办法
  8. CSS: SASS用法指南 (附视频)
  9. 超大图上的节点表征学习
  10. 嵌套高度问题_excel查找技巧:嵌套函数在区间查找中的应用解析
  11. c语言乘号字母,c语言中如何输入间接运算符和乘号,包括如何转换
  12. 转:OWASP发布Web应用程序的十大安全风险
  13. tcp下载窗口太小的问题_面试官:换人!他连 TCP 这几个参数都不懂(二)
  14. B站下载视频之you-get的使用
  15. UiPath-定时任务原理
  16. Windows服务器应该如何保持长时间连接不断开。
  17. ES6基础语法(let、const、解构赋值、模板字符串、简化对象、箭头函数、扩展运算符)(一)
  18. Tomcat服务器的安装使用
  19. 【网页设计】在网页中绘制表格(HTML)
  20. linux系统--文件目录

热门文章

  1. 老曹眼中的研发管理二三事
  2. Fiddler下载安装 Mac版
  3. 制作了一个 远程工作职位的 rss 聚合,有需要的订阅,有好的网站欢迎推荐
  4. JAVA-session共享
  5. Tomcat9.0不能成功启动
  6. 窗口控制、置顶、快速切换、老板键
  7. 【原创】吉他指板音名训练器 Guitar Tone Trainer
  8. 诺基亚/NOKIA 5800软件集
  9. 政务服务热线中的大数据应用 ---- 实现政务热线大数据价值的路线图
  10. ST-GCN源码分析