PHP 是编译的还是解释的?

PHP 是编译的还是解释的?

111275 次浏览

PHP 是一个直译语言,用来解释 PHP 的二进制文件是编译的,而你写的东西是解释的。

你可以看到更多的 在维基百科的翻译语言页面上

PHP 是一个直译语言,但是可以通过第三方工具编译成字节码。

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

如果这还不够,考虑以下几点。Php (二进制文件)和 gcc 读取你的源代码并生成一个抽象语法树。在版本4和版本5中,php 遍历树将程序转换为字节码(编译步骤)。您可以看到使用 瓦肯逻辑翻斗车将字节码转换为操作码(类似于汇编)。最后,php (特别是 Zend 引擎)解释字节码。相比之下,gcc 遍历树并输出程序集; 它还可以运行汇编程序和链接器来完成流程。调用由一个“解释”程序处理的程序和由另一个“编译”程序处理的程序是没有意义的。毕竟,程序都是通过“编译器”运行的。

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

一般情况下,它是解释的,但有时可以使用它作为编译,它确实提高了性能。 执行此操作的开放源码工具: Hhvm.com

PHP 被编译成一个中间字节码,然后由运行时引擎进行解释。

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

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

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

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

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

至少它没有像人们希望的那样编译(或者我应该说优化)代码。

这个密码..。

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

... 程序每次运行都会有同样的延迟。

它可以检测到,这是一个计算,只需要做第一次。

编译代码可以由计算机的 CPU 直接执行。也就是说,可执行代码是用 CPU 的 本地人语言指定的。

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

说一种语言是解释或编译的并不恰当,因为解释和编译都是该特定语言的 实现的属性不是语言的属性本身。因此,任何语言都可以进行编译或解释ーー这取决于所使用的特定实现是什么。

最广泛使用的 PHP 实现由 Zend 引擎提供动力,简称为 PHP。Zend 引擎将 PHP 源编译成它可以执行的格式,因此 Zend 引擎作为 翻译工作。

我知道这个问题很老了,但是到处都有关联,我认为这里的所有答案都是不正确的(也许是因为它们很老了)。

直译语言或者编译语言。任何编程语言都可以进行解释和/或编译。

首先,一种语言只是一组规则,所以当我们讨论编译时,我们引用该语言的 具体实施方案

例如,HHVM 是 PHP 的一个实现。它使用 JIT 编译将代码转换为中间 HipHop 字节码,然后转换为机器代码。只说是编译的就够了吗?一些 Java 实现(并非全部)也使用 JIT。Google 的 V8也使用了 JIT。

使用编译和解释的旧定义在今天是没有意义的。

“ PHP 是否已编译?”是一个毫无意义的问题,因为没有 编译语言与货币之间较长的清晰和一致的分界线 解读一个。

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

编译语言 提前使用编译(C,C + +) ;

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

公认的答案显然是错误的。PHP 已编译。就这样。也许不是对本机指令,而是对解释的字节码。

请记住,如果您需要源代码每次运行该程序,这意味着它正在使用解释器。所以这是个直译语言。

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