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相关推荐

  1. PHP中的opcode

    opcode是php语言里供zend引擎执行的一种中间代码,类似java中的字节码.或者python中的字节码对象pycodeobject. 对于如下的一段php代码 <?php echo &q ...

  2. pandas使用iloc函数基于dataframe数据列的索引抽取单列或者多列数据、其中多列索引需要嵌入在列表方括号[]中、或使用:符号形成起始和终止范围索引

    pandas使用iloc函数基于dataframe数据列的索引抽取单列或者多列数据.其中多列索引需要嵌入在列表方括号[]中.或使用:符号形成起始和终止范围索引 目录

  3. python判断列表list中的内容、数值是否全部都大于某一个阈值(threshold)、如果数值都大于某一个阈值(threshold)则跳出循环

    python判断列表list中的内容.数值是否全部都大于某一个阈值(threshold).python判断列表list中的内容是否全部都大于某一个阈值(threshold).如果数值都大于某一个阈值则 ...

  4. 在(CListView)列表视图中添加右键菜单的方法

    使用弹出式菜单(PopMenu) 弹 出式菜单(PopMenu)大家都熟悉,在WIN98的桌面上单击鼠标右键弹出的菜单就是弹出式菜单.通常情况下,弹出式菜单在鼠标右键单击时弹出,当 然,也可以根据需要 ...

  5. Python 通过all()判断列表(list)中所有元素是否都包含某个字符串(string)

    1.判断列表(list)中,所有元素是否在集合(set)中 list_string = ['big', 'letters'] string_set = set(['hello', 'hi', 'big ...

  6. Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量

    bool是int的子类 a = True print isinstance(a, int) print True == 1 print False == 0 运行结果: True True True ...

  7. python3列表生成式中的for循环与普通放在外面的for循环细微差异

    python3列表生成式中的for循环与普通放在外面的for循环细微差异 实例: 给定列表alist = [1,2,3,4,5,6,7],k=3 想要使用for循环达成输出[5,6,7,1,2,3,4 ...

  8. 接收list对象_PyTorch入门视频笔记从数组、列表对象中创建Tensor

    关注"AI机器学习与深度学习算法"公众号选择"星标"公众号,原创干货,第一时间送达 从数组.列表对象创建 Numpy Array 数组和 Python List ...

  9. python怎么定义一个变量为空列表_python – 为什么一个类变量没有在列表理解中定义,但另一个是?...

    数据是列表理解的根源;它是传递给已创建的嵌套作用域的一个参数. 列表解析中的所有内容都在单独的范围内运行(作为一个函数,基本上),除了用于最左边for循环的iterable之外.你可以在字节码中看到这 ...

最新文章

  1. postgre 没有主键自增ma_PostgreSQL 主键自增解决方案
  2. UPS技术培训系统方案
  3. 使用 okHttp 3.0 版本前后的两点区别.(不要入坑哦)
  4. [POJ1338]Ugly Numbers
  5. SAP Cloud Platform上Fiori launchpad tile的读取原理
  6. .NET Core 3.0之深入源码理解Configuration(一)
  7. 丢弃commit_git丢弃本地修改的所有文件(新增、删除、修改)
  8. android文件读写操作布局文件代码,android实现文件读写功能
  9. Elementui动态换肤
  10. 用border做三角形
  11. python查看网络连接_python – 检查网络连接
  12. Bevy 游戏引擎开发指南
  13. word域转换html,word域代码转换html丢失解决办法.docx
  14. 时间复杂度:O(1)、O(n)、O(n²)、O(nlogn)等是什么意思,白话文解释专业术语。
  15. 2021-02-23
  16. Hello hello world♥
  17. mysql 1677_mysql之数据库主从复制配置报错1677
  18. Python|阶梯电价问题
  19. 一周5G资讯 | 全国已建成5G基站19.8万个,套餐用户5000多万;“新基建”范围首次明确...
  20. autolabor开源ros机器人笔记

热门文章

  1. 【Linux】区分Ubuntu桌面版本和服务器版本
  2. Coding 码市:携手开发者与创业者,重新定义软件外包
  3. 阿里云短信发送接口直接HTTP请求调用
  4. Talib中文文档(二):Momentum Indicators 动量指标
  5. 大学四年,靠着这些学习网站,我从挂科学渣变成了别人眼中的大神
  6. 如何制作win7 U盘安装盘
  7. 无人机飞控 ardupilot Copter-4.0.7 库示例
  8. 测试开发之前端——No8.HTML5中的媒介事件
  9. [Codeforces1155F][DP]Delivery Oligopoly
  10. python去除图片马赛克_python 检测图片是否有马赛克