【问题标题】:php: about parsing and interpreting processphp:关于解析和解释过程
【发布时间】:2013-08-20 06:32:27
【问题描述】:

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

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

输出:

Hello world! What a nice day! 

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

【问题讨论】:

    标签: php


    【解决方案1】:

    非常高级且不一定完整的过程概述:

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

      这两步完成解析

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

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

      这基本上是编译步骤。

    4. 指令被执行。

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 2010-10-24
      相关资源
      最近更新 更多