php:关于解析和解释过程

use*_*818 0 php

我总是在科技文章中看到 parsecompile发表文章。所以我想知道PHP是如何工作的。我发现PHP是解释性语言,没有编译。我GOOGLE了网上有关parseInterpretcompile,但仍然没有说清楚的全过程。以下是示例PHP代码:

<?php
$str1="Hello world!";
$str2="What a nice day!";
echo $str1 . " " . $str2;
?>  
Run Code Online (Sandbox Code Playgroud)

输出:

Hello world! What a nice day! 
Run Code Online (Sandbox Code Playgroud)

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

dec*_*eze 5

一个非常高级的过程,不一定是完整的过程概述:

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

    这两个步骤完成了解析

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

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

    这基本上是编译步骤。

  4. 指令被执行。

“解释”语言和“编译”语言之间的区别有些随意。任何语言都需要解析,然后翻译成机器指令,基本上是编译指令。必须先将“ Real”编译语言编译成二进制可执行文件,然后再手动执行。PHP基本上一举两得,但随后将可执行代码丢弃了。本质上就是解释代码。它是从源代码中即时解析和编译的。有一些用于PHP的字节码缓存,用于缓存机器代码,不需要PHP反复地重新编译相同的代码。

“真正的”编译器还可以用于其他目的:它们通常可以在分析过程中通过分析代码来检测基本甚至相当复杂的问题,然后拒绝对其进行编译;由于PHP在开发过程中始终处于运行状态,因此在编译期间无法捕获此类问题,并且在代码已执行时它们会突然出现,这需要与编译语言不同的错误处理哲学。“真正的”编译器还可以花费更多的时间来优化代码,并有可能使其执行更快。由于PHP是即时进行的,因此即使有任何时间也不会花费很多时间来优化代码,因为这会使它变得更慢。

顺便说一句,PHP作为一种语言既不被解释也不被编译。这只是一种语言。该标准正式PHP运行环境是何等的解释语言。还有PHP编译器,最著名的是Facebook的HipHop,它们将PHP代码编译为可执行二进制文件。