看到Stackoverflow上有个问题在讨论Java和Python的对比,其中就有人问答为啥Java的运行环境被称之为JVM,而Python的只能叫做Interpreter。
这个问题估计想过的人不多,先找维基百科看一下虚拟机的定义。
虚拟机的定义有2个,一种是类似Vmware的系统虚拟机,另一种是虚拟机称之为程序虚拟机,诸如JVM,CLR就是最常见到的虚拟机。
程序虚拟机也称作托管运行时环境,运行这个虚拟机时,就好比普通的OS中的一个进程。当这个进程启动时,虚拟机启动,当进程销毁时,虚拟机销毁。使用虚拟机的目的就是提供一个和平台无关的编程环境。
JVM中的执行引擎只能处理编译后的Java字节码,字节码处理引擎其实包含一个字节码解释器和一个JIT编译器(和.net的CLR中JIT差别很大),解释器逐条的执行字节码指令,速度稍慢。JIT编译器则会将热点代码编译缓存起来,因此执行速度加快。
解释器的概念比较简单,它可以将代码翻译,并运行,不需要经过编译,JVM中的解释器正式这样的,JVM中解释的就是字节码。解释器运行程序的方法有3种:
-
直接运行高级编程语言(如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则复杂多了,它虽然让程序员可以不去关注变量的类型,但解释器不得不去推断数据类型,这一定程度上影响性能。
还有观点认为解释器是一个历史遗留术语,现代语言中虚拟机和解释器的分界已经很模糊甚至不存在。
事实上,笔者在《Learning Python》一书中,看到把作者把Python的解释器称为PVM,基于这个事实来讲,本人更认同的是解释器和虚拟机的区别正在越来越小,已经是我中有你,你中有我的地步。独立的分割来看,可能还能区分这几步是解释器行为,这几步是虚拟机的行为,但是作为一个整体来看,两者的区别确实没那么明显。
本文出自 “一只博客” 博客,请务必保留此出处http://cnn237111.blog.51cto.com/2359144/1616091
分享到:
相关推荐
在调用时,需要指定Python解释器的路径以及要执行的Python脚本的完整路径。 3. **参数传递**: Java可以通过命令行参数向Python脚本传递数据。这些参数在Python脚本中通过`sys.argv`获取,其中`sys.argv[0]`是脚本...
- Python代码不需要编译,可以直接由解释器执行。这种即时编译方式让Python的开发效率更高,尤其适合快速开发和迭代。 3. 静态类型与动态类型: - Java是一种静态类型语言,类型检查在编译时进行,有助于提前发现...
2. **Jython**:基于Java平台的Python解释器,它将Python代码转换为Java字节码,可以在Java虚拟机(JVM)上运行。这使得Jython可以利用Java的生态系统和跨平台特性。 3. **IronPython**:与Jython类似,IronPython...
2. 解释型语言:如Python,代码在运行时由解释器逐行解释执行,不需要预先转换为机器码。解释器在执行过程中解析代码并调用相应功能,因此具有良好的跨平台性。 三、Java的执行过程 Java程序的执行涉及到以下几个...
通过研究whitepy的源代码,开发者可以更深入地理解Python解释器的工作流程,这对于优化Python代码、调试或构建自定义Python环境都有很大帮助。此外,这个项目也提供了一个学习编译原理和Python内部机制的实践平台。 ...
- **Ruby/Python**:这些脚本语言则通常是在运行时通过解释器来执行,它们的代码不需要预先编译为机器码,因此可以在多种平台上运行,但执行效率相对较低。 而Java的编译与执行方式结合了这两者的优点,具体表现在...
Python有一个名为Jython的实现,它允许Python代码运行在Java虚拟机(JVM)上,使得Python能够利用Java的类库和资源。此外,通过使用像Py4J这样的库,Python程序员可以控制Java对象,实现两者的无缝集成。 对于.NET...
Python的解释器分为两个主要部分:Python解释器和Python虚拟机(Python Virtual Machine,PVM)。当Python源代码(.py文件)被运行时,解释器首先会读取源代码并将其编译成字节码,这一步叫做编译。字节码是一种中间...
Java作为一种广泛使用的编程语言,其核心优势之一便是“一次编写,到处运行”的特性,这背后的关键技术支撑即为Java虚拟机(JVM)。JVM是一种抽象计算模型,允许Java程序在多种平台上运行而无需重新编译。 ##### ...
安装完成后,系统会自动配置环境变量,使得用户可以直接在命令行中使用`python`或`python3`命令启动Python解释器。 Python 3.7.5版本引入了一些新特性和改进,例如优化的类型注解支持、新的数据结构、性能提升以及...
这涉及到Jython(Java版本的Python解释器)或通过Python的Jython库来实现。 总的来说,这份"Java Python 个人学习笔记"将帮助你深入理解这两种语言,并为你的编程生涯打下坚实的基础。无论是打算从事后端开发、数据...
标题中的"python-javabridge-4.0.3-cp39-cp39-win-amd64.zip"是该库的一个特定版本,表明它是Python-JavaBridge的4.0.3版,适用于Python 3.9解释器,且是为64位Windows系统编译的。"cp39"代表Python的版本,"win-amd...
Java虚拟机是运行Java程序的核心引擎,负责将Java字节码转换为运行在特定硬件平台上的机器码。JVM提供了跨平台的兼容性,允许Java程序“一次编写,到处运行”。它包括了执行引擎、内存管理、垃圾回收机制、类加载器...
2. **跨平台**:Java通过JVM(Java虚拟机)实现跨平台,一次编写,到处运行。JVM提供了与硬件平台无关的运行环境。 3. **编译型语言**:Java源代码需要先编译为字节码,然后在JVM上运行。这使得Java在运行速度上...
Python-for-Android可以创建一个包含Python解释器和所需库的APK,而Kivy是一个跨平台的GUI库,可用于构建用户界面。通过这种方式,你可以在Android上直接运行Python代码,但需要注意性能和资源消耗问题。 2. **...
将Python与GraalVM结合,可以创建一个快速、高效的Python解释器,这正是“Python-构建在GraalVM之上的一个Python 3实现”所关注的重点。 GraalVM的Python实现,通常称为GraalPython或TrufflePython,是基于GraalVM...
2. **编译器/解释器**:Python的标准解释器是CPython,它是一个C语言实现的解释器。除此之外,还有Jython(Java实现)、IronPython(.NET实现)等,它们允许Python代码运行在不同的平台上。 3. **包管理器**:pip是...
2. 解释型语言:Python是一种解释型语言,代码在运行时被解释器逐行执行,而不是先被编译成机器码再运行。这种特性使得Python开发快速且易用。 3. 动态类型系统:Python采用动态类型系统,变量的类型在运行时确定,...
JPype创建了一个桥接,允许Python解释器直接与Java虚拟机(JVM)通信。这使得Python开发者可以利用Java的高性能计算能力、企业级库,以及Android开发等领域的资源。使用JPype,Python代码可以创建Java对象,调用其...