前言

本文简要介绍 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)(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 检测

while (1) 循环,调用指令的处理函数 OPLINE->handler

op_code_handler

总结

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

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

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

  2. python源代码不需要编译成什么-关于python代码是编译执行还是解释执行

    Python 是编译型语言还是解释型语言?回答这个问题前,应该先弄清楚什么是编译型语言,什么是解释型语言. 所谓编译执行就是源代码经过编译器编译处理,生成目标机器码,就是机器能直接运行的二进制代码,下 ...

  3. 跟大家聊聊我们为什么要学习源码?学习源码对我们有用吗?(源码感悟)

    来自:源码笔记 1 前言 由于现在微服务很流行,越来越多企业采用了SpringCloud微服务架构,而SpringBoot则是快速构建微服务项目的利器.于是笔者以此为切入点,将SpringBoot作为 ...

  4. 为什么要学习源码?学习源码对我们有用吗?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1 前言 由于现在微服务很流行,越来越多企业采用了Spr ...

  5. java+字节码工具64位_jclasslib 下载-jclasslib 32位64位(java字节码查看工具) 5.1 官方版 - 河东下载站...

    jclasslib是款免费的开源java字节码的查看工具:它支持进行查看您需要进行使用汉字运用到的Java字节码,并且还拥有一个的类库来让开发者进行读取,包括了修改.对JavaClass文件.字节码的 ...

  6. php 字节码查看,PHP字节码缓存和内置服务器

    Zend OPcache 1).从PHP5.0开始,内置了字节码缓存功能,名为Zend OPcache.因为PHP是解释性语言,PHP解释器执行PHP脚本时会解析PHP脚本代码,生成一系列的Zend操 ...

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

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

  8. idea如何反编译字节码指令_美团点评:Java字节码增强技术,线上问题诊断利器...

    作者简介:泽恩,美团到店住宿业务研发团队工程师.文章转载于公众号:美团技术团队 1. 字节码 1.1 什么是字节码? Java之所以可以"一次编译,到处运行",一是因为JVM针对各 ...

  9. 【JVM源码解析】模板解释器解释执行Java字节码指令(上)

    本文由HeapDump性能社区首席讲师鸠摩(马智)授权整理发布 第17章-x86-64寄存器 不同的CPU都能够解释的机器语言的体系称为指令集架构(ISA,Instruction Set Archit ...

最新文章

  1. Kali Linux Web 渗透测试— 第十二课-websploit
  2. 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)
  3. Ubuntu 迁移 /tmp 到别的硬盘
  4. [导入]WCF后传系列(6):消息如何传递之绑定Part 1
  5. Qt Creator代码重构
  6. 【JDBC】各版本jar包下载网址及Tomcat下载
  7. Visual Studio 11预览: 新的编程语言功能
  8. hadoopsdk使用_使用 IDEA 搭建 Hadoop3.1.1 项目
  9. C语言TCP客户端获取时间
  10. KMeans聚类算法思想与可视化
  11. 计算机系大学生为什么选择在CSDN写博客?
  12. R:应用时间序列分析--基于R(2)第二章 时间序列的预处理
  13. 紫书刷题记录 UVa1593 代码对齐
  14. Python——第一天的Suger Rush
  15. 初窥 Python 的 import 机制
  16. 【JAVA】金额工具类 金额千分位、中文大写金额、英文金额
  17. 计算机上的aece代表什么意思,Myristicaceae是什么意思
  18. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.xxx 的解决办法
  19. avr c语言编译器,AVR单片机C语言编译器-20210409071159.docx-原创力文档
  20. SuperSocket.WebSocket WebSocketServer设置文本编码

热门文章

  1. SRS支持的各种HTTP直播流(FLV、TS、MP3、AAC)
  2. Android手机扫描mDNS服务
  3. 数据结构 小顶堆建堆过程 构建过程
  4. 一个ICT技术资料摘录博客
  5. 5G技术中的无源光器件(三)
  6. 分享一些自己的学习过程和学习方法(来自daimajia)
  7. 下列命令中 哪些用于退出MySQL服务_2021年知到水泵及水泵站(吉林联盟)答案...
  8. 从零开始学badusb(2)--badusb调用命令行
  9. pcb - 如果回流焊温度曲线选错了, 可以重新选回流焊温度曲线, 重新进炉子
  10. Android图片适配分辨率,Android多分辨率适配总结