0

我总是看到 parsecompile在技术文章中。所以我想知道 PHP 是如何工作的。我发现 PHP 是解释型语言,而不是编译型。我在网上搜索了parse,Interpretcompile,但对整个过程仍然不是很清楚。下面是一个示例 PHP 代码:

<?php
$str1="Hello world!";
$str2="What a nice day!";
echo $str1 . " " . $str2;
?>  

输出:

Hello world! What a nice day! 

谁能解释从源代码到输出的整个过程(解析,解释......)?谢谢

4

1 回答 1

6

一个非常高水平但不一定完整的过程概述:

  1. 源代码被标记化,即它被分解成单独的部分并且这些部分被“分类”。$str1是变量,=是运算符,"Hello world!"是字符串文字,;是语句终止符等。
  2. 标记被转换为抽象语法树,即标记“按含义分组”。就像我们有一个带有赋值运算符的表达式,它的第一个操作数是,第二个操作数是字符串字面量。= $str1"Hello world!"

    这两步就完成了解析

  3. 语法树中的各个部分被翻译成低级机器指令,例如保留一些内存来存储“Hello world!”。并创建一个符号$str1来引用它

    对于“机器指令”顺便说一句,该描述仍然是相当高级的,我只是在这里使用它来保持简单。

    这基本上是编译步骤。

  4. 指令被执行。

“解释”语言和“编译”语言之间的区别有些武断。任何语言都需要解析然后翻译成机器指令,基本上就是编译。“真正的”编译语言必须首先编译成二进制可执行文件,然后手动执行。PHP 基本上一次性完成,但随后将可执行代码扔掉。这就是解释代码的本质;它是从源代码即时解析和编译的。PHP有字节码缓存来缓存机器代码,而不需要 PHP 一遍又一遍地重新编译相同的代码。

“真正的”编译器还有其他用途:它们通常可以在编译过程中通过分析代码来检测基本甚至非常复杂的问题,然后拒绝编译;由于 PHP 在运行过程中随心所欲,因此它无法在编译过程中发现这类问题,并且它们会在代码已经执行时突然出现,这需要与编译语言不同的错误处理理念。“真正的”编译器还可以花更多时间优化代码,并可能使其执行得更快;由于 PHP 是即时执行的,因此它不会花太多时间优化代码,因为这会使它变得更慢。

顺便说一句,PHP 作为一种语言既不解释也不编译。它只是一种语言。标准的、官方的 PHP 运行时环境是解释语言的东西。还有PHP 编译器,最著名的是 Facebook 的 HipHop,它将 PHP 代码编译成可执行的二进制文件。

于 2013-08-20T06:56:51.270 回答