【问题标题】:Does PHP have a virtual machine like Java?PHP 有像 Java 这样的虚拟机吗?
【发布时间】:2011-03-23 18:36:11
【问题描述】:

PHP 有像 Java 这样的虚拟机吗?

【问题讨论】:

标签: java php virtual-machine


【解决方案1】:

是的,但只是最近它才很像 Java 的 JVM。它是由 facebook 发明的,并在另一周(2013 年 7 月)的 OSCON 会议上宣布。

关于新 PHP 虚拟机的新闻报道可以阅读here,代码和更多信息可以在github 找到。

【讨论】:

    【解决方案2】:

    Zend 引擎和典型 JVM 的另一个重要区别在于它们执行字节码的方式:

    • Zend 引擎直接执行(解释)已编译的字节码。 (至少我认为是这样。我无法从 Zend 在线文档中确认这一点!)
    • JVM 通常会使用 JIT 编译器将字节码编译为本机指令,然后执行本机指令。

    实际上,JVM 的行为比这更复杂。 JVM 并不总是编译为本机代码,当他们这样做时,他们通常会延迟 JIT 编译,直到他们认为值得这样做。在此之前,它们直接执行字节码。

    【讨论】:

    • 查看 Zend 的源代码表明它确实直接解释了字节码,而不是将其转换为本机。而且代码也不漂亮……
    • 在单步执行 php 源代码时,我有很多“哔哔”的感觉,但坦率地说,zend 引擎的 vm 元素不在其中。和其他语言相比……嗯,大部分都是这样的。
    【解决方案3】:

    是的。

    独立于运行 PHP 的平台,脚本被编译成相同的字节码并由 Zend 引擎运行。

    与 Java 的不同之处在于,编译后的代码通常不会存储到单独的文件中,并且每次执行时都会重新编译脚本(不过,请参阅操作码缓存)。

    【讨论】:

    • Zend Engine 和 JVM 的概念有区别吗?
    • @Chris 这个问题很模糊,我没有足够的 JVM 实现来草拟答案。
    • @Chris 你可以尝试标记这个问题 java 以获得一些关注。
    • 你对JVM不太了解,但是你对Zend Engine了解一点吗?比如,如果它将 Zend Engine 字节码重新编译为本机字节码?这可能是一个概念上的差异。
    • @EJF 一旦你开始添加操作码缓存,这种差异就不是那么大了,但我们可以指出一个差异:编译并不是在脚本执行之前完成的,例如,include 指令,可能会在执行开始后触发编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 2017-10-28
    • 2012-07-15
    • 2023-03-17
    • 2016-05-10
    • 2019-09-23
    • 2011-07-13
    相关资源
    最近更新 更多