字节码和机器码的区别
每台计算机都有一套独特的指令集,一旦计算机对其进行解读,就只能由计算机本身读取和执行。这些指令以二进制位模式保存在计算机中,本质上只是一系列长长的 1 和 0。因此,特定计算机只能执行用其使用的微处理器语言编写的指令。程序可以保存在磁盘上,然后加载到计算机的内部存储器中。之后,中央处理单元 (CPU) 将一次检索一条指令,并按顺序执行它们。
过去,程序员会用计算机处理器的原生机器语言编写代码。这种方法效率低下,因为它需要大量的时间和金钱,而且机器语言本身对人类来说是难以理解的。
“汇编语言”的开发就是为了解决这些问题。可以使用十进制数而不是二进制数来表示数据。但是,要将用汇编语言编写的程序转换为机器码,需要一个程序。这种类型的程序被称为**汇编器**。
汇编器使程序更易于人类阅读,并减少了编程错误的可能性,但它们无法解决可移植性问题。为了纠正汇编程序中的缺陷,开发了高级编程语言。尽管这些语言使编程更高效,但计算机无法运行它们,因为它们是用更高层次的抽象编写的。因此,编译器出现了。为了使编译后的程序能够在任何计算机上正确运行,必须首先将其编译成一种称为**字节码**的格式。
什么是字节码?
字节码是一种适合软件翻译操作的指令。由于其提供的可移植性,它也通常被称为“p-code”。与人类可读的源代码相比,字节码充满了数字代码、常量和凭据(通常是数字地址),这些代码、常量和凭据对程序对象类型、作用域和嵌套级别的解析和语义分析结果进行编码。这些结果存储在字节本身中。因此,字节码提供的效率水平明显优于直接源代码翻译。
最常见的虚拟机类型是虚拟堆栈机,但也构建了虚拟寄存器机。字节码指令由软件提供,因此这些机器可以像程序员希望的那样简单或复杂。尽管它们通常与标准硬件指令有很多共同点,但它们仍然可能非常复杂。就像对象模块一样,各个部分通常保存在它们自己的单独文件中,但在程序运行时动态打包。字节码是一种由虚拟机处理的计算机对象数据类型。
使用字节码的好处
使用字节码有很多好处,其中一些包括:
借助字节码可以实现平台无关的目标。
根据您使用的系统,JVM 命令可能会有所不同,但字节码可以在任何设备上执行。
它增强了 Java 的可移植性和灵活性,这反映了“一次编写,随处运行”这句话。
什么是机器码?
计算机的“机器码”是指由计算机的 CPU 直接执行的一组规则或指令。每个指令在存储在 CPU 寄存器或内存中的数据单元上执行一项高度特定的任务,例如加载、跳转或执行 ALU(算术逻辑单元)操作。这些任务的示例包括加载和跳转。任何由 CPU 通常执行的程序都由一组这样的指令组成。
机器码是最基本和最依赖于硬件的语言,它是计算机程序在编译和构建后使用的语言。它也是最低级别的语言。
虽然可以明确地用数值机器码构建程序,但手动执行此操作不仅耗时,而且还会增加出错的可能性。可以手动管理单个位,并手动计算数值位置和常量。因此,它仅在当今的某些特定情况下使用,例如需要进行重大增强或错误修复时。
命令和数据的数值表示称为机器码。它为其用户提供了许多好处,包括:
机器语言特别适合内存较小且机器较小的机器。
用机器语言编程比用其他语言编程更高效,因为机器语言需要更少的时间来执行。
这些程序是用机器语言编写的,计算机可以直接理解,不需要人类解释就能理解,因此不需要翻译。
字节码和机器码的比较
下表突出显示了字节码和机器码之间的主要区别:
比较依据 | 字节码 | 机器码 |
---|---|---|
定义和含义 | 字节码是机器码和源代码之间的一种中间代码。 | 最简单的形式,它是机器可以自行读取和理解的一组不同指令的简写。 |
代码级别 | 它是中间级代码。 | 它是低级代码。 |
指令类型 | 它由二进制、十六进制和宏指令组成,例如交换、加法和新建等。 | 它由用二进制语言编写的指令组成。因此,指令包含在构成代码的 0 和 1 中。 |
机器特定特性 | 字节码可以由虚拟机和其他类型的软件成功执行。但是,它似乎并没有特别针对(直接)机器。 | 机器码在各个方面都是特定于机器的。 |
生成和实现 | 字节码是在源代码编译后生成的。但是,它不能直接在 CPU 上执行。它的操作完全依赖于翻译器。 | 它可以由 CPU 处理,因为它是一种机器语言。因为它采用二进制格式,所以不需要翻译或编译。 |
CPU 可理解性 | CPU 不能直接理解它。 | 任何 CPU 都可以直接理解和处理此类代码。 |
结论
由于字节码不是任何特定计算机的机器码,因此它可以在不同的计算机架构之间移植。它类似于机器码,机器码必须首先由运行时系统解释才能在系统上运行。
字节码使用虚拟机转换为处理器能够理解的更细粒度的机器指令。
机器码是一种可以直接由计算机硬件运行的计算机程序,不需要任何软件。与平台无关的字节码相反,机器码不能在任何平台上执行,即使它使用相同的操作系统。