Answers:
PHP是一种解释型语言。使您可以解释PHP的二进制文件已编译,但是您编写的内容得到了解释。
您可以在Wikipedia页面上看到更多有关口译语言的信息
都。PHP被编译为中间字节码,然后由运行时引擎解释。
PHP编译器的工作是解析您的PHP代码,并将其转换为适合运行时引擎的形式。其任务包括:
根据您的PHP设置,此步骤通常在第一次调用脚本时仅执行一次。缓存编译器输出以加快后续使用的访问速度。但是,如果脚本被修改,则再次执行编译步骤。
调用脚本时,运行时引擎将遍历AST和字节码。符号表用于存储变量的值并提供函数的字节码地址。
对于在某种虚拟运行时机器(包括Perl,Java,Ruby,Smalltalk等)上运行的语言而言,这种编译为字节码并在运行时进行解释的过程是典型的。
PHP是一种解释型语言。但是,可以通过第三方工具将其编译为字节码。
一个编译后的代码可以直接通过电脑的CPU来执行。即,以CPU的本地语言指定可执行代码。
解释语言的代码必须在运行时从任何格式转换为CPU机器指令。该翻译由口译员完成。
不能说一种语言是解释性或编译性的,因为解释性和编译性都是该特定语言实现的属性,而不是该语言本身的属性。因此,任何语言都可以编译或解释-这仅取决于您所使用的特定实现。
最广泛使用的PHP实现由Zend Engine提供支持,并简称为PHP。ZendEngine将PHP源代码编译为可以执行的格式,因此Zend Engine充当解释器。
这是一个毫无意义的问题。与GCC一样,PHP使用yacc(野牛)。yacc是一个“编译器编译器”。yacc的输出是一个编译器。编译器的输出是“已编译”。PHP由yacc的输出解析。因此,按照定义,它已编译。
如果不满意,请考虑以下事项。php(二进制)和gcc均读取您的源代码并生成抽象语法树。在版本4和5下,php然后遍历树将程序转换为字节码(编译步骤)。您可以看到使用Vulcan Logic Dumper将字节码转换为操作码(类似于汇编)。最后,php(特别是Zend引擎)解释字节码。相比之下,gcc走树并输出程序集;它还可以运行汇编器和链接器以完成该过程。调用由一个“解释的”处理的程序和由另一个“已编译的”处理的另一个程序是没有意义的。毕竟,程序都通过两者的“编译器”运行。
实际上,您应该问自己想问的问题。(“由于PHP为每个请求重新编译我的源代码,我是否要付出性能损失?”等)
我知道这个问题很旧,但是到处都有联系,我认为这里的所有答案都不正确(也许是因为它们很旧)。
有NO作为一种解释语言或编译语言这样的事情。可以解释和/或编译任何编程语言。
首先,一种语言只是一组规则,所以当我们谈论编译时,我们指的是该语言的特定实现。
例如,HHVM是PHP的实现。它使用JIT编译将代码转换为中间的HipHop字节码,然后转换为机器码。说它已编译就足够了吗?一些Java实现(并非全部)也使用JIT。Google的V8也使用JIT。
如今,使用已编译与已解释的旧定义已无济于事。
“ PHP是否已编译?” 鉴于在已编译语言与已解释语言之间不再存在明确且一致的定界符,这是一个荒谬的问题。
分隔它们的一种可能方法是(在这种二分法中我找不到任何含义):
编译语言使用Ahead of Time编译(C,C ++);
解释语言使用即时编译或根本不编译(Python,Ruby,PHP,Java)。
in most cases
,是的。在所有情况下,都不是。因此,您不能划出一条在语义上有意义且一致的线。
至少它不会像人们想要的那样编译(或应该说优化)代码。
此代码...
for($i=0;$i<100000000;$i++);
echo $i;
...在每次运行时都会使程序延迟相等。
它可能已经检测到这是只需要第一次进行的计算。