Java jvm的抽象机器概念

Java jvm的抽象机器概念,java,jvm,vm-implementation,Java,Jvm,Vm Implementation,我试图理解将java实现为抽象机或虚拟机的真正优势,或者换句话说,将一种语言编译成一种抽象机语言的优势。就平台独立性而言,我考虑了以下两种替代实现: 只要有一个解释器,将java直接翻译成它运行的机器的机器代码,并为不同类型的机器提供这种解释器的多个实现 第一种方法在空间上效率不高,那么把源代码编译成一种中间语言怎么样?这种中间语言不是抽象机器的语言,只是一些可以解释为机器代码的语言,然后拥有这种解释器的多个实现 如果不考虑性能,那么抽象机器与这些选项相比如何。换句话说,如果java字节码不

我试图理解将java实现为抽象机或虚拟机的真正优势,或者换句话说,将一种语言编译成一种抽象机语言的优势。就平台独立性而言,我考虑了以下两种替代实现:

  • 只要有一个解释器,将java直接翻译成它运行的机器的机器代码,并为不同类型的机器提供这种解释器的多个实现

  • 第一种方法在空间上效率不高,那么把源代码编译成一种中间语言怎么样?这种中间语言不是抽象机器的语言,只是一些可以解释为机器代码的语言,然后拥有这种解释器的多个实现


如果不考虑性能,那么抽象机器与这些选项相比如何。换句话说,如果java字节码不是虚拟机的语言,而是某种中间语言,那么会失去什么特性和好处(除了性能)

如果Java在执行时被直接翻译成机器代码,那么编译器提供的类型安全特性将丢失。编译器不报告错误这一事实保证了某些类型的错误在运行时不会发生;如果删除编译器阶段,您将在运行时看到这些错误


另一方面,Java字节码是一种中间语言,即使它的级别比其他语言稍高。JVM部分通过解释执行它,部分通过编译机器代码执行它。

您所描述的本质上就是Java和JVM当前所做的。Java被编译成称为字节码的东西,字节码是一种中间语言(它看起来非常像基于堆栈的机器的汇编)。JVM然后解释此代码,在一个名为。JVM做其他事情(如管理并发性和内存结构/管理),这有助于提高可移植性。

字节码只是一种中间语言


或者反过来说:中间语言的实现是一个虚拟机。

所有变体实际上都在实践中使用,这都是关于选择适当的折衷方案

对于Java-方便许多平台分发,启动时间较慢:

  • 编译成字节码的Java源代码
  • 字节码解释和/或
  • 字节码JIT编译为机器码
对于JavaScript-最方便的分发方式/要使其快速,需要做大量工作):

  • JavaScript源代码解析+解释或JIT编译为机器代码
对于.NET-AOT具有VM语言的所有优点,同时保持快速启动,但主要锁定在一种目标系统类型:

  • C#/F#/VB/。。。编译成IL(中间语言/另一字节码)
  • .NET IL代码已解释和/或
  • .NET IL JIT编译为机器代码或
  • .NET IL AOT编译(提前编译)(主要是x86)和分布式编译

这正是目前最常用的方法,但您可以将javascript编译成字节码,将java预编译成机器码,甚至可以像GWT一样将java编译成javascript,等等(只是要使其可用还有很多工作要做)

我同意,但问题是我没有得到我想要的答案。你的观点是正确的,但我正在寻找一个解释,说明这个抽象机器概念对于实现java是如何至关重要。将源代码转换为虚拟机的汇编程序究竟有多大的回报。我想我无法正确解释它。你是否已经阅读并理解了它?