PHP是否有像Java一样的虚拟机?

13

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


4
PHP有虚拟机吗?当然可以。像JVM那样吗?完全不一样。 - L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
现在也有一个非常类似于JVM的虚拟机。请参见:https://github.com/Facebook/hiphop-php/wiki - Samuel Lampa
3个回答

18

是的。

与 PHP 运行在的平台无关,脚本被编译为相同的字节码并由 Zend 引擎运行。

与 Java 不同之处在于,这些编译好的代码通常不会被存储为单独的文件,在每次执行时重新编译脚本(但参见 opcode 缓存)。


1
Zend引擎和JVM之间有概念上的差异吗? - Christopher Altman
1
@Chris 这个问题非常模糊,我对JVM实现的了解不足,甚至无法勾画一个答案。 - Artefacto
@Chris 你可以尝试标记这个问题为Java以吸引更多关注。 - Artefacto
2
@EJF 当你开始添加操作码缓存时,这种差异并不是很大,但我们可以指出一个区别:编译不是在脚本执行之前全部完成的,例如 include 指令可能会在执行开始后触发编译。 - Artefacto
除了Zend引擎之外,还有Facebook的HipHop虚拟机(HHVM)、IBM的WebSphere sMash、Caucho的Quercus和Phalanger。 - Paulius
显示剩余5条评论

6
Zend引擎和典型JVM之间的另一个重要区别在于它们执行字节码的方式:
- Zend引擎直接执行(解释)编译后的字节码。(至少我认为是这样。我无法从Zend在线文档中确认!) - JVM通常使用JIT编译器将字节码编译为本地指令,然后执行本地指令。
实际上,JVM的行为比这更复杂。JVM并不总是编译为本地代码,而且当它们这样做时,它们通常会延迟JIT编译,直到它们认为值得这样做。在此之前,它们直接执行字节码。

2
查看Zend的源代码可以发现它确实直接解释字节码,而不是将其转换为本地代码。而且这段代码也不太好看... - siride
1
当我逐步查看PHP源代码时,我遇到了许多“什么鬼”的时刻,但坦率地说,Zend引擎的VM元素并不在其中。与其他语言相比...嗯,它们大多数都是这样的。 - VolkerK

-1

是的,但直到最近才像 Java 的 JVM 一样。它是由 Facebook 发明,并于 OSCON 大会上宣布(2013 年 7 月)。

有关新 PHP VM 的新闻报道可以在这里阅读,代码和更多信息可以在github上找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接