我总是在科技文章中看到parse
或compile
。所以我想知道PHP是如何工作的。我发现PHP是解释语言,而不是编译语言。我在网上搜索了parse
、Interpret
和compile
,但对整个过程仍然不太清楚。下面是一个PHP代码示例:
<?php
$str1="Hello world!";
$str2="What a nice day!";
echo $str1 . " " . $str2;
?>
输出:
Hello world! What a nice day!
有人能解释从源代码到输出的整个过程(解析、解释…)吗?感谢
非常高级别且不一定完整的流程概述:
- 源代码被标记为,即它被分解为各个部分,这些部分被"分类"。
$str1
是变量,=
是运算符,"Hello world!"
是字符串文字,;
是语句终止符等 -
标记被转换为抽象语法树,即标记被"按意义分组"。类似于,我们有一个带有
=
赋值运算符的表达式,其第一个操作数是$str1
,其第二个操作数[/strong>是字符串文字"Hello world!"
这两个步骤完成解析。
-
语法树中的各个部分被翻译成低级机器指令,例如保留一些内存来存储"Hello world!",并创建一个符号
$str1
来引用它。对于"机器指令"BTW来说,这种描述仍然相当高,我只是在这里使用它来保持简单。
这基本上是编译的步骤。
-
指令被执行。
"解释"语言和"编译"语言之间的区别有些武断。任何语言都需要解析,然后翻译成机器指令,这基本上就是编译。"真正的"编译语言必须首先编译成二进制可执行文件,然后手动执行。PHP基本上是一次性完成这两项工作,但随后会丢弃可执行代码。这就是解释的代码的本质;它是从源代码开始即时解析和编译的。PHP有字节码缓存,用于缓存机器代码,不需要PHP反复重新编译相同的代码。
"真正的"编译器还有其他用途:它们通常可以通过分析代码来检测编译过程中的基本问题甚至相当复杂的问题,然后拒绝编译;由于PHP在编译过程中会随波逐流,它无法在编译期间发现这些问题,而且这些问题会在代码已经执行时突然出现,这需要与编译语言不同的错误处理理念。"真正的"编译器还可以花更多的时间优化代码,并可能使其执行速度更快;由于PHP是动态的,所以它不会花太多时间优化代码,因为这会使它变得更慢。
顺便说一句,PHP作为语言既不被解释也不被编译。这只是一种语言。标准的官方PHP运行时环境是解释该语言的工具。还有PHP编译器,最著名的是Facebook的HipHop,它将PHP代码编译成可执行的二进制文件。