为什么 PHP 使用操作码缓存,而 Java 编译为字节码文件?

2022-08-30 12:39:49

从我的角度来看,PHP和Java都有类似的结构。首先,编写一些高级代码,然后必须以更简单的代码格式转换这些代码,以便 VM 执行。一个区别是,PHP直接从源代码文件工作,而Java将字节码存储在.class文件中,VM可以从中加载它们。

如今,对快速执行PHP的要求越来越高,这导致人们相信最好直接使用操作码,而不是在每次用户点击文件时都经历编译步骤。

解决方案似乎是加载所谓的加速器,它们基本上将编译的结果存储在缓存中,然后使用缓存的操作码而不是再次编译。

Facebook完成的另一种方法是将PHP代码完全编译为其他语言。

所以我的问题是,为什么PHP世界中没有人做Java所做的事情?是否有一些动态元素确实需要每次都重新编译或类似的东西?否则,当代码投入生产时编译所有内容,然后使用它,这将是非常聪明的。


答案 1

最重要的区别是JVM有一个完全覆盖字节码的显式规范。这使得字节码文件具有可移植性和实用性,而不仅仅是由特定的JVM实现执行。

PHP甚至没有语言规范。PHP操作码是特定PHP引擎的实现细节,因此您无法真正使用它们做任何有趣的事情,并且使它们更明显也没有什么意义。


答案 2

PHP 操作码与 Java 类文件不同。Java 类文件已明确指定,并且可以在计算机之间移植。PHP操作码不能以任何方式移植。例如,它们具有内置的内存地址。它们严格来说是PHP解释器的实现细节,不应该被认为是像Java字节码一样的东西。

它必须这样吗?不,可能不是。但是PHP源代码是一团糟,PHP内部社区既没有意愿,也没有政治意愿来实现这一目标。我认为有人说要将操作码缓存烘焙到PHP 6中,但是PHP 6死了,我不知道这个想法的状态。

参考:我写了phc,所以我在PHP实现/编译方面工作了几年。


推荐