Linux.中国 - 开源社区

 找回密码
 骑士注册

QQ登录

微博登录


凭啥Java的运行环境称虚拟机,Python的只能称解释器

2015-3-6 14:11    评论: 25 分享: 49    

看到Stackoverflow上有个问题在讨论Java和Python的对比,其中就有人问答为啥Java的运行环境被称之为JVM,而Python的只能叫做Interpreter。

(题图来自:gfi.com)

这个问题估计想过的人不多,先找维基百科看一下虚拟机的定义。

虚拟机的定义有2个,一种是类似Vmware的系统虚拟机,另一种是虚拟机称之为程序虚拟机,诸如JVM,CLR就是最常见到的虚拟机。

程序虚拟机也称作托管运行时环境,运行这个虚拟机时,就好比普通的OS中的一个进程。当这个进程启动时,虚拟机启动,当进程销毁时,虚拟机销毁。使用虚拟机的目的就是提供一个和平台无关的编程环境。

JVM中的执行引擎只能处理编译后的Java字节码,字节码处理引擎其实包含一个字节码解释器和一个JIT编译器(和.net的CLR中JIT差别很大),解释器逐条的执行字节码指令,速度稍慢。JIT编译器则会将热点代码编译缓存起来,因此执行速度加快。

解释器的概念比较简单,它可以将代码翻译,并运行,不需要经过编译,JVM中的解释器正式这样的,JVM中解释的就是字节码。解释器运行程序的方法有3种:

  1. 直接运行高级编程语言(如Shell内置的解释器)

  2. 转换高级编程语言码到一些有效率的字节码(Bytecode),并运行这些字节码

  3. 以解释器包含的编译器对高级语言编译,并指示处理器运行编译后的程序(例如:JIT)

其中Python的解释器就是属于第二种,Python代码在首次运行时,它会将Python代码编译成字节码,如果可以的话,它会将这个字节码保存到.pyc文件中,这样下次启动的时候就不会再编译这些代码而是直接解释运行字节码。事实上,这种机制正在模糊解释器和编译器之间的界限,或者说是模糊了解释型语言和编译型语言的界限。

通过JVM和解释器的概念澄清,似乎还是不明白为啥JVM就被称为虚拟机,JVM中有运行的是字节码,它可能直接被解释执行,也可能被再次编译成目标语言,Python中的解释器也会先预编译Python代码为字节码,再解释执行。那么到底有啥区别?

很多人参与了讨论,分别从不同的角度去阐述区别。

有人认为虚拟机是和语言无关的,JVM为例,除了Java之外,Scala,Clojure,甚至Python借助于Jython工具,也可以运行在JVM上,而没听说什么语言能有Python解释器解释执行,除了Python。

也有人从语言的类型上,Java为静态类型的语言,而Python为动态语言。这使得Java字节码既可以被解释执行也可以被编译成机器指令再执行。而Python则复杂多了,它虽然让程序员可以不去关注变量的类型,但解释器不得不去推断数据类型,这一定程度上影响性能。

还有观点认为解释器是一个历史遗留术语,现代语言中虚拟机和解释器的分界已经很模糊甚至不存在。

事实上,笔者在《Learning Python》一书中,看到把作者把Python的解释器称为PVM,基于这个事实来讲,本人更认同的是解释器和虚拟机的区别正在越来越小,已经是我中有你,你中有我的地步。独立的分割来看,可能还能区分这几步是解释器行为,这几步是虚拟机的行为,但是作为一个整体来看,两者的区别确实没那么明显。

发表评论


最新评论

我也要发表评论

Gen_Xu 2015-3-7 07:03  新浪微博网友评论
Python更精准
回复
爱捣蛋的小猪2 2015-3-6 20:39
SqueakVM还不是VM吗?
回复
聪明的阿鑫 2015-3-6 20:33  新浪微博网友评论
[喵喵][喵喵]
回复
翠西略飞 2015-3-6 19:33  新浪微博网友评论
这说明另Python轻量,机这个东西感觉上很庞大。
回复
侯震BuildYrOwnLIbrary 2015-3-6 19:03  新浪微博网友评论
[懒得理你]
回复
Hillstone颜正清 2015-3-6 18:03  新浪微博网友评论
? //@阿里云安全:是啊,凭啥?
回复
很笨很懒的晰一 2015-3-6 17:33  新浪微博网友评论
回复
我的图书我做主 2015-3-6 17:03  新浪微博网友评论
也彻底解释了虚拟机这个东西。
回复
北海布沦特 2015-3-6 16:33  新浪微博网友评论
从这点上看,python显得比较草根。
回复
就叫海波儿吧 2015-3-6 16:03  新浪微博网友评论
So.......Fuck you JAVA?[汗]
回复
就叫海波儿吧 2015-3-6 15:49  新浪微博网友评论
So......Fuck you java?[汗]
回复
大卫刘的脑残粉 2015-3-6 15:33  新浪微博网友评论
//@西瓜大丸子汤:有了pypy和pyston这种工具,也可以称为虚拟机吧
回复
kunis 2015-3-6 15:33  新浪微博网友评论
@mywiz
回复
聪明的阿鑫 2015-3-6 15:33  新浪微博网友评论
[good]//@西瓜大丸子汤:有了pypy和pyston这种工具,也可以称为虚拟机吧
回复
屈春河 2015-3-6 15:33  新浪微博网友评论
个人认为之所以称之为虚拟机,是因为虽然不是物理机器系统,但却有相对应的逻辑结构和功能,对所执行的代码而言,就像在物理机器系统上运行一样。比如,JVM就是一个基于栈架构的抽象计算系统,具有自己的内存、CPU(Execution Engine)和指令集(ByteCode)。解释器仅是解释和翻译成目标代码并执行。
7 回复
科技猫 2015-3-6 15:03  新浪微博网友评论
Linux中国:【凭啥Java的运行环境称虚拟机,Python的只能称解释器 ......】
回复
newton777 2015-3-6 15:03  新浪微博网友评论
//@阿里云安全:是啊,凭啥?
回复
newton777 2015-3-6 15:03  新浪微博网友评论
//@阿里云安全:是啊,凭啥?
回复
海边的鸡肉卷 2015-3-6 15:03  新浪微博网友评论
@一只饼干熊
回复
华行天下94 2015-3-6 14:33  新浪微博网友评论
@我的印象笔记
回复
12下一页

热点评论

屈春河 2015-3-6 15:33
个人认为之所以称之为虚拟机,是因为虽然不是物理机器系统,但却有相对应的逻辑结构和功能,对所执行的代码而言,就像在物理机器系统上运行一样。比如,JVM就是一个基于栈架构的抽象计算系统,具有自己的内存、CPU(Execution Engine)和指令集(ByteCode)。解释器仅是解释和翻译成目标代码并执行。
7
返回顶部

分享到微信朋友圈

打开微信,点击底部的“发现”,
使用“扫一扫”将网页分享至朋友圈。