PHP编译原理之Opcode

一.编译原理的过程

编译程序的工作过程一般可以划分为五个阶段:
  1)词法分析:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词
              (如基本字、标识 符、常量、运算符、标点符、左右括号等)
     描述词法规则通常用:正规式 和 有限自动机
     依循的原则:词法规则。。。线性分析。。。

  2)语法分析:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位(语法范畴)               (如,“短语”、“子句”、“句子”、“程序段”等)
     描述语法规则通常用:上下文无关文法
     依循的原则:语法规则。。。层次结构分析。。。。。

  3)语义分析与中间代码产生:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)。
     描述语义规则通常用:属性文法
     依循的原则:语义规则。。。

  4)优化:对前段产生的中间代码进行加工变换,以便在最后阶段能产生出更高效的目标代码。
     依循的原则:程序的等价不变换规则。

  5)目标代码生成:把中间代码(或经优化处理后)变换成特定机器上的第几语言代码。
     这一阶段实现了最后的翻译。

注:
PHP的编译过程可以参考鸟哥的文章:深入理解PHP原理之Opcodes
二、Opcode的作用
  1)编译原理的中间过程会产生一种中间代码(语言),PHP由Zend引擎(C语言编写)编译后的中间代码为Opcode然后再交由Zend引擎处理,如同C语言编译后汇编代码然后再交由汇编编译处理一样(也可以直接设置编译成二进制文件然后转为机器码),不是不可以直接生成机器码让计算机去执行,而是通过这个过程将复杂的问题分步进行,并且可以根据当前系统环境的不同而对Opcode做进一步的优化,一步一步地去解析和进行。

注:

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

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

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

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



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值