PHP编译原理之Opcode

时间:2021-10-01 14:42:20

一.编译原理的过程

编译程序的工作过程一般可以划分为五个阶段:   1)词法分析:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词               (如基本字、标识 符、常量、运算符、标点符、左右括号等)      描述词法规则通常用:正规式 和 有限自动机      依循的原则:词法规则。。。线性分析。。。
  2)语法分析:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位(语法范畴)               (如,“短语”、“子句”、“句子”、“程序段”等)      描述语法规则通常用:上下文无关文法      依循的原则:语法规则。。。层次结构分析。。。。。
  3)语义分析与中间代码产生:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)。      描述语义规则通常用:属性文法      依循的原则:语义规则。。。
  4)优化:对前段产生的中间代码进行加工变换,以便在最后阶段能产生出更高效的目标代码。      依循的原则:程序的等价不变换规则。
  5)目标代码生成:把中间代码(或经优化处理后)变换成特定机器上的第几语言代码。      这一阶段实现了最后的翻译。
注: PHP的编译过程可以参考鸟哥的文章:深入理解PHP原理之Opcodes 二、Opcode的作用   1)编译原理的中间过程会产生一种中间代码(语言),PHP由Zend引擎(C语言编写)编译后的中间代码为Opcode然后再交由Zend引擎处理,如同C语言编译后汇编代码然后再交由汇编编译处理一样(也可以直接设置编译成二进制文件然后转为机器码),不是不可以直接生成机器码让计算机去执行,而是通过这个过程将复杂的问题分步进行,并且可以根据当前系统环境的不同而对Opcode做进一步的优化,一步一步地去解析和进行。
注:对于PHP的编译过程: 关于PHP的编译和执行分离     PHP对程序员的要求更高

PHP虽然是一种编译型脚本语言(每次都是先编译后执行,不像其他语言直接执行编译文件), 但是它的编译速度非常快, 它的编译不做任何语义优化, 就是简单的忠实的把你所写的代码翻译成对应的Opcodes. 而其他语言因为在编译器做很多的优化工作, 会造成编译比较重, 也一定程度上要求它们分离.

所以, 理论上来说, 通过编译执行分离, 想达到源码加密, 是不会有什么太大收效的, 因为它很容易被反向.

另外, 编译直接分离, 并不会带来特别大的收益, 反而会降低调试部署的效率(想想, 修改, 编译, 发布, 看效果), 并且APC等Opcode Cache工具, 已经很成熟了..

  2)生成的Opcode作为一种中间语言,可以帮助实现PHP源程序代码的不开源,如果你不想别人知道你的PHP代码是怎么写的,那你可以直接使用APC截取生成Opcode缓存文件,然后使用自己的PHP扩展加密程序对Opcode文件进行加密和解密,在Zend引擎对Opcode进行解析前进行解密然后再执行。具体可参考:实现PHP的编译执行分离