文档章节

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

AlexMahoneFBI
 AlexMahoneFBI
发布于 2015/03/07 18:55
字数 1063
阅读 390
收藏 7

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

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

虚拟机的定义有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,基于这个事实来讲,本人更认同的是解释器和虚拟机的区别正在越来越小,已经是我中有你,你中有我的地步。独立的分割来看,可能还能区分这几步是解释器行为,这几步是虚拟机的行为,但是作为一个整体来看,两者的区别确实没那么明显。


本文转载自:http://cnn237111.blog.51cto.com/2359144/1616091

AlexMahoneFBI
粉丝 14
博文 44
码字总数 15083
作品 0
海淀
私信 提问
python解析器--版本--IDE环境

-- --python 版本---解析器---------------------------------------------------------------------------- -- --5-----------Python 工具-------------数据专家必知必会的 7 款 Python 工具......

liapple6
2018/10/28
0
0
为什么有这么多 Python?

Python是出类拔萃的 然而,这是一句非常模棱两可的话。这里的"Python"到底指的是什么? 是Python的抽象接口吗?是Python的通用实现CPython吗(不要把CPython跟Cython搞混了)?亦或者指的完全...

renwofei423
2013/09/27
23.6K
32
[转] 五大基于JVM的脚本语言

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 能运行在Java的虚拟机J...

小编辑
2011/07/06
2.4K
4
Python:经过了十几年,你们还没有消除的对我的误解吗?

摘要: 大学毕业到现在用的最多的编程语言还是C,C++,后来学习了一下Python,觉得Python是门学了不后悔的语言。尤其适合非程序员学习,作为青少年学习计算机的首门语言也不错,大学生学习计...

雁横
2018/05/03
0
0
8 个 Python 编程语言的变种

1. PyPy PyPy 是用Python实现的Python解释器。PyPy比CPython是更加灵活,易于使用和试验,以制定具体的功能在不同情况的实现方法,可以很容易实施。 该项目的目标是,让PyPy比C实现的Python更...

oschina
2012/09/26
5K
18

没有更多内容

加载失败,请刷新页面

加载更多

再一次生产 CPU 高负载排查实践

前言 前几日早上打开邮箱收到一封监控报警邮件:某某 ip 服务器 CPU 负载较高,请研发尽快排查解决,发送时间正好是凌晨。 其实早在去年我也处理过类似的问题,并记录下来:《一次生产 CPU ...

crossoverJie
15分钟前
1
0
Java的线程同步和并发问题示例

并发问题 多线程是一个非常强大的工具,它使我们能够更好地利用系统的资源,但我们需要在读取和写入多个线程共享的数据时特别小心。 当多个线程尝试同时读取和写入共享数据时,会出现两种类型...

hiuh
今天
4
0
Spring Boot 常用注解说明

实体类 @Entity (实体类注解) @Table(可指定表名) @Data(可缺省get/set) @Id (指定属性主键) @GeneratedValue(指定主键生成规则)

兜兜毛毛
今天
3
0
局域网能互相ping通,ubuntu虚拟机不能上外网

【问题】 桥接模式老是无法上网,查看本机IP发现被分配了一个私网地址,猜测应该是虚拟DHCP服务器没有打开,于是查看Ubuntu的网络配置: /etc/network/interfaces 发现没有dhcp配置的信息,只...

tahiti_aa
今天
2
0
以太坊助记词PHP开发包简介

以太坊助记词PHP开发包用来为PHP以太坊应用增加助记词和层级确定密钥支持能力。下载地址:以太坊助记词php开发包 。 1、开发包概述 以太坊助记词PHP开发包主要包括以下特性: 生成符合BIP39...

汇智网教程
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部