首页 > 编程语言 >浅谈解释型语言 PHP 和编译型语言 Go 特性

浅谈解释型语言 PHP 和编译型语言 Go 特性

时间:2024-09-19 16:24:21浏览次数:7  
标签:浅谈 go 内存 Go PHP data example 语言

浅谈解释型语言 PHP 和编译型语言 Go 特性

分享人:zxy_coding

时长:40 min


写在前面

本次分享的目的旨在互相交流,欢迎会后大家多多讨论交流。不会花过多的时间在细节上,同时请各位大佬轻喷。

在分享之前,请允许我简单的带大家温习下一些会提到的点:

  • 高级语言 vs 低级语言: 这两者是一个相对概念,指的是语言的抽象程度,而不是其优劣。高级语言具有更高的抽象性,能够帮助开发者专注于业务逻辑,而无需过多关心底层硬件的实现细节。PHP 就是一种典型的高级语言,它提供了面向对象编程等高级特性,让代码更加简洁易懂。使用高级语言编程时,开发者不需要考虑内存管理或硬件操作细节,因为编译器或解释器会将这些高级代码翻译成机器可以理解的语言。

低级语言:更接近计算机硬件,开发者需要直接操作内存、寄存器等底层资源。通常指的是机器语言和汇编语言,机器语言和汇编常用于系统编程、硬件驱动开发等需要与底层硬件打交道的领域。

机器语言:这是计算机可以直接执行的二进制代码,由0和1组成,它对程序员来说是难以理解和编写的。

汇编语言:它使用助记符(如 MOV, ADD)来代表机器指令,相对于机器语言来说更易于理解,与计算机的硬件架构紧密相关,需要开发者对处理器的指令集有深入的了解。

  • 一个常见的问题

我们工作中经常会遇到在本地开发环境编译和运行正常的代码,在生产环境却无法正常工作。这个问题的原因可能有很多,在这里我们只讨论其中原因之一 --> 不同机器使用不同的指令集

复杂指令集计算机(CISC)和精简指令集计算机(RISC)是两种遵循不同设计理念的指令集,从名字我们就可以推测出这两种指令集的区别:

复杂指令集:通过增加指令的类型减少需要执行的指令数;

精简指令集:使用更少的指令类型实现目标的计算任务;

  • AST抽象语法树:是一种以树状的方式表示的语法结构,构造方式分为自顶而下和自底向上两种,其每一个节点都表示源代码中的一个元素,每一个子树表示一个语法元素。比如 (1 + 1)* 2

一、计算机是如何认识代码的?

计算机的核心是 CPU,它通过复杂的电子指令集来解释和执行机器代码。这些代码是高度抽象的高级语言(如 PHPGo)经过不同程度的转换,最终生成到计算机可以直接执行低级语言。这一过程分为多步,而 PHPGo 则通过不同的机制完成这些步骤。

(一)、机器语言与汇编语言

  • 机器语言:计算机硬件直接理解和执行的二进制代码,由一系列的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);
  1. 词法分析:生成 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"]
  ";"
]

  1. 语法分析:生成抽象语法树AST

接下来是语法分析,对于AST语法树构造的方法通常是自顶而下和自底向上两种,PHP 的语法分析通常是通过自顶向下的解析方法进行的。在编译原理中,自顶向下的解析是指从语法树的根部开始,根据语言的语法规则逐步向下构建语法树,直到整个输入都被解析。一定会从开始符号分析,通过下一个即将入栈的符号判断应该如何对当前堆栈中最右侧的非终结符(

标签:浅谈,go,内存,Go,PHP,data,example,语言
From: https://www.cnblogs.com/ZxyPhppython/p/18420865

相关文章

  • 基于django+vue古诗词鉴赏网站【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在中华文化的浩瀚星空中,古诗词犹如璀璨星辰,穿越时空的长河,照亮了无数文人墨客的心灵世界,也承载着中华民族深厚的文化底蕴与情感寄托。然而......
  • 基于django+vue购药管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着医疗行业的快速发展和人们对健康意识的不断提升,药品的需求量急剧增加,购药管理成为医疗机构及零售药店运营中不可或缺的一环。传统的手......
  • 基于django+vue购物网【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和电子商务的日益普及,网络购物已成为人们日常生活中不可或缺的一部分。购物网站作为电子商务的核心平台,不仅极大......
  • Java语言程序设计基础篇_编程练习题**18.31 (替换单词)
    目录题目:**18.31(替换单词)习题思路代码示例 运行结果替换前替换后题目:**18.31(替换单词) 编写一个程序,递归地用一个新单词替换某个目录下的所有文件中出现的某个单词。从命令行如下传递参数:javaExercise18_31dirNameoldWordnewWord习题思路(读取路径方......
  • C语言指针进阶笔试题(含解析)
    笔试题1:intmain(){ inta[5]={1,2,3,4,5}; int*ptr=(int*)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); return0;} 解析:*(a+1),a是首元素的地址,加1之后就是第二个元素的地址,解引用就是2。ptr是&a+1,取出的是整个数组的地址,加1跳过整个数组:强转为int......
  • Go语言grequests库并发请求的实战案例
    在当今快速发展的互联网时代,数据的获取和处理速度成为了衡量一个系统性能的重要标准。Go语言以其并发处理能力而闻名,而grequests库则为Go语言的HTTP请求提供了简洁易用的API。本文将通过一个实战案例,介绍如何使用Go语言的grequests库来实现高效的并发HTTP请求。1.引言在......
  • PicGo+GitHub解决博客本地图片上传问题
    PicGo+GitHub解决博客本地图片上传问题在Github上创建仓库(公开)获去取gihubtoken右上角头像->Settings->Developersettings->Personalaccesstokens->Tokens(classic)下载PicGoPicGo下载链接https://molunerfinn.com/PicGo/配置PicGo下载后......
  • 全网最简单ubuntu18.04+mysql5.7+nginx+uwsgi一次性部署Django!!!!!
    ubuntu18.04,自带python3.6,mysql5.7 Nginx*******************************1.安装nginx apt-getupdate apt-getupgrade apt-getinstallnginx 2.修改端口为81(可选),是一个链接 /etc/nginx/sites-enabled/default3.servicenginxreload4.servicenginx......
  • 在服务器中搭建MongoDB
    MongoDB简介MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格......
  • 第139期 大规模食品logo检测数据集
    引言亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。FoodLogoDet-1500:食品徽标检测的大规模数据集探索在数字化时代的浪潮下,多媒体信息......