php 字节码查看,PHP-7.1 源代码学习:字节码在 Zend 虚拟机中的解释执行 之 概述...
前言
本文简要介绍 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 虚拟机中的解释执行 之 概述...相关推荐
- PHP-7.1 源代码学习:字节码在 Zend 虚拟机中的解释执行 之 概述
本文简要介绍 zend 虚拟机解释执行字节码的基本逻辑以及相关的数据结构,关于 PHP 源代码的下载,编译,调试可以参考之前的系列文章 execute_ex 我们来看看执行一个简单的脚本 test.p ...
- python源代码不需要编译成什么-关于python代码是编译执行还是解释执行
Python 是编译型语言还是解释型语言?回答这个问题前,应该先弄清楚什么是编译型语言,什么是解释型语言. 所谓编译执行就是源代码经过编译器编译处理,生成目标机器码,就是机器能直接运行的二进制代码,下 ...
- 跟大家聊聊我们为什么要学习源码?学习源码对我们有用吗?(源码感悟)
来自:源码笔记 1 前言 由于现在微服务很流行,越来越多企业采用了SpringCloud微服务架构,而SpringBoot则是快速构建微服务项目的利器.于是笔者以此为切入点,将SpringBoot作为 ...
- 为什么要学习源码?学习源码对我们有用吗?
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1 前言 由于现在微服务很流行,越来越多企业采用了Spr ...
- java+字节码工具64位_jclasslib 下载-jclasslib 32位64位(java字节码查看工具) 5.1 官方版 - 河东下载站...
jclasslib是款免费的开源java字节码的查看工具:它支持进行查看您需要进行使用汉字运用到的Java字节码,并且还拥有一个的类库来让开发者进行读取,包括了修改.对JavaClass文件.字节码的 ...
- php 字节码查看,PHP字节码缓存和内置服务器
Zend OPcache 1).从PHP5.0开始,内置了字节码缓存功能,名为Zend OPcache.因为PHP是解释性语言,PHP解释器执行PHP脚本时会解析PHP脚本代码,生成一系列的Zend操 ...
- python 字节码 汇编器_基础系列1-python解释器、PVM、源代码、字节码理解
大家都会听到这么一种说法,python是脚本语言,一门解释型语言,那么什么是解释型语言呢? 为了回答这个问题,我们从头撸起 语言又大致分为3类:机器语言.汇编语言.高级语言,简单的解释来说: 机器语言 ...
- idea如何反编译字节码指令_美团点评:Java字节码增强技术,线上问题诊断利器...
作者简介:泽恩,美团到店住宿业务研发团队工程师.文章转载于公众号:美团技术团队 1. 字节码 1.1 什么是字节码? Java之所以可以"一次编译,到处运行",一是因为JVM针对各 ...
- 【JVM源码解析】模板解释器解释执行Java字节码指令(上)
本文由HeapDump性能社区首席讲师鸠摩(马智)授权整理发布 第17章-x86-64寄存器 不同的CPU都能够解释的机器语言的体系称为指令集架构(ISA,Instruction Set Archit ...
最新文章
- Kali Linux Web 渗透测试— 第十二课-websploit
- 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)
- Ubuntu 迁移 /tmp 到别的硬盘
- [导入]WCF后传系列(6):消息如何传递之绑定Part 1
- Qt Creator代码重构
- 【JDBC】各版本jar包下载网址及Tomcat下载
- Visual Studio 11预览: 新的编程语言功能
- hadoopsdk使用_使用 IDEA 搭建 Hadoop3.1.1 项目
- C语言TCP客户端获取时间
- KMeans聚类算法思想与可视化
- 计算机系大学生为什么选择在CSDN写博客?
- R:应用时间序列分析--基于R(2)第二章 时间序列的预处理
- 紫书刷题记录 UVa1593 代码对齐
- Python——第一天的Suger Rush
- 初窥 Python 的 import 机制
- 【JAVA】金额工具类 金额千分位、中文大写金额、英文金额
- 计算机上的aece代表什么意思,Myristicaceae是什么意思
- org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.xxx 的解决办法
- avr c语言编译器,AVR单片机C语言编译器-20210409071159.docx-原创力文档
- SuperSocket.WebSocket WebSocketServer设置文本编码
热门文章
- SRS支持的各种HTTP直播流(FLV、TS、MP3、AAC)
- Android手机扫描mDNS服务
- 数据结构 小顶堆建堆过程 构建过程
- 一个ICT技术资料摘录博客
- 5G技术中的无源光器件(三)
- 分享一些自己的学习过程和学习方法(来自daimajia)
- 下列命令中 哪些用于退出MySQL服务_2021年知到水泵及水泵站(吉林联盟)答案...
- 从零开始学badusb(2)--badusb调用命令行
- pcb - 如果回流焊温度曲线选错了, 可以重新选回流焊温度曲线, 重新进炉子
- Android图片适配分辨率,Android多分辨率适配总结