是PHP编译还是解释?

时间:2009-10-03 19:56:02

标签: php

PHP是编译还是解释?

16 个答案:

答案 0 :(得分:110)

解释PHP语言。可以编译允许您解释PHP的二进制文件,但是您编写的内容将被解释。

您可以看到更多on the wikipedia page for Interpreted languages

答案 1 :(得分:53)

两者。 PHP被编译为中间字节码,然后由运行时引擎解释。

PHP编译器的工作是解析PHP代码并将其转换为适合运行时引擎的形式。其任务包括:

  • 忽略评论
  • 解析变量,函数名称等,并创建符号表
  • 构建程序的抽象语法树
  • 写字节码

根据您的PHP设置,此步骤通常只执行一次,第一次调用脚本。缓存编译器输出以加速后续使用的访问。但是,如果修改了脚本,则再次完成编译步骤。

运行时引擎在调用脚本时遍历AST和字节码。符号表用于存储变量的值,并为函数提供字节码地址。

这种编译为字节码并在运行时解释它的过程对于在某种虚拟运行时机器上运行的语言是典型的,包括Perl,Java,Ruby,Smalltalk等。

答案 2 :(得分:16)

通常它被解释,但有些时候可以使用它作为编译,它确实提高了性能。 用于执行此操作的开源工具: hhvm.com

答案 3 :(得分:14)

PHP是一种解释型语言。但是,它可以通过第三方工具编译为字节码。

答案 4 :(得分:8)

这是一个毫无意义的问题。 PHP使用yacc(bison),就像GCC一样。 yacc是一个“编译器编译器”。 yacc的输出是编译器。编译器的输出是“编译”的。 PHP由yacc的输出解析。因此,根据定义,它是编译的。

如果不满足,请考虑以下事项。 php(二进制)和gcc都会读取您的源代码并生成一个抽象语法树。在版本4和5下,php然后遍历树以将程序转换为字节码(编译步骤)。您可以使用Vulcan Logic Dumper将字节码转换为操作码(类似于汇编)。最后,php(特别是Zend引擎)解释字节码。相比之下,gcc遍历树并输出汇编;它还可以运行汇编程序和链接器来完成该过程。调用由一个“解释”处理的程序和由另一个“编译”处理的另一个程序是没有意义的。毕竟,程序都通过两个“编译器”运行。

你应该问你想问的问题。 (“我是否因为PHP为每个请求重新编译我的源代码而支付性能损失?”等等。)

答案 5 :(得分:8)

编译代码可以由计算机的CPU直接执行。也就是说,可执行代码在CPU的原生语言

中指定

解释语言的代码必须在运行时从任何格式转换为CPU机器指令。翻译由翻译完成。

说一种语言被解释或编译是不恰当的,因为解释和编译都是该特定语言的属性,而不是语言的属性< / strong>本身。因此,任何语言都可以编译或解释 - 它只取决于您使用的特定实现方式。

最广泛使用的PHP实现由 Zend Engine 提供支持,简称为PHP.Zend Engine将PHP源编译为可以执行的格式,因此 Zend引擎< / strong>作为解释器

谢谢你:)

答案 6 :(得分:6)

我知道这个问题已经过时了,但它在各处都有联系,我认为这里的所有答案都是错误的(也许是因为它们已经老了)。

解释语言或编译语言有 NO 之类的东西。可以解释和/或编译任何编程语言。

首先,语言只是一组规则,因此当我们讨论编译时,我们会参考该语言的特定实现

例如,

HHVM 是PHP的一个实现。它使用JIT编译将代码转换为中间HipHop字节码,然后转换为机器代码。是否足以说它是编译的?一些Java实现(不是全部)也使用JIT。谷歌的V8也使用JIT。

现在使用编译与解释的旧定义没有意义。

  

&#34; PHP编译了吗?&#34;鉴于没有,这是一个非感性的问题   在编译语言与编译语言之间有更长的清晰和商定的分隔符   解释了一个。

划分它们的一种可能方法是(我在这种二分法中找不到任何意义):

编译语言使用Ahead of Time编译(C,C ++);

解释型语言使用Just in Time编译或根本不编译(Python,Ruby,PHP,Java)。

答案 7 :(得分:3)

至少它不会编译(或者我应该说是优化)代码,就像人们想要的那样。

此代码......

for($i=0;$i<100000000;$i++);
echo $i;

...每次运行时都会延迟程序。

它可能检测到这是一个只需要第一次完成的计算。

答案 8 :(得分:3)

PHP是一种解释型语言,但用于解释PHP的程序是编译

PHP编译器生成字节码,这是机器独立的,后来这个字节码通过运行时引擎转换为机器可理解的代码。

答案 9 :(得分:2)

请记住,如果您每次运行程序都需要源代码,则意味着它正在使用解释器。所以它是一种解释型语言。

另一方面,如果你编译了源代码并生成了一个可以执行的编译代码,那么它就是在使用编译器。在这里,您不需要源代码。像C、JAVA

答案 10 :(得分:1)

显然php.exe(PHP解释器)是一个已编译的可执行文件。

但是,我并不认为这就是你所问的。

当加载PHP脚本时,它会将编译转换成称为Zend操作码的二进制格式到内存中,然后对其进行有效解释。

来源:https://stackoverflow.com/a/18595821/3881189

答案 11 :(得分:0)

编译器和解释器的传统分类在即时编译和字节码解释的情况下是模糊的。解释了PHP。但是,这并不意味着PHP没有被编译.PHP编译器执行语法检查,中间代码生成和optimize.PHP被解释是因为PHP编译器生成的目标代码由另一个预编译的本机二进制文件解析。它将中间代码解释为cpu可读指令。这就是为什么在指令执行方面没有其他语言可以像汇编语言一样首先。因为,指令汇编程序(汇编编译器)产生已经存在于cpu中。

答案 12 :(得分:0)

它被解释为PHP代码由引擎解释(通常首先转换为字节码);它也被编译为一些工具可以将PHP代码编译成可执行文件,如phc。

答案 13 :(得分:0)

公认的答案是错误的。 PHP已编译。故事结局。也许不是本地指令,而是解释后的字节码。

答案 14 :(得分:-1)

它的解释。因此,当您在代码中添加太多注释时请记住这一点......

答案 15 :(得分:-1)

php是Interpreter,你不编译它,你将它保存在文件中,服务器逐行读取它。编译C ++,编译整个脚本,然后运行exe程序。现在做出改变太迟了。