为什么PHP在编译为字节码文件时使用操作码缓存?

eri*_*ork 37 php apc

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

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

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

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

所以我的问题是,为什么PHP世界中没有人在做Java所做的事情?是否有一些动态元素确实需要每次重新编译或类似的东西?否则,在代码投入生产时编译所有内容然后只需使用它就会更加智能.

Mic*_*rdt 52

最重要的区别是JVM具有完全覆盖字节码的显式规范.这使得字节码文件可移植并且不仅仅用于特定JVM实现的执行.

PHP甚至没有语言规范.PHP操作码是特定PHP引擎的实现细节,因此您无法对它们执行任何有趣的操作,并且使它们更加可见是没有意义的.


Pau*_*gar 12

PHP操作码与Java类文件不同.Java类文件很好地指定,并且可以在机器之间移植.PHP操作码不以任何方式移植.例如,它们有内存地址.它们严格来说是PHP解释器的实现细节,不应被视为Java字节码.

它必须这样吗?不,可能不是.但是PHP源代码是混乱的,PHP内部社区既没有希望也没有政治意愿来实现这一点.我认为有人谈到将操作码缓存烘焙到PHP 6中,但PHP 6已经死了,我不知道这个想法的状态.

参考:我写过phc,所以我在PHP实现/编译方面已经很熟悉了几年.