浅谈解释型语言 PHP
和编译型语言 Go
特性
分享人:zxy_coding
时长:40 min
写在前面
本次分享的目的旨在互相交流,欢迎会后大家多多讨论交流。不会花过多的时间在细节上,同时请各位大佬轻喷。
在分享之前,请允许我简单的带大家温习下一些会提到的点:
- 高级语言 vs 低级语言: 这两者是一个相对概念,指的是语言的抽象程度,而不是其优劣。高级语言具有更高的抽象性,能够帮助开发者专注于业务逻辑,而无需过多关心底层硬件的实现细节。
PHP
就是一种典型的高级语言,它提供了面向对象编程等高级特性,让代码更加简洁易懂。使用高级语言编程时,开发者不需要考虑内存管理或硬件操作细节,因为编译器或解释器会将这些高级代码翻译成机器可以理解的语言。
低级语言:更接近计算机硬件,开发者需要直接操作内存、寄存器等底层资源。通常指的是机器语言和汇编语言,机器语言和汇编常用于系统编程、硬件驱动开发等需要与底层硬件打交道的领域。
机器语言:这是计算机可以直接执行的二进制代码,由0和1组成,它对程序员来说是难以理解和编写的。
汇编语言:它使用助记符(如 MOV
, ADD
)来代表机器指令,相对于机器语言来说更易于理解,与计算机的硬件架构紧密相关,需要开发者对处理器的指令集有深入的了解。
- 一个常见的问题
我们工作中经常会遇到在本地开发环境编译和运行正常的代码,在生产环境却无法正常工作。这个问题的原因可能有很多,在这里我们只讨论其中原因之一 --> 不同机器使用不同的指令集。
复杂指令集计算机(CISC)和精简指令集计算机(RISC)是两种遵循不同设计理念的指令集,从名字我们就可以推测出这两种指令集的区别:
复杂指令集:通过增加指令的类型减少需要执行的指令数;
精简指令集:使用更少的指令类型实现目标的计算任务;
AST
抽象语法树:是一种以树状的方式表示的语法结构,构造方式分为自顶而下和自底向上两种,其每一个节点都表示源代码中的一个元素,每一个子树表示一个语法元素。比如 (1 + 1)* 2
一、计算机是如何认识代码的?
计算机的核心是
CPU
,它通过复杂的电子指令集来解释和执行机器代码。这些代码是高度抽象的高级语言(如PHP
和Go
)经过不同程度的转换,最终生成到计算机可以直接执行低级语言。这一过程分为多步,而PHP
和Go
则通过不同的机制完成这些步骤。
(一)、机器语言与汇编语言
- 机器语言:计算机硬件直接理解和执行的二进制代码,由一系列的0和1组成,对应于
CPU
的指令集。 - 汇编语言:一种低级语言,它使用助记符来代表机器指令,更易于理解和记忆。
(二)、代码的编译/解释过程
- 编译可分为两部分,每个部分又可以细分为三个阶段。这两部分别是编译前端和编译后端,也称分析部分和合成部分。编译器的前端一般承担着词法分析、语法分析、类型检查和中间代码生成几部分工作,而编译器后端主要负责目标代码的生成和优化,也就是将中间代码翻译成目标机器能够运行的二进制机器码。
(三)、CPU如何执行机器码
- 指令周期:
CPU
执行机器码的过程是通过指令周期来完成的,包括取指、解码、执行、访存、写回等步骤。 - 寄存器:
CPU
内部有多个寄存器,用于存储指令、数据和地址等信息。寄存器是CPU
执行指令时最快的数据存储位置。 - 指令指针:程序计数器
PC
是一个特殊的寄存器,它指向下一条要执行的指令的地址。 - 执行引擎:
CPU
的执行引擎根据解码后的指令执行相应的操作,如算术运算、逻辑运算、数据传输等。
(四)、内存与存储
- 指令与数据:机器码中的指令部分告诉
CPU
要执行的操作,数据部分则是操作的对象。 - 内存寻址:
CPU
通过内存地址来访问存储在RAM
中的指令和数据。 - 缓存:
CPU
缓存用于减少访问主内存的次数,提高数据存取速度。
通过上述过程,计算机将人类可读的代码转换为其硬件能够理解的机器码,并执行这些指令来完成特定的计算任务。这个过程涉及到编译器、解释器、CPU
、内存等多个组件的协同工作。
二、PHP 是如何执行的?
(一)、执行分析
PHP 是一种解释型语言,这意味着它的代码并不直接编译成机器代码,而是由解释器(如 Zend 引擎)逐行执行。我们可以通过以下示例来理解 PHP 的工作过程:
$code =<<<'PHP_CODE'
<?php
//这是注释
echo "Hello, world\n";
$data = 1 + 1;
echo $data;
PHP_CODE;
token_get_all($code);
- 词法分析:生成
Tokens
。
在这一步,PHP 会对源码进行词法分析,将代码分解为最小的语言元素,称为“词法单元”(Tokens)。每个 Token 都是程序中不可再分的最小单位,比如关键字、标识符、运算符等。 通过 PHP 内置函数 token_get_all(),我们可以看到代码被解析为以下 Tokens:
array:15 [
[T_OPEN_TAG, "<?php"]
[T_ECHO, "echo"]
[T_CONSTANT_ENCAPSED_STRING, "\"Hello, world\n\""]
";"
[T_VARIABLE, "$data"]
"="
[T_LNUMBER, "1"]
"+"
[T_LNUMBER, "1"]
";"
[T_ECHO, "echo"]
[T_VARIABLE, "$data"]
";"
]
- 语法分析:生成抽象语法树
AST
。
接下来是语法分析,对于
标签:浅谈,go,内存,Go,PHP,data,example,语言 From: https://www.cnblogs.com/ZxyPhppython/p/18420865AST
语法树构造的方法通常是自顶而下和自底向上两种,PHP 的语法分析通常是通过自顶向下的解析方法进行的。在编译原理中,自顶向下的解析是指从语法树的根部开始,根据语言的语法规则逐步向下构建语法树,直到整个输入都被解析。一定会从开始符号分析,通过下一个即将入栈的符号判断应该如何对当前堆栈中最右侧的非终结符(