是PHP编译还是解释?

nic*_*cky 129 php

是PHP编译还是解释?

Thi*_*tte 120

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

您可以在维基百科页面上查看解释语言的更多信息

  • 他的意思是编译了php(或windows php.exe)这个实用程序. (25认同)
  • @nicky这意味着编译用于解释PHP的程序,但PHP本身被解释. (6认同)
  • 但为什么它在维基百科中这样提到了?http://goo.gl/YOwZ从PHP 4开始,PHP解析器编译输入以生成字节码以供Zend Engine处理,从而提高了其解释器前身的性能. (5认同)
  • @kiranvj它确实是为了改进性能而编译的,但是在运行时.将"编译语言"视为"预编译",将解释语言视为"运行时编译".这是两者之间的区别: - JIT("及时"),只需要在需要时编译所需的代码(注意,在解释器退出后,编译的代码很多) - AOT("提前"),*all*代码在运行之前编译. (5认同)
  • @kiranvj:我相信OP想知道PHP是否被编译为本机代码.将它编译为字节码,然后由Zend再次解释,在编译成本和运行时性能方面处于中间位置.大声笑,这是一个相当古老的线程,只是实现了它. (3认同)

Bar*_*own 58

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

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

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

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

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

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


Max*_*Max 16

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


cod*_*gar 14

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

  • "目标代码"只是CPU指令解码器的字节代码.(你不认为CPU实际上有像"CMPSB"这样的原生指令,对吧?) (7认同)
  • “字节码”是用于VM特定伪指令的术语,它不是本机的,因此在这种情况下不能视为“编译”。 (2认同)

Gau*_*nde 10

一个编译后的代码可以直接通过电脑的CPU来执行.也就是说,可执行代码以CPU的本机语言指定

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

说解释或编译语言是不恰当的,因为解释和编译都是该特定语言的实现属性,而不是语言本身的属性.因此,任何语言都可以编译或解释 - 它只取决于您正在使用的特定实现.

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

谢谢 :)

  • "*也就是说,可执行代码是用CPU的本地语言*指定的."可执行代码没有用**CPU的本地语言**指定,但是以二进制格式,CPU的本机语言可以是任何东西,当软件二进制文件没有时来自这个CPU或那个CPU ..一个完全编译和可执行的代码将是二进制格式.. (2认同)

jro*_*way 8

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

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

你实际上应该问你要问的问题.("我是否因为PHP为每个请求重新编译我的源代码而支付性能损失?"等)

  • 让我们不要监督那个人是初学者.这使得我将这个问题解释为"Zend实现是否使用PHP源生成本机代码?".看看我的答案.我认为你对问题的提问方式过于严格.你知道,我们正在努力帮助,而不是打击一些新手. (6认同)
  • 对源代码进行标记不是编译.甚至VBScript也可以视为您定义的编译语言. (5认同)
  • 虽然它并没有真正回答OP的问题,但我对此表示反对.创建语言分类法很有诱惑力,其中每种语言都清晰地放在每个类别中.但现实并不是那么整洁.几乎每种语言都融合了各种特征.此外,当您接下来时,处理器"解释"本机代码. (5认同)
  • 你的高级断言是正确的,这*是一个毫无意义的问题.然而,你的论点并不是很有帮助,你所做的就是采用模糊定义并将其置于极端.编译是将源转换为目标代码.是的,您可以考虑将源转换为具体/抽象语法树的编译,但这不是大多数人的意思吗?无论如何,这是一个毫无意义的问题,因为语言不是*内在*编译或解释,语言的实现是编译或解释的. (4认同)
  • 我完全同意塞达特。您可以分享自己的知识,而无需向要求者提问 (3认同)

Cla*_*nga 7

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

NO作为一种解释语言或编译语言这样的事情。可以解释和/或编译任何编程语言。

首先,一种语言只是一组规则,所以当我们谈论编译时,我们指的是该语言的特定实现

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

如今,使用已编译与已解释的旧定义已无济于事。

“ PHP是否已编译?” 鉴于在已编译语言与已解释语言之间不再存在明确且一致的定界符,这是一个荒谬的问题。

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

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

解释语言使用即时编译或根本不编译(Python,Ruby,PHP,Java)。