[Deprecated by http://www.phpinternals.com/opcode/]
Opcode的全称是operation code。是Zend Engine产生的中间代码,有点类似于汇编语言。opcode是一个四元组,(opcode, op1, op2, result),它们分别代表opcode,第一操作数,第二操作数,结果。在Zend Engine的实现中,opcode使用下面的结构来实现的。
struct _zend_op {
opcode_handler_t handler; /* OPCODE处理函数 */
znode result; /* 本OPCODE操作结果,根据不同的opcode有不同的含义 */
znode op1; /* 第一操作数 */
znode op2; /* 第二操作数 */
ulong extended_value; /* 与OPCODE有关的扩展值,例如: CAST中保存的就是目标类型 */
uint lineno; /* OPCODE对应的代码的行号 */
zend_uchar opcode; /* OPCODE代码 */
};
在这个结构中, handler是一个函数指针,指向本opcode对应的虚拟机中的处理函数。result是一个znode类型的变量,用于保存操作结果。op1, op2分别是该opcode对应的两个操作数。op1, op2, result在不同的opcode中有不同的含义,不是每个opcode都有这三个变量。extended_value保存的是与opcode有关的扩展值。lineno是该opcode对应的源代码的行号,这个调试错误定位时非常有用;最后一个zend_uchar表示就是这个opcode的代码。因为同一个opcode,由于操作数的类型不同,可能会对应不同的处理函数,因此Zend Engine在实现时在每个_zend_op结构中都保留了handler指针,这样可以提高虚拟机的处理效率。
Zend Engine 2.0/2.1 (对应PHP [...]
Entries Tagged as '未分类'
PHP源代码分析:Opcode列表及功能简介
11月 11th, 2008 · No Comments
Tags: 未分类
[收藏]PHP 5 工作流引擎
11月 6th, 2008 · No Comments
Workflow Engine for PHP 5
View SlideShare presentation or Upload your own. (tags: php workflow)
作者关于工作流引擎的学位论文:Workflow Engine (学位论文)
Tags: 未分类
PHP源代码分析:Zend HashTable详解
11月 4th, 2008 · Comments Off
PHP源代码分析:Zend HashTable详解
By Altair(eniac2008@hotmail.com), http://www.phpinternals.com
本文的PDF版本下载地址:http://www.phpinternals.com/download/zend_hash_v0.2.pdf
在PHP的Zend引擎中,有一个数据结构非常重要,它无处不在,是PHP数据存储的核心,各种常量、变量、函数、类、对象等都用它来组织,这个数据结构就是HashTable。
HashTable在通常的数据结构教材中也称作散列表,哈希表。其基本原理比较简单(如果你对其不熟悉,请查阅随便一本数据结构教材或在网上搜索),但PHP的实现有其独特的地方。理解了HashTable的数据存储结构,对我们分析PHP的源代码,特别是Zend Engine中的虚拟机的实现时,有很重要的帮助。它可以帮助我们在大脑中模拟一个完整的虚拟机的形象。它也是PHP中其它一些数据结构如数组实现的基础。
Zend HashTable的实现结合了双向链表和向量(数组)两种数据结构的优点,为PHP提供了非常高效的数据存储和查询机制。
Let’s begin!
一、 HashTable的数据结构
在Zend Engine中的HashTable的实现代码主要包括zend_hash.h, zend_hash.c这两个文件中。Zend HashTable包括两个主要的数据结构,其一是Bucket(桶)结构,另一个是HashTable结构。Bucket结构是用于保存数据的容器,而HashTable结构则提供了对所有这些Bucket(或桶列)进行管理的机制。
<code>
typedef struct bucket {
ulong h; /* Used for numeric indexing */
uint nKeyLength; /* key 长度 */
void *pData; /* 指向Bucket中保存的数据的指针 */
void *pDataPtr; /* 指针数据 */
struct bucket *pListNext; /* 指向HashTable桶列中下一个元素 */
struct bucket *pListLast; /* 指向HashTable桶列中前一个元素 */
struct bucket *pNext; /* 指向具有同一个hash值的桶列的后一个元素 */
struct bucket *pLast; /* 指向具有同一个hash值的桶列的前一个元素 */
char arKey[1]; /* 必须是最后一个成员,key名称*/
} Bucket;
</code>
在Zend HashTable中,每个数据元素(Bucket)有一个键名(key),它在整个HashTable中是唯一的,不能重复。根据键名可以唯一确定HashTable中的数据元素。键名有两种表示方式。第一种方式使用字符串arKey作为键名,该字符串的长度为nKeyLength。注意到在上面的数据结构中arKey虽然只是一个长度为1的字符数组,但它并不意味着key只能是一个字符。实际上Bucket是一个可变长的结构体,由于arKey是Bucket的最后一个成员变量,通过arKey与nKeyLength结合可确定一个长度为nKeyLength的key。这是C语言编程中的一个比较常用的技巧。另一种键名的表示方式是索引方式,这时nKeyLength总是0,长整型字段h就表示该数据元素的键名。简单的来说,即如果nKeyLength=0,则键名为h;否则键名为arKey, 键名的长度为nKeyLength。
当nKeyLength > 0时,并不表示这时的h值就没有意义。事实上,此时它保存的是arKey对应的hash值。不管hash函数怎么设计,冲突都是不可避免的,也就是说不同的arKey可能有相同的hash值。具有相同hash值的Bucket保存在HashTable的arBuckets数组(参考下面的解释)的同一个索引对应的桶列中。这个桶列是一个双向链表,其前向元素,后向元素分别用pLast, pNext来表示。新插入的Bucket放在该桶列的最前面。
在Bucket中,实际的数据是保存在pData指针指向的内存块中,通常这个内存块是系统另外分配的。但有一种情况例外,就是当Bucket保存的数据是一个指针时,HashTable将不会另外请求系统分配空间来保存这个指针,而是直接将该指针保存到pDataPtr中,然后再将pData指向本结构成员的地址。这样可以提高效率,减少内存碎片。由此我们可以看到PHP HashTable设计的精妙之处。如果Bucket中的数据不是一个指针,pDataPtr为NULL。
HashTable中所有的Bucket通过pListNext, [...]
Tags: PHP Internals · 未分类
Google Chrome 试用小记
09月 3rd, 2008 · No Comments
今天上班第一件事就是下载了一个chrome试用版。第一感觉就是速度真快。下面是个人的试用感觉(按使用顺序):
1. 启动速度真快,比IE,Firefox都要快
2. 排版感觉不是太爽,链接的下划线与文字应该有一个像素的空格,以前Firefox也是这样,FF3已经改过来了。
3.文字缩放基本上不可用。试过一些 news.sina.com.cn, www.donews.com 效果都非常不好。
4. 开发者工具做得还不错,Metrics有点特色,但总体上感觉与IE Developer Toolbar还有一些差距。
5. 可以直接调试JS很不错。
6. 在地址栏可以直接搜索太棒了。
这篇blog是用chrome写的:-D
Tags: 未分类
他山之石:单元测试使编程更有趣
07月 3rd, 2008 · No Comments
原文链接:http://techblog.tilllate.com/2008/06/01/unit-testing-makes-coding-more-fun/
Unit testing makes coding more fun
单元测试使编程更有趣
“unit testing is a test that validates that individual units of source code are working properly”, that’s what Wikipedia says about unit testing. That’s general knowledge.
“单元测试是对源代码每一个程序单元进行的测试,它检查程序模块是否正确地实现了规定的功能。”,这是维基百科(http://en.wikipedia.org/wiki/Unit_testing)上对单元测试的定义。大家也都普通这样认为的。
But what motivates me even more than the increased software quality is that it saves me development time. This sounds odd as you might believe [...]
Tags: 未分类
关于Mysql优化的10篇重要文章
07月 3rd, 2008 · No Comments
原文链接:http://phpimpact.wordpress.com/2008/06/12/10-great-articles-for-optimizing-mysql-queries/
Optimization is a complex task because ultimately it requires understanding of the entire system to be optimized. Although it may be possible to perform some local optimizations with little knowledge of your system or application, the more optimal you want your system to become, the more you must know about it.
优化是一个复杂的任务,因为它要求你必须对整个系统有个透彻的了解。虽然有时候你对系统了解不多也可以做一些局部优化。但是对系统的优化程度要求越高,你对系统的理解程度要求越深。
The following 10 articles explain [...]
Tags: 未分类
Caching Data For Performance
06月 20th, 2008 · No Comments
缓存数据 提高系统性能
[转载]PPT下载
原作者:Dave Ross
caching-data-for-performance
Tags: Performance · 未分类

