php:关于解析和解释过程

时间:2013-08-20 06:32:28

标签: php

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

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

输出:

Hello world! What a nice day! 

任何人都可以解释从源代码到输出的整个过程(解析,解释......)吗?感谢

1 个答案:

答案 0 :(得分:4)

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

  1. 源代码是标记化,即它被分解为单独的部分,这些部分被“分类”。 $str1是变量,=是运算符,"Hello world!"是字符串文字,;是语句终止符等。
  2. 令牌转换为abstract syntax tree,即令牌按“含义分组”。像这样的东西我们有表达式= 赋值运算符,其第一个操作数$str1且其第二个操作数是字符串文字"Hello world!"

    这两个步骤完成解析

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

    对于“机器指令”BTW,这个描述仍然相当高,我只是在这里使用它来保持简单。

    这基本上是编译步骤。

  4. 执行指示。

  5. “解释”语言和“编译”语言之间的区别有些武断。任何语言都需要解析,然后翻译成机器指令,基本上是编译。必须首先将“真正的”编译语言编译成二进制可执行文件,然后手动执行。 PHP基本上可以同时执行,但随后会丢弃可执行代码。这基本上是解释代码的内容;它直接从源代码解析和编译。 PHP的字节代码缓存用于缓存机器代码,不需要PHP反复编译相同的代码。

    “真正的”编译器还可以用于其他目的:通过分析代码然后拒绝编译它们,它们通常可以在编译期间检测基本甚至非常复杂的问题。由于PHP正在进行中,它在编译过程中无法捕获这些问题,并且在代码已经执行时会出现问题,这需要一种与编译语言不同的错误处理理念。 “真正的”编译器也可以花更多的时间来优化代码并使其更快地执行;因为PHP在运行时它会在优化代码时花费很多,因为这会使它更慢。

    BTW,PHP作为语言既不被解释也不被编译。这只是一种语言。 标准,官方PHP运行时环境正在解释该语言。还有 PHP编译器,最着名的是Facebook的HipHop,它将PHP代码编译成可执行的二进制文件。