PHP JIT 技术详解

发布网友 发布时间:5小时前

我来回答

1个回答

热心网友 时间:4小时前

去年做PHP webshell检测时,我对PHP内核进行了一些研究,特别是它的编译器和虚拟机。我发现PHP的设计和实现比较常规,是经典技术的忠实应用,读起来轻松,但也缺少创新点。在Zend虚拟机上,我们做了污点追踪工作,相比于基于parser的数据流分析,直接做到了Zend VM层,这在解密脱壳方面优势明显。

最近PHP 8发布,官方介绍中提到整个JIT技术由一个核心人员开发,没有备用,这让人们感到担忧。在我看来,JIT在编译领域相对容易实现,不应该只由一个人理解,这激发了我深入研究PHP JIT技术的兴趣。经过一整天的分析,我发现JIT技术在脚本语言中起到关键作用,能够提高执行效率。

PHP JIT技术的拆解分为几个部分:JIT框架、指令生成和集成与实现。JIT框架将部分opcode序列编译成机器码,提高执行效率。指令生成是编译器后端的主要工作,但JIT编译器通常不会追求最佳化,而是找到编译成本和收益之间的平衡。PHP JIT的x86指令生成借助了DynASM项目,该工具设计用于LuaJit,生成的代码质量较低。然而,JIT机制的代码生成质量并不重要,关键在于找到合适的平衡。

在集成与实现阶段,JIT机制集成在opcache扩展中,用于缓存编译后的opcode,可以跨进程使用。在测试代码中,我们编写了一个简单的add函数,循环执行5万次,理论上应该被JIT化。在opcache初始化时,JIT引擎随之初始化,原始opcode生成后,zend_jit_op_array函数开始执行,实现trace逻辑插入。在执行阶段,JIT生成的x86代码被放入共享内存,代码执行流程被替换,提高了执行效率。文章最后总结了PHP JIT技术的工作流程和分析过程。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com