【PHP7源码学习】2019-04-04 PHP中while的实现

2019-07-11
阅读 2 分钟
1.8k
grape 全部视频:[链接] 引入 在我们平常写PHP代码总是会用到while语句,那么我们有没有去考虑过while语句是怎么实现的呢? 我们来看下面的这段代码: {代码...} 我们知道这段代码是个死循环,毋庸置疑,但是在PHP中,它是如何做到的呢?请看下文。 分析 首先,我们自己分析一下这个while语句,如果让我们来设计,我们会...

【PHP7源码学习】2019-04-03 PHP类与对象

2019-07-05
阅读 10 分钟
1.6k
谈到PHP中的类,我们知道,类是对象的抽象,是所有通过它new出来对象的模板,它是编译阶段的产物。一个类被抽象出来,它本身有自己的属性、方法等等要素。如果让我们自己去用C语言实现一个类的存储结构,我们如何设计?

【PHP7源码学习】2019-04-02 PHP垃圾回收2

2019-07-03
阅读 10 分钟
2.5k
在上一篇文章【PHP源码学习】2019-04-01 PHP垃圾回收1中,我们将所有疑似垃圾的元素都放到垃圾回收器缓冲区中,一直存下去,待存满垃圾回收器缓冲区10000个存储单元之后,垃圾回收算法就会启动,对缓冲区中的所有疑似垃圾进行标记与清除。垃圾回收算法需要对这个缓冲区进行扫描遍历,判定每一个存储单元中的内容是否为最...

【PHP7源码学习】2019-04-01 PHP垃圾回收1

2019-06-05
阅读 6 分钟
2.8k
我们知道,在PHP中,如果一个变量的引用计数减少到0(没有任何地方在使用这个变量),它所占用的内存就会被PHP虚拟机自动回收,并不会被当做垃圾。垃圾回收的触发条件是当一个变量的引用计数的值减少1之后,仍不为0(还有某个地方在使用这个变量),才有可能是垃圾。需要让我们人工去对其进行进一步的检验,看它是否真的...

【PHP7源码学习】2019-03-28 Zend虚拟机

2019-06-04
阅读 10 分钟
2.6k
首先复习几个基本概念: opline:在zend虚拟机中,每条指令都是一个opline,每个opline由操作数、指令操作、返回值组成opcode:每个指令操作都对应一个opcode(如ZEND_ASSIGN/ZEND_ADD等等),在PHP7中,有100多种指令操作,所有的指令集被称作opcodeshandler:每个opcode指令操作都对应一个handler指令处理函数,处理函...

【PHP7源码学习】2019-03-27 pass_two函数详解笔记

2019-05-21
阅读 7 分钟
2.4k
grape 全部视频:[链接] 原视频地址:[链接] 流程回顾 上节课我们把$a=1这个过程编译梳理了一遍,我们了解到op1,op2,result,opcode的生成过程,下面我们把整个过程来回顾一下。 {代码...} 大体流程为:词法分析->语法分析->编译ast生成op_array->处理return 1->对于handler做处理以上处理return 1 环节之前...

【PHP7源码学习】2019-03-26 宏定义笔记

2019-05-20
阅读 4 分钟
2k
我们知道宏定义的优点有方便程序的修改,提高程序运行效率等等。并且在我们日常的代码学习中,我们会碰到过很多很多的宏定义。针对这些宏定义,我们通常都是秉承着“宏即是替换”的“法则”来进行分析。然而,对于一些简单的宏定义来说,我们直接进行替换即可完美的解决问题,但是针对于一些复杂的宏定义来说,我们会发现,...

【PHP7源码学习】抽象语法树编译过程的验证

2019-05-17
阅读 6 分钟
2.5k
grape 引入 阅读前请先查看【PHP源码学习】2019-03-22 AST的遍历了解基本概念。 此篇文章是针对于$a=1进行了gdb实战调试,以验证 【PHP源码学习】2019-03-22 AST的遍历 中的一些论证。 实验代码: {代码...} 基本流程: {代码...} GDB过程 我们来gdb一下整个过程,首先,在zend_compile_top_stmt入口处打断点: gdb下来...

【PHP7源码学习】2019-03-22 AST的遍历

2019-05-16
阅读 17 分钟
3.3k
baiyan 全部视频:[链接] 原视频地址:[链接] 引入 先看上一节笔记中展示的AST示例: {代码...} 在PHP中,构造出来的抽象语法树如图所示: 那么,这个AST后面能够用来做什么呢?因为我们最终需要执行这段PHP代码,所以需要将其转化为可执行的指令,让虚拟机最终来解释执行 指令的几个要素: 操作数:参与指令操作的变量...

【Go语言学习】2019-04-24 协程初步讨论与简单扩展

2019-05-08
阅读 3 分钟
2.9k
Go语言最大的特色就是从语言层面支持并发(Goroutine),Goroutine是Go中最基本的执行单元。事实上每一个Go程序至少有一个Goroutine:主Goroutine。当程序启动时,它会自动创建。

【PHP7源码学习】2019-03-21 AST

2019-05-07
阅读 9 分钟
3.1k
在【PHP源码学习】2019-03-20 PHP词法分析这篇笔记中,我们谈到在PHP7中,会依次进行词法分析(将代码切成一个一个小段)、语法分析(分析代码的语法结构)、然后会生成一颗抽象语法树(AST)。

【PHP7源码学习】2019-03-20 PHP词法分析

2019-04-28
阅读 3 分钟
3.4k
在PHP7中,当一个脚本运行请求或到来时,PHP代码首先会被加载到内存中,随后进行词法分析和语法分析并生成抽象语法树(AST),然后进行深度优先遍历并生成opcodes,并在zend虚拟机中执行这些opcode,返回最终的执行结果。

【PHP7源码学习】2019-03-19 PHP引用

2019-04-25
阅读 4 分钟
2.3k
由于这个系列的视频后面会再次细讲垃圾回收,那么我们今天先复习一下PHP中的引用,为后面做一个铺垫,后续的笔记会详细讲解垃圾回收器的相关运行原理。

【PHP7源码学习】2019-03-18 复习前面的内容

2019-04-23
阅读 8 分钟
1.9k
baiyan 全部视频:[链接] 原视频地址:[链接] 本笔记中部分图片截自视频中的片段,图片版权归视频原作者所有。 malloc函数深入 在PHP内存管理1笔记中提到,malloc()函数会在分配的内存空间前面额外分配32位,用来存储分配的大小和几个标志位,如图: 那么究竟是否是这样的呢?我们写一段测试代码验证一下: {代码...} 利...

【PHP7源码学习】2019-03-13 PHP字符串笔记

2019-04-22
阅读 2 分钟
2.2k
baiyan 全部视频:[链接] 源视频地址:[链接] 字符串的设计过程 在C99的柔性数组标准未发布之前,我们如果想设计一个数据结构,存储一个字符串,可以很容易地想出如下代码: {代码...} 那么我们发现,这样做有如下缺点: 访问字符串值的时候,需要先访问结构体,在访问指针所指向的内存空间,需要2次内存访问,效率低下...

【PHP7源码学习】2019-03-12 PHP基本变量笔记

2019-04-21
阅读 8 分钟
2.4k
baiyan 全部视频:[链接] 源视频地址:[链接] 引入及基本概念 变量本质上就是给一段内存空间起了个名字 如果让我们自己基于C语言设计一个存储如$a = 1变量的数据结构,应该如何设计? 变量的基本要素是类型与值,其中部分类型还有其他的描述字段(如长度等) 首先应该定义一个结构体作为基本的数据结构 第一个问题:变量...

【PHP7源码学习】2019-03-11 PHP内存管理3笔记

2019-04-19
阅读 5 分钟
2.6k
baiyan 全部视频:[链接] 源视频地址:[链接] 复习 PHP内存分配流程 利用gdb回顾PHP内存分配流程 首先在_emalloc()函数处打一个断点 alloc_globals是一个全局变量,可以利用AG宏访问内部字段 接下来观察mm_heap中的字段: size = 0,peak = 0,表示当前没有使用任何内存 real_size = 2097152 = 2M,表示当前已经向操作系...

【PHP7源码学习】2019-03-08 PHP内存管理2笔记

2019-04-18
阅读 4 分钟
2.5k
baiyan 全部视频:[链接] 源视频地址:[链接] 复习 宏的用法: {代码...} 这个带有参数的宏取得zend_alloc_globals结构体类型里的zend_mm_heap结构体字段,如AG(mm_heap) = alloc_globals.mm_heap 宏就是替换。 结构体与结构体内存对齐 结构体 先看一段结构体代码struct.c: {代码...} 编译:gcc -g struct.c -o struct ...

【PHP7源码学习】2019-03-07 PHP内存管理1笔记

2019-04-18
阅读 9 分钟
3.5k
baiyan全部视频:[链接]源视频地址:[链接]malloc和free函数思考字符串的非二进制安全:如果存的字符串内容中带有\0,那么它会被当做字符串结束标志,提前判定字符串结束,而并非到字符串末尾正常结束。malloc一块内存之后,它的size是存在哪里的?free一块内存,如何知道free多大的内存?解决方案:在分配的内存地址空...