JavaRush /Java 博客 /Random-ZH /机器代码和字节代码:您的程序使用什么语言?

机器代码和字节代码:您的程序使用什么语言?

已在 Random-ZH 群组中发布
那些刚刚开始熟悉 Java 的人常常对机器码字节码的概念感到困惑。这些是什么?有什么区别?简而言之,我们将尝试尽可能简单明了地描述它们的功能,以便一劳永逸地解决这个问题。
机器代码和字节代码:您的程序使用什么语言? - 1

机器码

处理器本质上是一个非常复杂和先进的计算器。它有许多内存位置(称为寄存器),在这些位置上和之间执行各种数学和字节运算。机器代码正是对操作序列和所涉及的数据集的描述。事实上,它是计算机处理器能够理解的唯一语言。

先天性不合

与此同时,并非所有处理器都“讲”同一种语言。不仅CISCRISC架构之间存在差异,而且这些“阵营”内部也存在差异。

CISC(复杂指令集计算)是一种处理器设计概念,具有以下一组属性:

  • 许多命令,长度不同;
  • 多种寻址方式;
  • 复杂的指令编码。
RISC(精简指令集计算) - 具有精简指令集的处理器。命令格式相同、简短、编码简单。
新一代处理器引入了老一代型号根本不知道的附加指令集。因此,为一种架构(或一代处理器)编译的程序无法在其他硬件上运行。所有这些都迫使我们重新编译程序以确保它们可以在其他计算机上运行。然而,您必须重新编译不仅因为处理器,还因为程序和操作系统交互的差异。正是因为它们,才不可能在Linux下运行“Windows”程序,在Windows下运行“Linux”程序。

字节码

字节码在很多方面与机器代码相似,只是它使用的一组指令不是来自真实处理器,而是来自虚拟处理器。此外,它可能包括专注于JIT 编译器的使用的部分,该编译器优化了运行程序的真实处理器的命令执行。
JIT编译(Just-in-time Compilation,即时编译)或动态编译(动态翻译)是一种提高使用字节码的软件系统性能的技术,通过将字节码直接编译为机器码或其他格式,同时将字节码直接编译为机器码或其他格式。程序正在运行。在 Java 版本 9 之前,“正式”只有 JIT 编译器。在Java 9中,出现了另一种编译器,它是提前编译(AoT)。此功能允许 Java 类在虚拟机上运行之前编译为本机代码。此功能旨在缩短小型和大型应用程序的启动时间,同时对峰值性能的影响有限。
对于CISC处理器,一些指令可以组合成处理器支持的更复杂的结构,而对于RISC,相反,它们可以被分解成更简单的指令序列。

也是一个虚拟操作系统

然而,字节码不仅包含处理器指令。它还包含与虚拟操作系统交互的逻辑,这使得应用程序的行为独立于计算机上使用的操作系统。这在JVM中清晰可见,其中系统调用和GUI的工作通常独立于程序运行的操作系统。总的来说,JVM模拟程序进程的启动,这与Virtual Box等仅创建虚拟系统/硬件的解决方案不同。

JVM 是唯一这样的吗?

当然不。同样的DotNet CLI也是一个虚拟机,最常用于运行带有 x86 兼容处理器的 Windows 的计算机。然而,有一个针对其他系统的实现:它的应用程序必须运行在运行于ARM (RISC)兼容处理器上的Windows RT上,或者您可以在Mono环境中的Linux/OSX上运行它们,这是第三方的(因此不完全兼容)这些平台的DotNet实现。所以这个平台就像JVM一样,运行在不同的处理器和不同的操作系统上。还有许多类似的解决方案(新旧):LLVMFlash SWF等。有些编程语言有自己的虚拟机。例如,CPython将PY 源代码编译为PYC文件- 已编译的字节代码,准备在PVM中运行。或者有一个更古老的例子 - Lisp可以编译成FASL(快速加载)文件。事实上,它们包含生成器根据源代码构建的AST 树。这些文件可以由各种平台上的Lisp解释器读取和执行,或者用于为当前使用的硬件架构生成机器代码。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION