英语原文共 11 页,剩余内容已隐藏,支付完成后下载完整资料
PHP7中的静态优化
尼基塔·波波夫 比亚焦·科森扎 本·朱林克
Technische Universituml;at Berlin,德国
nikic@php.net, {cosenza, b.juurlink}@tu-berlin.de德米特里·斯托戈夫
Zend Technologies,俄罗斯
摘要
PHP是一种动态类型的编程语言,通常用于Web应用程序的服务器端实现。易于使用和易于部署使得PHP成为使用最广泛的Web脚本语言之一,为WordPress,Wikipedia和Facebook等重要的Web应用程序提供动力。PHP的高度动态性,在提供了有用的语言特性的同时,也使得静态优化变得困难。
本文报告了PHP 7(PHP的最后一个主要版本)的纯静态字节码优化的实现。我们讨论了将在静态类型语言环境下开发的经典编译器优化整合成动态和弱类型的编程语言的挑战,并且这种编程语言支持大量的动态语言特性。在仔细分析语言语义的基础上,我们采用了静态单一赋值(SSA)的形式用于在PHP。结合类型推断,这允许指令的基于类型的专业化,以及各种经典的可使用SSA的编译器优化的应用,例如常量传播或死代码消除。
我们评估提议的静态优化对广泛的程序集合的影响,包括微基准,库和Web框架。尽管PHP具有动态性,但我们的方法在微型基准平台上的平均加速达到了50%,在计算密集型库上平均加速了13%,在web应用上平均加速了1.1%(MediaWiki)和3.5%(WordPress)。
类别和主题描述 D.3.4 [编程语言]:处理器——编译器; D.3.4 [编程语言]:处理器——优化
关键词 PHP,静态优化,SSA形式
1. 介绍
为了跟上Web日益增长的发展趋势,Web应用程序开发主要倾向于使用脚本语言,由于动态打字和交互式开发工作流程,提高了生产效率,因此编译语言的性能更好。
PHP是用于Web应用程序的服务器端实现的脚本语言中最流行的之一[1]。 它为Facebook,维基百科和雅虎等一些最大的网站提供支持,同时也为无数的小型网站(如个人博客)提供支持。
允许将个人或课堂使用的全部或部分作品的数字或印刷版本免费授予,前提是复制品不是为了获利或商业利益而制作或发行的,并且副本在第一页上包含本通知和全部引用。 由ACM以外的其他人拥有的组件的版权必须受到尊重。 信用抽象是允许的.要复制,或重新发布,在服务器上发布或重新分配到列表,需要事先的特定许可和/或费用。 请求权限Permissions@acm.org。
CCrsquo;17, February 5–6, 2017, Austin, TX, USA
c 2017 ACM. 978-1-4503-5233-8/17/02...$15.00
http://dx.doi.org/10.1145/3033019.3033026
为了支持更多的动态特性,PHP和许多其他脚本语言一样,传统上使用解释器来实现。虽然这提供了一个相对简单和便携的实现,但解释比执行本机代码慢得多。出于这个原因,提高动态语言性能的日益普遍的途径是实时(JIT)编译器[2], 如用于PHP的HHVM编译器[3]. 另一方面,JIT编译器在实现复杂性方面花费很大。
在这项工作中,我们采取了一种不同的方法:纯静态的,透明的字节码级优化。这意味着 a)运行时反馈不以任何形式使用,b)不需要修改虚拟机或其他运行时组件,以及 c)在参考PHP实现的字节码上进行优化。 后一点意味着,与许多其他PHP实现不同,我们必须支持语言的全部范围,包括很少使用和难以优化的功能。
这种静态方法是由PHP执行模型驱动的,该模型使用多个进程来基于普通共享内存字节码高速缓存来提供短时间运行的请求。 由于这使得运行时字节码更新有问题,许多动态优化方法变得不适用或效率较低。 我们追求解释性优化,部分原因是PHP 7的成功,其优化的解释器实现在HHVM JIT编译器的20%以内对许多典型的Web应用程序执行[4].
我们的优化基础结构基于静态单一分配(SSA)形式[5] 并利用类型推断来启用基于类型的指令专门化,并支持一系列经典的基于SSA的优化。 由于PHP是动态类型的,并且支持许多动态语言特性,例如范围内省,所以在静态类型语言的背景下开发的经典数据流优化的应用是具有挑战性的。 这需要仔细分析有问题的语义语义以及对SSA形式和使用的优化算法的一些修改。
所描述的优化基础设施的一部分将是PHP 7.1的一部分。 我们的主要贡献是:
- 一种将SSA形式引入到PHP语言中的新方法,包括自适应特殊分配语义和增强使用pi;节点的类型推断。
- 为动态语言实施和分析广泛的SSA优化。
- 对微型基准,库和应用程序(包括WordPress和MediaWiki)的集合进行实验评估。
本文的其余部分结构如下:部分2 介绍有关动态语言优化的相关工作。 部分3 介绍相关的PHP语言语义和部分4 讨论在PHP中使用SSA表单。 在本文中调查的启用SSA的静态优化将在本节中介绍5. 一个实验 -
在微观基准,图书馆和应用程序的心理评估部分介绍6. 本文结尾部分进行讨论和总结7 和8.
相关工作
SSA 静态单个赋值表单[5] 已经成为程序分析和优化代码转换的首选中间表示,并被许多现代优化编译器使用[6–8]. 数据流算法在SSA形式上实现时通常更容易实现,更精确和更高性能。 典型的例子包括稀疏的条件常数传播[9] 和全球价值编号[10]. 最近,由于SSA推理图的和弦简化了寄存器分配,所以SSA形式也成为编译器后端的兴趣所在[11].
特定的应用程序往往需要或受益于基本SSA范例的扩展。 阵列SSA表单[12] 修改SSA以捕获用于并行化的阵列的精确元素级数据流信息。 散列SSA形式[13] 通过引入附加的mu;(may-use)和chi;(may-define)节点来扩展SSA以处理混叠。ABCD算法[14] 引入pi;节点来提高数值范围推理的准确性。 在这项工作中,我们进一步扩展这种用于类型推断的思想。
最近的研究重点是基于SSA优化的形式验证[15–17], 以及SSA建设[18], 和破坏[19].
动态语言优化 已经研究了许多改进传统解释的动态语言的性能的不同方法。 JIT编译器在原始性能方面最成功[2].
另一个途径是将代码转换为较低级别的语言。 例如,Starkiller项目[20] 将Python代码翻译成C ,使用增强的笛卡尔乘积算法[21] 用于类型推断。 但是,这种方法往往不能支持所有的语言语义。
运行时反馈可以通过多种方式整合到解释器中。 动态解读[22] 解释了一个流程图,该流程图不仅可以模拟控制流,还可以模拟类型不确定性 Wu-Thinger等人[23] 使用基于抽象语法树(AST)的解释器的前提是修改AST以合并运行时反馈比修改字节码简单。 布伦 - 泰勒[24] 通过为每条指令添加一个额外的内联缓存指针来解决动态字节码更新的问题。
虚拟机本身的开销也可能减少。 螺纹代码[25], 超级指令和复制[26] 减少间接分支遗漏。 有利的指令调度减少指令缓存未命中[27].
PHP优化 PHP语言的广泛采用激发了一些旨在提高性能的项目的开发。
毫无疑问,最重要的是HipHop虚拟机(HHVM)[3] 由Facebook开发。 HHVM使用JIT编译器对tracelets进行操作,它是具有单个条目但可能具有多个退出的代码区域。 Tracelet象征性地被执行在一个单向传送,正向数据流分析注释指令与输入和输出类型,其中静态未知的输入类型在运行时被观察到。 在tracelet的开始处输入守卫,可以使用大部分完整的类型信息进行优化。 如果一个类型的后卫失败了,tracelet可以被编译成另外一组输入类型。
HHVM的前身是HipHop编译器(HPHPc)[28], 它将PHP代码编译为C 。 编译器根据基于Damas-Milner约束算法的改编推断的类型专门化生成的代码[29]. 没有字节码
代表被使用,而是所有的操作都在AST水平上执行。 HPHPc不支持PHP的一些动态语言功能,并要求提前知道所有代码。
phc编译器[30] 也将PHP转换为C.phc实现的一个重点是精确建模引用的别名行为。 为了实现这一点,流和上下文敏感的别名分析,类型推断和常量传播是在构造散列SSA表单之前同时执行的。 在我们的工作中,我们将很大程度上忽略这个方面,因为在PHP 5.4取消对通过引用的传递支持之后,引用的准确处理变得不那么重要。 此外,将在部分讨论的问题3.5 如果完全支持PHP的错误处理模型,则可以有效地防止这种分析。
一些替代的PHP实现利用现有的JIT实现。 Phalanger[31] 及其继任者Peachpie[32] 瞄准.NET CLR,而Quercus[33] 和JPHP[34] 瞄准JVM。 HippyVM[35] 使用RPython工具链。 虽然这些项目中的很多都报告了对PHP 5的改进,但它们无法达到与HHVM等专用JIT编译器相同的性能水平。
优化约束
PHP支持一些使静态分析复杂化的语言特性。 接下来,我们讨论它们如何影响优化,并说明为什么我们认为某些优化方法目前是不切实际的。一些提到的问题适用于许多脚本语言(动态类型),而另一些则是PHP特定的(参考)。 当我们使用参考PHP实现的字节码进行操作时,还会涉及一些特定于实现的约束。
尽管下面的讨论主要涉及禁止优化的特性,但是PHP语言还有两个属性,使其比其他脚本语言更适合静态优化:首先,PHP具有严格分离的函数范围,并且需要全局变量明确导入。 其次,PHP不支持运行时替换函数或方法(“猴子修补”)。
动态和弱键入
PHP是一种动态类型语言,这意味着变量的类型通常只在运行时确定,并且可能会有所不同。 此外,类型系统很弱,我们认为在操作中使用不匹配的类型通常不会导致错误,而是通过隐式和潜在的有损类型转换来处理。 例如“foo”*“bar”评估为整数
零,因为非数字字符串在之前被转换为零
乘法。lt;
全文共27473字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[13791],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。