字节码

深入分析Java的编译原理

浪子不回头ぞ 提交于 2020-01-26 00:21:26
在《 Java代码的编译与反编译 》中,有过关于Java语言的编译和反编译的介绍。我们可以通过 javac 命令将Java程序的源代码编译成Java字节码,即我们常说的class文件。这是我们通常意义上理解的编译。 但是,字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令。这个过程是Java虚拟机做的,这个过程也叫编译。是更深层次的编译。 在编译原理中,把源代码翻译成机器指令,一般要经过以下几个重要步骤: 根据完成任务不同,可以将编译器的组成部分划分为前端(Front End)与后端(Back End)。 前端编译主要指与源语言有关但与目标机无关的部分,包括词法分析、语法分析、语义分析与中间代码生成。 后端编译主要指与目标机有关的部分,包括代码优化和目标代码生成等。 我们可以把将 .java 文件编译成 .class 的编译过程称之为前端编译。把将 .class 文件翻译成机器指令的编译过程称之为后端编译。 Java中的前端编译 前端编译主要指与源语言有关但与目标机无关的部分,包括词法分析、语法分析、语义分析与中间代码生成。 我们所熟知的 javac 的编译就是前端编译。除了这种以外,我们使用的很多IDE,如eclipse,idea等,都内置了前端编译器。主要功能就是把 .java 代码转换成 .class 代码。 词法分析 词法分析阶段是编译过程的第一个阶段

Java技术与Java虚拟机

时光怂恿深爱的人放手 提交于 2020-01-26 00:21:12
Java技术与Java虚拟机   说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言 、 Java类文件格式 、 Java虚拟机 和 Java应用程序接口 (Java API)。它们的关系如下图所示: 图1 Java四个方面的关系   运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件)。最后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被 即时代码发生器 有选择的转换成机器码执行。从上图也可以看出Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平台上。这个平台的结构如下图所示: 图2 Java平台结构图   在Java平台的结构中, 可以看出,Java虚拟机(JVM) 处在核心的位置,是程序与 底层操作系统 和 硬件 无关的关键。它的下方是 移植接口 ,移植接口由两部分组成: 适配器 和 Java操作系统 , 其中依赖于平台的部分称为适配器;JVM 通过移植接口在具体的平台和操作系统上实现;在JVM 的上方是Java的基本类库和扩展类库以及它们的API, 利用Java API编写的应用程序(application) 和小程序(Java

JVM、JDK、JRE

隐身守侯 提交于 2020-01-26 00:18:17
JAVA执行过程:    Java源文件(*.java)---编译器(compiler)----->字节码文件(*.class)---解释器(interpreter)----->执行结果 JVM:   结构:1. JVM指令系统       JVM指令系统同其他计算机的指令系统极其相似。Java指令也是由操作码和操作数两部分组 成。操作码为 8位 二进制数,       操作数紧随在操作码的后面,其长度根据需要而不同。当长度大于8位时,操作数被分为两个以上字节存放。       Java指令系统是以Java语言的实现为目的设计的,其中包含了用于 调用方法和监视多线程系统 的指令。       Java的8位操作码的长度使得JVM最多有256种指令,已使用了160多种操作码。      2. JVM寄存器       所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组。JVM只设置了4个最为常用的寄存器。       ①.pc程序计数器       ②.optop操作数栈顶指针       ③.frame当前执行环境指针       ④.vars指向当前执行环境中第一个局部变量的指针       所有寄存器均为32位。pc用于记录程序的执行。optop,frame和vars用于记录指向Java栈区的指针。      3. JVM栈结构      

JVM介绍(入门知识)

◇◆丶佛笑我妖孽 提交于 2020-01-26 00:17:25
Java 虚 拟 机 (JVM) 是可运行 Java 代 码 的假想 计 算机。只要根据 JVM 规 格描述将解 释 器移植到特定的 计 算机上,就能保 证经过编译 的任何 Java 代 码 能 够 在 该 系 统 上运行。本文首先 简 要介 绍 从 Java 文件的 编译 到最 终执 行的 过 程,随后 对 JVM 规 格描述作一 说 明。       一 .Java 源文件的 编译 、下 载 、解 释 和 执 行    Java 应 用程序的 开发 周期包括 编译 、下 载 、解 释 和 执 行几个部分。 Java 编译 程序将 Java 源程序翻 译为 JVM 可 执 行 字 节码 。 这 一 编译过 程同 C/C++ 的 编译 有些不同。当 C 编译 器 编译 生成一个 对 象的代 码时 , 该 代 码 是 为 在某一特定硬件平台运行而 产 生的。因此,在 编译过 程中, 编译 程序通 过查 表将所有 对 符号的引用 转换为 特定的内存偏移量,以保 证 程序运行。 Java 编译 器却不将 对变 量和方法的引用 编译为 数 值 引用,也不确定程序 执 行 过 程中的内存布局,而是将 这 些符号引用信息保留在字 节码 中,由解 释 器在运行 过 程中 创 立内存布局,然后再通 过查 表来确定一个方法所在的地址。 这样 就有效的保 证 了 Java 的可移植性和安全性。   

JVM(JAVA虚拟机)

↘锁芯ラ 提交于 2020-01-26 00:16:35
Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。本文首先简要介绍从Java文件的编译到最终执行的过程,随后对JVM规格描述作一说明。   一.Java源文件的编译、下载、解释和执行   Java应用程序的开发周期包括编译、下载、解释和执行几个部分。Java编译程序将Java源程序翻译为JVM可执行代码—字节码。这一编译过程同C/C++的编译有些不同。当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。因此,在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效的保证了Java的可移植性和安全性。   运行JVM字节码的工作是由解释器来完成的。解释执行过程分三部进行:代码的装入、代码的校验和代码的执行。装入代码的工作由"类装载器"(class loader)完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时,该类被放在自己的名字空间中

Java编译器、JVM、解释器

徘徊边缘 提交于 2020-01-26 00:15:51
Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。本文首先简要介绍从Java文件的编译到最终执行的过程,随后对JVM规格描述作一说明。      一.Java源文件的编译、下载 、解释和执行   Java应用程序的开发周期包括编译、下载 、解释和执行几个部分。Java编译程序将Java源程序翻译为JVM可执行的字节码。这一编译过程同C/C++ 的编译有些不同。当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。因此,在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效的保证了Java的可移植性和安全性。      运行JVM字节码的工作是由解释器来完成的。解释执行过程分三部进行:代码的装入、代码的校验和代码的执行。装入代码的工作由"类装载器"(class loader)完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时

【跟我一起学Python吧】Python解释执行原理

て烟熏妆下的殇ゞ 提交于 2020-01-26 00:11:54
这里的解释执行是相对于编译执行而言的。我们都知道,使用C/C++之类的编译性语言编写的程序,是需要从源文件转换成计算机使用的机器语言,经过链接器链接之后形成了二进制的可执行文件。运行该程序的时候,就可以把二进制程序从硬盘载入到内存中并运行。 但是对于Python而言,python源码不需要编译成二进制代码,它可以直接从源代码运行程序。当我们运行python文件程序的时候, python解释器 将源代码转换为字节码,然后再由 python解释器 来执行这些字节码。这样,python就不用担心程序的编译,库的链接加载等问题了。 对于python解释语言,有以下3方面的特性: 每次运行都要进行转换成字节码,然后再有虚拟机把字节码转换成机器语言,最后才能在硬件上运行。与编译性语言相比,每次多出了编译和链接的过程,性能肯定会受到影响。 由于不用关心程序的编译和库的链接等问题,开发的工作也就更加轻松啦。 python代码与机器底层更远了,python程序更加易于移植,基本上无需改动就能在多平台上运行。 在具体计算机上实现一种语言,首先要确定的是表示该语言语义解释的虚拟计算机,一个关键的问题是程序执行时的基本表示是 实际计算机上的机器语言还是虚拟机的机器语言 。这个问题决定了语言的实现。根据这个问题的回答,可以将程序设计语言划分为两大类: 编译型语言和解释型语言 。 编译实现的语言 ,如:C、C

【和我一起学python吧】Python解释执行原理

混江龙づ霸主 提交于 2020-01-26 00:10:58
这里的解释执行是相对于编译执行而言的。我们都知道,使用C/C++之类的编译性语言编写的程序,是需要从源文件转换成计算机使用的机器语言,经过链接器链接之后形成了二进制的可执行文件。运行该程序的时候,就可以把二进制程序从硬盘载入到内存中并运行。 但是对于Python而言,python源码不需要编译成二进制代码,它可以直接从源代码运行程序。当我们运行python文件程序的时候, python解释器 将源代码转换为字节码,然后再由 python解释器 来执行这些字节码。这样,python就不用担心程序的编译,库的链接加载等问题了。 对于python解释语言,有以下3方面的特性: 每次运行都要进行转换成字节码,然后再有虚拟机把字节码转换成机器语言,最后才能在硬件上运行。与编译性语言相比,每次多出了编译和链接的过程,性能肯定会受到影响。 由于不用关心程序的编译和库的链接等问题,开发的工作也就更加轻松啦。 python代码与机器底层更远了,python程序更加易于移植,基本上无需改动就能在多平台上运行。 在具体计算机上实现一种语言,首先要确定的是表示该语言语义解释的虚拟计算机,一个关键的问题是程序执行时的基本表示是 实际计算机上的机器语言还是虚拟机的机器语言 。这个问题决定了语言的实现。根据这个问题的回答,可以将程序设计语言划分为两大类: 编译型语言和解释型语言 。 编译实现的语言 ,如:C、C

编译执行和解释执行的区别

限于喜欢 提交于 2020-01-26 00:09:10
计算机语言的种类非常的多,总的来说可以分成机器语言,汇编语言,高级语言三大类。 计算机所能识别的语言只有机器语言,即由0和1构成的代码。但通常人们编程时,不采用机器语言,因为它非常难于记忆和识别。 目前通用的编程语言有两种形式:汇编语言和高级语言。 汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。它同样需要编程者将每一步具体的操作用命令的形式写出来。汇编程序通常由三部分组成:指令、伪指令和宏指令。汇编程序的每一句指令只能对应实际操作过程中的一个很细微的动作,例如移动、自增,因此汇编源程序一般比较冗长、复杂、容易出错,而且使用汇编语言编程需要有更多的计算机专业知识,但汇编语言的优点也是显而易见的,用汇编语言所能完成的操作不是一般高级语言所能实现的,而且源程序经汇编生成的可执行文件不仅比较小,而且执行速度很快。 高级语言是目前绝大多数编程者的选择。和汇编语言相比,它不但将许多相关的机器指令合成为单条指令,并且去掉了与具体操作有关但与完成工作无关的细节,例如使用堆栈、寄存器等,这样就大大简化了程序中的指令。同时,由于省略了很多细节,编程者也就不需要有太多的专业知识。 高级语言主要是相对于汇编语言而言,它并不是特指某一种具体的语言,而是包括了很多编程语言,如目前流行的VB、VC、FoxPro、Delphi等,这些语言的语法

Java之.class文件与字节码文件

折月煮酒 提交于 2020-01-25 10:56:45
1. JVM运行数据区概述 .class与字节码bytecode .class: 是指文件扩展名称为.class的文件,表示由java源程序经过java编译器编译而成且由JVM执行的二进制文件,因此可以通过拥有一份.class文件在不同的操作系统平台上的JVM执行,实现跨平台运行的特性 字节码bytecode: 简单说不是文件,而是JVM操作的指令格式,通常我们通过 javap -c -v xx.class 生成的文件称为字节码文件,是属于可阅读的字节码指令文件,能够让我们清楚地知道java文件编译成.class文件之后显示的执行指令,便于程序员理解jvm的相关的知识 .class文件与字节码文件格式 .class文件(16进制文件) 字节码文件(可阅读的指令文件) 2. .class文件结构与字节码 .class文件结构 幻数 类文件的四个字节表头0xCAFEBABE 类文件格式的版本 类文件的次要和主要版本 jdk的主要版本如下 Java SE 14 = 58 (0x3A hex), Java SE 13 = 57 (0x39 hex), Java SE 12 = 56 (0x38 hex), Java SE 11 = 55 (0x37 hex), Java SE 10 = 54 (0x36 hex),[3] Java SE 9 = 53 (0x35 hex),[4] Java