见到Stackoverflow上有一个问题在探讨Java和Python的比照,在其中就有些人答疑为什么Java的运行自然环境被称作JVM,而Python的只有叫做Interpreter。
(题图来源于:gfi.com)
这个问题可能想过的人很少,先找wiki百科看一下vm虚拟机的界定。
vm虚拟机的定位有2个,一种是相近Vmware的系统软件vm虚拟机,另一种是虚拟机称作程序流程vm虚拟机,例如JVM,CLR便是最常用到的vm虚拟机。
程序流程vm虚拟机也称之为代管运行时自然环境,运行这一vm虚拟机时,就如同一般的OS中的一个过程。当这一过程运作时,vm虚拟机运行,当过程消毁时,vm虚拟机消毁。应用vm虚拟机的目标便是保证一个和服务平台不相干的程序编写自然环境。
JVM中的执行模块只有解决编译后的Java字节码,字节码处理模块实际上包括一个字节码解释器和一个JIT编译器(和.net的CLR中JIT区别非常大),解释器逐一的执行字节码命令,速率偏慢。JIT编译器则会将网络热点编码编译缓存文件下去,因而执行速率加速。
解释器的定义非常简单,它可以将代码翻译,并运行,不用通过编译,JVM中的解释器宣布那样的,JVM中表述的便是字节码。解释器运行程序流程的方式 有3种:
- 立即运行高端计算机语言(如Shell内嵌的解释器)
- 变换高端计算机语言码到一些高效率的字节码(Bytecode),并运行这种字节码
- 以解释器包括的编译器对程序设计语言编译,并标示CPU运行编译后的程序流程(例如:JIT)
在其中Python的解释器便是属于第二种,Python编码在初次运行时,它会将Python编码编译成字节码,假如可以的话,它会将这一字节码储存到.pyc文件中,那样下一次运行的过程中就不容易再编译这种编码反而是立即表述运行字节码。实际上,这类体制已经模糊不清解释器和编译器两者之间的界线,换句话说是模糊不清了解释型语言和编译型语言表达的界线。
根据JVM和解释器的定义回应,好像或是搞不懂为什么JVM就被称作vm虚拟机,JVM中有运行的是字节码,它很有可能同时被表述执行,也将会被再度编译成目标语言,Python中的解释器也会先预编译Python编码为字节码,再表述执行。那麼究竟有啥区别?
很多人参加了探讨,各自从不一样的方向去论述区别。
有些人觉得vm虚拟机是和语言表达不相干的,JVM为例子,除开Java以外,Scala,Clojure,乃至Python凭借Jython专用工具,还可以运行在JVM上,而没听闻什么语言能有Python解释器表述执行,除开Python。
也有些人从语言表达的种类上,Java为静态数据种类的语言表达,而Python为动态语言。这促使Java字节码既可以被表述执行还可以被编译成计算机指令再执行。而Python则繁杂多了,它尽管让程序猿可以没去关心自变量的种类,但解释器迫不得已去推论基本数据类型,这一定水平上危害特性。
也有见解觉得解释器是一个历史时间遗留下专业术语,当代语言表达中vm虚拟机和解释器的交界已经很模糊不清乃至不会有。
实际上,小编在《Learning Python》一书里,见到把创作者把Python的解释器称之为PVM,根据这一客观事实而言,自己更认可的是解释器和vm虚拟机的区别已经愈来愈小,已经是你中有我,我中有你的程度。单独的划分看来,很有可能还能区别这两步是解释器个人行为,这两步是vm虚拟机的个人行为,可是身为一个总体看来,二者的区别的确没那样显著。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。