Java“虚拟机”与 Python“解释器”的说法?

问题描述

虚拟机是一个虚拟计算环境,具有一组特定的原子定义明确的指令,这些指令独立于任何特定语言而受到支持,并且通常被认为是其自身的沙箱。VM 类似于特定 cpu 的指令集,并且倾向于在更基本的级别上工作,这些指令(或字节码)的非常基本的构建块独立于下一个。一条指令仅根据虚拟机的当前状态确定性地执行,而不依赖于该时间点指令流中其他地方的信息。

另一方面,解释器更复杂,因为它适合解析某些语法流,这些语法属于特定语言和特定语法,必须在周围标记的上下文中解码。您不能孤立地查看每个字节甚至每一行,并确切地知道下一步该做什么。语言中的标记不能像它们相对于 VM 的指令(字节码)那样孤立。

Java 编译器将 Java 语言转换为字节码流,这与 C 编译器将 C 语言程序转换为汇编代码没有什么不同。另一方面,解释器并没有真正将程序转换为任何定义明确的中间形式,它只是将程序动作作为解释源代码的过程。

VM 和解释器之间差异的另一个测试是您是否认为它与语言无关。我们所知道的 Java VM 并不是真正的 Java 特定的。您可以使用其他语言制作编译器,生成可以在 JVM 上运行的字节码。另一方面,我认为我们不会真正考虑将 Python 以外的其他语言“编译”成 Python 以供 Python 解释器进行解释。

由于解释过程的复杂性,这可能是一个相对缓慢的过程......特别是解析和识别语言标记等,并了解源的上下文以便能够在解释器中承担执行过程。为了帮助加速此类解释语言,我们可以在这里定义更容易直接解释的预解析、预标记代码的中间形式。这种二进制形式仍然在执行时被解释,它只是从一种人类可读性差得多的形式开始以提高性能。然而,执行该形式的逻辑不是虚拟机,因为这些代码仍然不能孤立地看待——周围令牌的上下文仍然很重要,它们只是现在处于一种不同的计算机效率更高的形式。

解决方法

在 Java 中一直使用“虚拟机”时,似乎很少阅读 Python“虚拟机”。

两者都解释字节码;为什么将一个称为虚拟机而另一个称为解释器?