在Stackoverflow上看到一个讨论Java和Python对比的问题。有人问为什么Java的运行环境叫JVM,而Python的只能叫解释器?
(标题来自:gfi.com)
估计没多少人想过这个问题。首先看一下***,看看虚拟机的定义。
虚拟机有两种定义,一种是类似Vmware的系统虚拟机,一种是被称为程序虚拟机的虚拟机,比如JVM。CLR是最常见的虚拟机。
虚拟机也称为托管运行时环境。当运行这个虚拟机时,它就像普通OS中的一个进程。当该进程启动时,虚拟机启动,当该进程被销毁时,虚拟机被销毁。使用虚拟机的目的是提供一个平台无关的编程环境。
JVM中的执行引擎只能处理编译好的Java字节码。字节码处理引擎实际上包含了一个字节码解释器和一个JIT编译器(这与CLR中的JIT有很大的不同。网)。解释器逐个执行字节码指令,速度稍慢。JIT编译器缓存热代码的编译,所以执行速度加快。
解释器的概念比较简单。它可以翻译和运行代码,无需编译。JVM里的解释器官方是这样的,JVM解释的是字节码。解释程序有三种运行程序的方式:
直接运行高级编程语言(如Shell内置的解释器)转换高级编程语言码到一些有效率的字节码(Bytecode),并运行这些字节码以解释器包含的编译器对高级语言编译,并指示处理器运行编译后的程序(例如:JIT)
Python的解释器属于第二种。Python代码第一次运行时,会把Python代码编译成字节码。如果可能的话,它会将这个字节码保存到一个. pyc文件中,这样下次启动时就不会编译这些代码,而是直接解释正在运行的字节码。事实上,这种机制正在模糊解释器和编译器之间的界限,或者解释语言和编译语言之间的界限。
通过对JVM和解释器概念的澄清,我好像还是不明白JVM为什么叫虚拟机。JVM中有字节码在运行,可能是直接解释执行,也可能是重新编译成目标语言。Python中的解释器也会在解释和执行之前将Python代码预编译成字节码。那么有什么区别呢?
很多人参与了讨论,从不同的角度解释了不同之处。
有些人认为虚拟机是独立于语言的。以JVM为例。除了Java,Scala、Clojure甚至Python都可以借助Jython工具在JVM上运行,但是除了Python之外,我还没有听说过有哪种语言可以被Python解释器解释执行。
也有人说Java是静态语言,而Python是动态语言。这使得Java字节码能够被解释和执行,或者被编译成机器指令来执行。另一方面,Python要复杂得多。虽然它允许程序员不关注变量的类型,但解释器必须推断数据类型,这在一定程度上影响了性能。
还有一种观点认为解释器是历史遗留下来的术语,现代语言中虚拟机和解释器的界限模糊甚至不存在。
事实上,在《学习Python》这本书里,作者看到Python的解释者叫PVM。基于这个事实,我同意解释器和虚拟机的区别越来越小,已经到了你我同舟共济的地步。从独立分割的角度来看,或许可以把这些步骤区分为解释器行为,把这些步骤区分为虚拟机行为,但是整体来看,两者的区别真的没有那么明显。
本文来自无言温柔天然对象投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/508763.html