【发布时间】:2010-12-03 15:14:15
【问题描述】:
PHP 是编译还是解释?
【问题讨论】:
标签: php
PHP 是编译还是解释?
【问题讨论】:
标签: php
PHP 是一种解释型语言。让您解释 PHP 的二进制文件已编译,但您编写的内容已被解释。
【讨论】:
两者兼而有之。 PHP 被编译成中间字节码,然后由运行时引擎解释。
PHP 编译器的工作是解析您的 PHP 代码并将其转换为适合运行时引擎的形式。其任务包括:
根据您的 PHP 设置,此步骤通常只执行一次,即第一次调用脚本时。编译器输出被缓存以加快后续使用的访问。但是,如果修改了脚本,则会再次完成编译步骤。
在调用脚本时,运行时引擎会遍历 AST 和字节码。符号表用于存储变量的值,并为函数提供字节码地址。
这种编译成字节码并在运行时解释它的过程对于在某种虚拟运行时机器上运行的语言来说是典型的,包括 Perl、Java、Ruby、Smalltalk 等。
【讨论】:
编译后的代码可以直接由计算机的 CPU 执行。也就是说,可执行代码以 CPU 的本机语言指定。
解释语言的代码必须在运行时从任何格式翻译成 CPU 机器指令。此翻译由口译员完成。
说一种语言被解释或编译是不恰当的,因为解释和编译都是该特定语言的实现的属性,而不是该语言的属性 一样。因此,任何语言都可以被编译或解释——它只取决于您使用的特定实现是做什么的。
使用最广泛的 PHP 实现由 Zend 引擎 提供支持,简称为 PHP。 Zend 引擎将 PHP 源代码编译成它可以执行的格式,因此 Zend 引擎 可以作为 解释器。
【讨论】:
通常它是被解释的,但有些时候可以将它用作编译的,它确实提高了性能。 执行此操作的开源工具: hhvm.com
【讨论】:
PHP 是一种解释型语言。不过,它可以通过第三方工具编译成字节码。
【讨论】:
我知道这个问题很老,但它到处都有联系,我认为这里的所有答案都是不正确的(可能是因为它们太老了)。
没有解释语言或编译语言之类的东西。任何编程语言都可以被解释和/或编译。
首先,一种语言只是一组规则,所以当我们谈论编译时,我们指的是该语言的特定实现。
例如,HHVM 是 PHP 的一种实现。它使用 JIT 编译将代码转换为中间 HipHop 字节码,然后再翻译成机器码。说它是编译的就足够了吗?一些 Java 实现(不是全部)也使用 JIT。 Google 的 V8 也使用 JIT。
现在使用编译与解释的旧定义没有意义。
"PHP 编译了吗?"是一个无意义的问题,因为没有 在什么是编译语言与一个 解释一个。
一种可能的分隔方式是(我在这种二分法中找不到任何意义):
编译语言使用 Ahead of Time 编译(C、C++);
解释型语言使用即时编译或根本不编译(Python、Ruby、PHP、Java)。
【讨论】:
in most cases,是的。在所有情况下,不。所以你不能画一条在语义上有意义且同意的线。
这是一个毫无意义的问题。 PHP 使用 yacc (bison),就像 GCC。 yacc 是一个“编译器编译器”。 yacc 的输出是一个编译器。编译器的输出是“编译的”。 PHP 由 yacc 的输出解析。因此,根据定义,它是编译的。
如果不满足,请考虑以下内容。 php(二进制文件)和 gcc 都读取您的源代码并生成抽象语法树。在版本 4 和 5 下,php 然后遍历树将程序转换为字节码(编译步骤)。您可以使用Vulcan Logic Dumper 将字节码转换为操作码(类似于汇编)。最后,php(特别是 Zend 引擎)解释字节码。相比之下,gcc 遍历树并输出程序集;它还可以运行汇编器和链接器来完成该过程。调用由一个“解释”处理的程序和另一个由另一个“编译”处理的程序是没有意义的。毕竟,程序都是通过一个“编译器”运行的。
您实际上应该问您想问的问题。 (“我是否会因为 PHP 为每个请求重新编译我的源代码而付出性能损失?”等)
【讨论】:
至少它不会像人们想要的那样编译(或者我应该说优化)代码。
这段代码...
for($i=0;$i<100000000;$i++);
echo $i;
...每次运行都会延迟程序。
它可能已经检测到这是一个只需要在第一次完成的计算。
【讨论】:
请记住,如果每次运行程序都需要源代码,则意味着它正在使用解释器。所以它是一种解释型语言。
另一方面,如果您编译了源代码并生成了可以执行的编译代码,那么它正在使用编译器。在这里,您不需要源代码。喜欢C、JAVA
【讨论】:
接受的答案是公然错误的。 PHP 已编译。故事结局。也许不是针对本机指令,而是针对解释的字节码。
【讨论】: