php opcode列表,PHP中的opcode
opcode是php语言里供zend引擎执行的一种中间代码,类似java中的字节码、或者python中的字节码对象pycodeobject.
对于如下的一段php代码
echo “Hello World”;
$a = $a + 1;
echo $a;
和传统的编译流程一样,zend引擎在执行这段代码之前,首先会进行词法及语法的分析。词法分析就是将代码识别成一个个的token,对于上边的代码,php词法分析的结果如下:
[
[
379, //token id,T_OPEN_TAG, 可参考token_name(379)的返回结果
"<?php \n", //具体的token
1 //行号
],
[
382, //T_WHITESPACE
"\t",
2
],
[
328,
"echo",
2
],
[
382,
" ",
2
],
[
319,
"\u201cHello",
2
],
[
382,
" ",
2
],
[
319,
"World\u201d",
2
],
";",
[
382,
"\n\t",
2
],
[
320,
"$a",
3
],
[
382,
" ",
3
],
"=",
[
382,
" ",
3
],
[
320,
"$a",
3
],
[
382,
" ",
3
],
"+",
[
382,
" ",
3
],
[
317,
"1",
3
],
";",
[
382,
"\n\t",
3
],
[
328,
"echo",
4
],
[
382,
" ",
4
],
[
320,
"$a",
4
],
";",
[
382,
"\n\n",
4
]
]
可以看到,识别的结果是一个个的token array,每个token array的第一元素是zend引擎中定义的token id,第二个元素是具体的token,第三个是在源码中的行号。
php的词法及语法分析都是基于开源的lex yac工具,在语法分析阶段,php根据定义的形式语言描述验证给定的代码是否符合php语言语法规范,并在此过程中生成对应的opcode,opcode列表参考:http://php.net/manual/en/internals2.opcodes.php
安装vld之后,即可通过php -dvld.active=1 test.php 查看对应的opcode,如下
Finding entry points
Branch analysis from position: 0
Jump found. (Code = 62) Position 1 = -2
function name: (null)
number of ops: 6
compiled vars: !0 = $a
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > ECHO 'Hello+World'
3 1 ASSIGN !0, 1
4 2 ADD ~2 !0, 1
3 ASSIGN !0, ~2
5 4 ECHO !0
7 5 > RETURN 1
branch: # 0; line: 2- 7; sop: 0; eop: 5; out1: -2
path #1: 0,
opcode可能包含如下字段:
(1)line:在源码中的行号
(2)#:opcode 编号
(3)op:名称
(4)fetch:
(5)ext:与该opcode关联的额外数据,如跳转的目标opcode
(6)return:返回值存储的问题
(7)operands:操作数
php opcode列表,PHP中的opcode相关推荐
- PHP中的opcode
opcode是php语言里供zend引擎执行的一种中间代码,类似java中的字节码.或者python中的字节码对象pycodeobject. 对于如下的一段php代码 <?php echo &q ...
- pandas使用iloc函数基于dataframe数据列的索引抽取单列或者多列数据、其中多列索引需要嵌入在列表方括号[]中、或使用:符号形成起始和终止范围索引
pandas使用iloc函数基于dataframe数据列的索引抽取单列或者多列数据.其中多列索引需要嵌入在列表方括号[]中.或使用:符号形成起始和终止范围索引 目录
- python判断列表list中的内容、数值是否全部都大于某一个阈值(threshold)、如果数值都大于某一个阈值(threshold)则跳出循环
python判断列表list中的内容.数值是否全部都大于某一个阈值(threshold).python判断列表list中的内容是否全部都大于某一个阈值(threshold).如果数值都大于某一个阈值则 ...
- 在(CListView)列表视图中添加右键菜单的方法
使用弹出式菜单(PopMenu) 弹 出式菜单(PopMenu)大家都熟悉,在WIN98的桌面上单击鼠标右键弹出的菜单就是弹出式菜单.通常情况下,弹出式菜单在鼠标右键单击时弹出,当 然,也可以根据需要 ...
- Python 通过all()判断列表(list)中所有元素是否都包含某个字符串(string)
1.判断列表(list)中,所有元素是否在集合(set)中 list_string = ['big', 'letters'] string_set = set(['hello', 'hi', 'big ...
- Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量
bool是int的子类 a = True print isinstance(a, int) print True == 1 print False == 0 运行结果: True True True ...
- python3列表生成式中的for循环与普通放在外面的for循环细微差异
python3列表生成式中的for循环与普通放在外面的for循环细微差异 实例: 给定列表alist = [1,2,3,4,5,6,7],k=3 想要使用for循环达成输出[5,6,7,1,2,3,4 ...
- 接收list对象_PyTorch入门视频笔记从数组、列表对象中创建Tensor
关注"AI机器学习与深度学习算法"公众号选择"星标"公众号,原创干货,第一时间送达 从数组.列表对象创建 Numpy Array 数组和 Python List ...
- python怎么定义一个变量为空列表_python – 为什么一个类变量没有在列表理解中定义,但另一个是?...
数据是列表理解的根源;它是传递给已创建的嵌套作用域的一个参数. 列表解析中的所有内容都在单独的范围内运行(作为一个函数,基本上),除了用于最左边for循环的iterable之外.你可以在字节码中看到这 ...
最新文章
- postgre 没有主键自增ma_PostgreSQL 主键自增解决方案
- UPS技术培训系统方案
- 使用 okHttp 3.0 版本前后的两点区别.(不要入坑哦)
- [POJ1338]Ugly Numbers
- SAP Cloud Platform上Fiori launchpad tile的读取原理
- .NET Core 3.0之深入源码理解Configuration(一)
- 丢弃commit_git丢弃本地修改的所有文件(新增、删除、修改)
- android文件读写操作布局文件代码,android实现文件读写功能
- Elementui动态换肤
- 用border做三角形
- python查看网络连接_python – 检查网络连接
- Bevy 游戏引擎开发指南
- word域转换html,word域代码转换html丢失解决办法.docx
- 时间复杂度:O(1)、O(n)、O(n²)、O(nlogn)等是什么意思,白话文解释专业术语。
- 2021-02-23
- Hello hello world♥
- mysql 1677_mysql之数据库主从复制配置报错1677
- Python|阶梯电价问题
- 一周5G资讯 | 全国已建成5G基站19.8万个,套餐用户5000多万;“新基建”范围首次明确...
- autolabor开源ros机器人笔记
热门文章
- 【Linux】区分Ubuntu桌面版本和服务器版本
- Coding 码市:携手开发者与创业者,重新定义软件外包
- 阿里云短信发送接口直接HTTP请求调用
- Talib中文文档(二):Momentum Indicators 动量指标
- 大学四年,靠着这些学习网站,我从挂科学渣变成了别人眼中的大神
- 如何制作win7 U盘安装盘
- 无人机飞控 ardupilot Copter-4.0.7 库示例
- 测试开发之前端——No8.HTML5中的媒介事件
- [Codeforces1155F][DP]Delivery Oligopoly
- python去除图片马赛克_python 检测图片是否有马赛克