Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 爪哇语;“虚拟机”;与Python相比”;口译员;用语_Java_Python_Jvm - Fatal编程技术网

Java 爪哇语;“虚拟机”;与Python相比”;口译员;用语

Java 爪哇语;“虚拟机”;与Python相比”;口译员;用语,java,python,jvm,Java,Python,Jvm,在Java中,总是使用“虚拟机”,而阅读Python中的“虚拟机”似乎很少见 两者都解释字节码;为什么一个称为虚拟机,另一个称为解释器?它们之间没有真正的区别,人们只是遵循创建者所选择的约定。使用不同术语的一个原因可能是,人们通常会考虑向python解释器提供原始的人类可读源代码,而不必担心字节码等 在Java中,必须显式编译成字节码,然后在VM上只运行字节码,而不是源代码 尽管Python在幕后使用虚拟机,但从用户的角度来看,大多数情况下都可以忽略这一细节 术语解释器是一个可以追溯到早期she

在Java中,总是使用“虚拟机”,而阅读Python中的“虚拟机”似乎很少见


两者都解释字节码;为什么一个称为虚拟机,另一个称为解释器?

它们之间没有真正的区别,人们只是遵循创建者所选择的约定。

使用不同术语的一个原因可能是,人们通常会考虑向python解释器提供原始的人类可读源代码,而不必担心字节码等

在Java中,必须显式编译成字节码,然后在VM上只运行字节码,而不是源代码


尽管Python在幕后使用虚拟机,但从用户的角度来看,大多数情况下都可以忽略这一细节

术语解释器是一个可以追溯到早期shell脚本语言的遗留术语。随着“脚本语言”演变成功能齐全的语言,其相应的平台变得更加复杂和沙盒化,虚拟机和解释器(在Python意义上)之间的区别非常小或根本不存在


Python解释器的工作方式仍然与shell脚本相同,因为它可以在不需要单独编译步骤的情况下执行。除此之外,Python解释器(或Perl或Ruby解释器)和Java虚拟机之间的区别主要在于实现细节。(有人可能会说Java比Python更完全沙盒化,但两者最终都通过本机C接口提供了对底层体系结构的访问。)

不要忘记Python有可用于x86的JIT编译器,这进一步混淆了问题。(见psyco)


只有在讨论VM的性能问题时,对“解释语言”进行更严格的解释才有用,例如,与Python相比,Ruby被认为(是?)更慢,因为它是一种解释语言,与Python不同——换句话说,上下文就是一切。

虚拟机是一个虚拟计算环境,它具有一组特定的原子定义良好的指令,这些指令独立于任何特定的语言而受支持,通常被认为是自身的沙箱。VM类似于特定CPU的指令集,倾向于在更基本的级别上工作,这些指令(或字节码)的基本构建块独立于下一个指令。指令仅基于虚拟机的当前状态确定地执行,而不依赖于该时间点指令流中其他位置的信息

另一方面,解释器更复杂,因为它被定制为解析特定语言和特定语法的某些语法流,这些语法流必须在周围标记的上下文中解码。您不能孤立地查看每个字节甚至每一行,并确切地知道下一步要做什么。语言中的标记不能像相对于VM的指令(字节码)那样单独使用

Java编译器将Java语言转换为字节码流,与C编译器将C语言程序转换为汇编代码没有什么不同。另一方面,解释器并不真正将程序转换成任何定义良好的中间形式,它只是将程序操作作为解释源代码的过程

VM和解释器之间区别的另一个测试是,您是否认为它与语言无关。我们所知道的Java虚拟机并不是真正特定于Java的。您可以使用其他语言制作编译器,生成可以在JVM上运行的字节码。另一方面,我不认为我们真的会想到将Python以外的其他语言“编译”成Python以供Python解释器解释


由于解释过程的复杂性,这可能是一个相对缓慢的过程……特别是解析和识别语言标记等,并理解源代码的上下文,以便能够在解释程序内执行过程。为了帮助加速这种解释语言,我们可以在这里定义更容易直接解释的预解析、预标记化源代码的中间形式。这种二进制形式仍然是在执行时解释的,它只是从人类可读性差得多的形式开始,以提高性能。然而,执行该表单的逻辑不是一个虚拟机,因为这些代码仍然不能单独获取——周围令牌的上下文仍然很重要,它们现在处于一种不同的更高效的计算机形式。

解释器将源代码翻译成一些高效的中间表示(代码)并立即执行

虚拟机,显式执行由编译器构建的存储预编译代码,该编译器是解释器系统的一部分

虚拟机的一个非常重要的特性是,内部运行的软件仅限于虚拟机提供的资源。确切地说,它无法脱离其虚拟世界。想想远程代码的安全执行,Java小程序

在python的例子中,如果我们保留pyc文件,正如本文的评论中所提到的,那么该机制将变得更像一个虚拟机,并且该字节码执行速度更快——它仍然可以被解释,但它的形式更加计算机友好。如果我们从整体上看,PVM是Python解释器的最后一步

底线是,当引用Python解释器时,它意味着我们将它作为一个整体引用,当我们说PVM时,这意味着我们只是在谈论Python解释器的一部分,一个运行时环境。与Java类似,我们指的是Differentityl、JRE、JVM、JDK等不同部分

更多信息,请参阅维基百科条目