• 注册
当前位置:1313e > php >正文

PHP编译原理之Opcode

一.编译原理的过程

编译程序的工作过程一般可以划分为五个阶段:
  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的编译执行分离

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录