本文简要介绍 zend 虚拟机解释执行字节码的基本逻辑以及相关的数据结构,关于 PHP 源代码的下载,编译,调试可以参考之前的系列文章

execute_ex

我们来看看执行一个简单的脚本 test.php 的调用栈

execute_ex @ zend_vm_execute.h : 411
zend_execute @ zend_vm_execute.h : 474
php_execute_script @ zend.c : 1474
do_cli @ php_cli.c : 993 main @ php_cli.c : 1381 

由于是执行脚本文件,所以 do_cli 调用了 php_execute_script 函数,最终调用 execute_ex 函数:

ZEND_API void execute_ex(zend_execute_data *ex)
{DCL_OPLINE#ifdef ZEND_VM_IP_GLOBAL_REG const zend_op *orig_opline = opline; #endif #ifdef ZEND_VM_FP_GLOBAL_REG zend_execute_data *orig_execute_data = execute_data; execute_data = ex; #else zend_execute_data *execute_data = ex; #endif LOAD_OPLINE(); ZEND_VM_LOOP_INTERRUPT_CHECK(); while (1) { #if !defined(ZEND_VM_FP_GLOBAL_REG) || !defined(ZEND_VM_IP_GLOBAL_REG) int ret; #endif #if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG) ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); if (UNEXPECTED(!OPLINE)) { #else if (UNEXPECTED((ret = ((opcode_handler_t)OPLINE->handler)www.90168.org(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)) != 0)) { #endif #ifdef ZEND_VM_FP_GLOBAL_REG execute_data = orig_execute_data; # ifdef ZEND_VM_IP_GLOBAL_REG opline = orig_opline; # endif return; #else if (EXPECTED(ret > 0)) { execute_data = EG(current_execute_data); ZEND_VM_LOOP_INTERRUPT_CHECK(); } else { # ifdef ZEND_VM_IP_GLOBAL_REG opline = orig_opline; # endif return; } #endif } } zend_error_noreturn(E_CORE_ERROR, "Arrived at end of main loop which shouldn't happen"); }

和其它 C 语言编写的系统软件类似,函数中使用了大量的宏定义,通过宏定义的名字还是能大概看出其用途

  • DCL_OPLINE,变量声明

  • LOAD_OPLINE(),加载指令字节码

  • ZEND_VM_LOOP_INTERRUPT_CHECK(),interrupt 检测

转载于:https://www.cnblogs.com/tianshifu/p/6379733.html

PHP-7.1 源代码学习:字节码在 Zend 虚拟机中的解释执行 之 概述相关推荐

  1. php 字节码查看,PHP-7.1 源代码学习:字节码在 Zend 虚拟机中的解释执行 之 概述...

    前言 本文简要介绍 zend 虚拟机解释执行字节码的基本逻辑以及相关的数据结构,关于 PHP 源代码的下载,编译,调试可以参考之前的系列文章 execute_ex 我们来看看执行一个简单的脚本 tes ...

  2. 为什么要推荐大家学习字节码?

    配套视频: 为什么推荐大家学习Java字节码 https://www.bilibili.com/video/av77600176/ 一.背景 本文主要探讨:为什么要学习 JVM 字节码? 可能很多人会 ...

  3. JVM学习-字节码指令

    目录 1.入门 2 javap 工具 3 图解方法执行流程 3.1.原始 java 代码 3.2.编译后的字节码文件 3.3.常量池载入运行时常量池 3.4.方法字节码载入方法区 3.5.main 线 ...

  4. 【Groovy】Groovy 扩展方法 ( 实例扩展方法配置 | 扩展方法示例 | 编译实例扩展类 | 打包实例扩展类字节码到 jar 包中 | 测试使用 Thread 实例扩展方法 )

    文章目录 一.扩展方法示例 二.实例扩展方法配置 三.编译实例扩展类 四.打包静态扩展类字节码到 jar 包中 五.测试使用 Thread 实例扩展方法 一.扩展方法示例 为 Thread 扩展 he ...

  5. 【Groovy】Groovy 扩展方法 ( 静态扩展方法配置 | 扩展方法示例 | 编译静态扩展类 | 打包静态扩展类字节码到 jar 包中 | 测试使用 Thread 静态扩展类 )

    文章目录 一.扩展方法示例 二.静态扩展方法配置 三.编译静态扩展类 四.打包静态扩展类字节码到 jar 包中 五.测试使用 Thread 静态扩展类 一.扩展方法示例 为 Thread 扩展 hel ...

  6. python 字节码 汇编器_基础系列1-python解释器、PVM、源代码、字节码理解

    大家都会听到这么一种说法,python是脚本语言,一门解释型语言,那么什么是解释型语言呢? 为了回答这个问题,我们从头撸起 语言又大致分为3类:机器语言.汇编语言.高级语言,简单的解释来说: 机器语言 ...

  7. lua虚拟机字节码修改_Java虚拟机(JVM)面试题大集合

    本文整理自:ThinkWon  链接: blog.csdn.net/ThinkWon/article/details/104390752 本文知识目录 1.Java内存区域 说一下 JVM 的主要组成 ...

  8. 字节码是java虚拟机的指令组_JVM??

    [是什么] JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.J ...

  9. Emscripten实现把C/C++文件转成wasm,wast(wasm的可读形式),llvm字节码(bc格式),ll格式(llvm字节码的可读形式)并执行wasm

    <一>˙转换 Emscripten实现把C/C++文件转成wasm,wast(wasm的可读形式),llvm字节码(bc格式),ll格式(llvm字节码的可读形式)的步骤: 最新版本的Em ...

最新文章

  1. python中组合框_PyQt 组合框
  2. fileinput模块可以循环一个或多个文本文件的内容
  3. Fletcher-Reevers Conjugate Descent和Steepest Descent两种算法中伪代码的区别
  4. mysql定期删除数据_mysql数据库如何实现定期删除数据库一些东西
  5. 物理层、数据链路层网络设备工作原理
  6. Linux chattr 与 lsattr命令
  7. jQuery comet
  8. nbu备份oracle rac,利用NETBACKUP将备份写到磁盘上
  9. Ant--基于java的build工具
  10. 虚拟现实(VR)技术的升级应用|时空克隆 三维视频融合 投影融合 点卯 魔镜系列
  11. php cms系统 知乎,php cms 知乎
  12. 28 | Pika:如何基于SSD实现大容量Redis?
  13. Win7 C盘瘦身 微信文件夹太大WeChat Files
  14. oracle 在此 select 语句中缺少 into 子句,Go database/sql文档
  15. Windows获取系统唯一标识UUID
  16. KUDU表的增删改查
  17. Java高并发系列5-线程池
  18. 删除 Windows 的默认打开方式
  19. null == 什么意思? 和 ==null是不是一个意思啊?
  20. 《有限与无限的游戏》第一章 世上至少有两种游戏:经典摘抄(1)

热门文章

  1. python空气质量分析报告_Python数据可视化:2018年北上广深空气质量分析
  2. class? clazz参数_Java如何获取方法参数具体名称?这是个好问题!
  3. [codevs 1922] 骑士共存问题
  4. AtCoder AGC030F Permutation and Minimum (DP、计数)
  5. BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演)
  6. r语言参数fig=c(),干货︱R语言绘图—基础图形参数整理
  7. gdi画平滑直线_石膏几何体不会画?那是你没有画过这些,学会画石膏很简单,收藏...
  8. 2021-04-07 In literature VS In the literature
  9. virtualvenv+django+uWSGI+nginx 部署 踩坑记录
  10. 约数个数定理约数和定理