当前位置: 首页 > news >正文

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

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














本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/1616091 ,如需转载请自行联系原作者


相关文章:

  • windows下 Oracle11完全卸载方法
  • linux 三剑客老大-awk
  • 基于Linux服务器的性能分析与优化(2)
  • mouseleave与mouseout区别
  • windows 7 与音频相关的几个服务
  • JavaScript精粹读书笔记(1,2)
  • restrore progress
  • 基于AJAX.NET技术的DataGrid控件开发
  • 将对象序列化和反序列化
  • 忘记linux中root密码怎么办?两种方法两步教你轻松搞定修改新的密码(仅限CentOS6.X)...
  • Oracle使用透明网关访问SQLSERVER数据库
  • Ts基础
  • SVN “不能打开文件“.svn/lock” 权限不够”精解
  • Oracle动态SQL和静态SQL比较
  • Android学习笔记--Content Provider 1
  • 自己简单写的 事件订阅机制
  • Computed property XXX was assigned to but it has no setter
  • css布局,左右固定中间自适应实现
  • DataBase in Android
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • isset在php5.6-和php7.0+的一些差异
  • java8 Stream Pipelines 浅析
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • nodejs:开发并发布一个nodejs包
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 成为一名优秀的Developer的书单
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 入手阿里云新服务器的部署NODE
  • 怎么将电脑中的声音录制成WAV格式
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $$$$GB2312-80区位编码表$$$$
  • (1)虚拟机的安装与使用,linux系统安装
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • ..回顾17,展望18
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .netcore 获取appsettings
  • .NET下ASPX编程的几个小问题
  • .NET中的Exception处理(C#)
  • .Net中间语言BeforeFieldInit
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [ C++ ] STL---string类的使用指南
  • [20171113]修改表结构删除列相关问题4.txt
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [C++]类和对象(中)
  • [cb]UIGrid+UIStretch的自适应
  • [CF]Codeforces Round #551 (Div. 2)
  • [CISCN2021 Quals]upload(PNG-IDAT块嵌入马)