业务推动技术的进步(转)

PHP 是最流行的用于 web 开发的脚本语言之一。PHP 的最新版本,PHP 7
在性能上做了很大的优化。不过,PHP 还有一个竞争对手 HHVM (HipHop Virtual
Machine) — 一个运行 PHP
代码的虚拟工具。二者直接的比较正在升温,那么让我们来看一下他们直接的性能对比吧。

来源:

 

什么是 HHVM?

在2008年,Facebook 启动了一项工作,计划开发一个工具 将 PHP
脚本转换成 C++,这样就可以被编译后在 web
服务器上运行。目的是节省服务器资源,这是一个很重要的目标,因为 Facebook
的用户量正在快速增长。从这个意义上讲,这个项目是成功的,因为它可以让服务器处理之前五到六倍的请求量。

时间回到2010年,Facebook
的服务器需求已经增加了很多,是时候考虑用新的创新来提升更大的效率。基于这个需求,Facebook
开发了 HHVM。

HHVM 使用了 Just-In-Time (JIT) 编译方式将 PHP
代码转换成某种字节码。接下来把字节码再转换成机器码并进行优化,让它尽可能快的运行。

作者:徐汉彬

 赵海平,2007 年加入只有不到 50 个软件工程师的
Facebook,致力于软件性能和架构分析,在此期间创建了 HipHop
项目,重新编写和实现 PHP 语言,使其速度提高 5 到 6
倍,为公司节约数十亿美元。HipHop
项目之后,致力于“用异步处理来优化分布式系统”的设计理念中,并为此做了多项分布式数据库的优化研究,在
PHP 语言中加入了 yield 和 generator 的新功能,来帮助日趋复杂的 Facebook
网页设计。

什么是PHP 7?

PHP 7 是 PHP 社区对 HHVM 的回应。PHP 7 发布的预览版本号称比之前的 PHP 5
的性能要提升100%。

你可能会问 PHP 的版本直接从 PHP5 跳到了 PHP7,答案是这样的:PHP6
的开发开始于2005年,但是它的进展过于缓慢又出现了很多的问题,这样 PHP6
在它还没有发布正式版本之前就有了不好的名声。所以PHP社区决定给这个语言的新版本直接命名为
PHP7。

真正的问题不是 PHP5 和 PHP7 之间的比较,因为已经很明显了 PHP7
提供了更快速的运行速度。但是我们想比较的是 PHP7 和
HHVM。很多专家已经分别使用了这两个方法来处理PHP代码,并且揭示了一些有趣的结论。

摘要:近日,PHP7和HHVM的性能之争成为了一个讨论热点,但毫无疑问,它们都在提升PHP执行性能方面取得了突破性的进展。本期《问底》,徐汉彬将为大家科普和介绍它们的性能之争。

  2015 年 3
月,他回到中国,加入阿里巴巴技术保障部,任职研究员,将重点攻克阿里巴巴在软件性能以及
Java 使用过程中遇到的技术问题。

比较 PHP7 和 HHVM 的异同:

在回答哪个更好之前,让我们先来看一下他们之间的关键不同点和相似之处。

代码解析:

PHP7 和 HHVM 之间的基本不同之处在于他们解析 PHP 代码的方式。PHP7
使用标准的 PHP
解析器,它是一个可以给所有人使用的免费软件,可以在服务器上直接解析和运行。它生成
HTML 代码,然后发送给客户端,客户端显示出用户期望的内容。

相比之下,HHVM 首先把 PHP 代码转化为 HipHop
字节代码,这个代码再被翻译成机器码然后执行。在这个过程中 HHVM
会对代码进行优化,优化一些影响执行效率的 PHP 代码,目标是提高运行速度。

选择 PHP 7 的理由


  • PHP 7 在某些情况下比 HHVM 更快,包括运行 Drupal 8。
  •  使用 PHP 7 不需要安装设置 HHVM。
  • 尽管很多 PHP 4 的功能在新版本中不再支持,但用 PHP 5 写的代码在转换到
    PHP 7 后将会如预期一样工作。
  • PHP 7 由 PHP 社区开发,这是一群开发稳定可靠 PHP 版本久负盛名的人。

【导读】徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设。最近,PHP7和HHVM的性能之争成为了一个讨论热点,它们都在提升PHP执行性能方面取得了突破性的进展。这篇文章,参考了两个社区的技术新进展,为大家科普和介绍它们的性能之争。

  InfoQ:首先欢迎您回到中国。可以介绍一下您加入阿里巴巴的初衷吗,阿里巴巴最吸引您的地方在哪里?

HHVM vs. PHP 7: 作出你的选择

不要犹豫太久,Kinsta 建议那些在线的网站尽量在 PHP 7 与 HHVM
之间作出选择,早点开始实施解决方案,让你的网站性能得到优化。一个低效的网站也会让你的声誉受损,那将很难挽回。

相对于旧版本的 PHP,HHVM and PHP 7
都更有益。作出决定,尽快将你的网站切换到新的系统。

图片 1

  赵海平:去年机缘巧合,我和阿里巴巴的同事有了交流的机会。当时我们聊了很多技术细节,发现阿里巴巴的规模非常之大,很多技术上的难题是美国公司都没有的。比如说双十一这个问题,没有哪家美国公司单天有这么大的交易量,这是很特殊的一个问题。这个技术问题对我特别有吸引力。

PHP语言的排名变化

根据“TIOBE编程语言排行榜”(榜单虽然统计方式有局限,但是仍然不失为一个比较好的参考),2010年PHP最高曾经在世界编程语言中排名第三。可见,PHP语言在PC互联网时代的Web领域可谓叱咤风云,擎天一柱。

图片 2

在PHP程序员中,曾经流传着一个段子:

某女:你能让这个论坛的人都吵起来,我就跟你吃饭。
PHP程序员:PHP是世界上最好的语言!
某论坛炸锅了,各种吵架……
某女:服了你了,我们走吧!
PHP程序员:今天不行,我一定要说服他们,PHP必须是最好的语言。

好了,我们言归正传,语言本身无分好坏,只是在各自使用的场景中解决不同的问题。互联网的时代车轮是很快的,随着移动互联网的到来,在短短四年多的时间里,移动端技术发展横扫全球。与此同时,各种语言群雄并起,而昔日辉煌的PHP从原来的编程语言的榜单看,下降到第六位(2014年12月榜单)。于是,唱衰PHP的声音此起彼伏。

图片 3

但是,鸟哥(惠新宸,PHP语言开发者之一)在2014年的Qcon分享中有一个数据,全球排名前100万的网站中,81.3%使用的Web服务端脚本语言是PHP,2013年同期是78.3%。也就是说,PHP的在Web服务方面并没有减少,只是在移动互联网浪潮中,增加了很多的其他语言技术的应用,进而被稀释了。

最近关于PHP7和HHVM的性能对比,成为了一个热点的争议话题,大家都在讨论和关注哪一个才是PHP性能提升的未来。

  当规模大到一定程度,简单的问题也会变得复杂。有的时候软件就是这个样子,在一台或者几台机器上执行是一个情况,当机器多到一定程度时,对软件的要求就特别高了。在多台机器上,怎么才能保持很快的速度,并且节省机器,又不出问题,这是一个很难的技术问题。

HHVM(HipHop Virtual Machine)的起源

HHVM是一个开源的PHP虚拟机,使用JIT的编译方式以及其他技术,让PHP代码的执行性能大幅提升。据传,可以将当前版本的原生PHP代码提升5-10倍的执行性能。

HHVM起源于Facebook公司,Facebook早起的很多代码是使用PHP来开发的,但是,随着业务的快速发展,PHP执行效率成为越来越明显的问题。为了优化执行效率,Facebook在2008年就开始使用HipHop,这是一种PHP执行引擎,最初是为了将Fackbook的大量PHP代码转成
C++,以提高性能和节约资源。使用HipHop的PHP代码在性能上有数倍的提升。后来,Facebook将HipHop平台开源,逐渐发展为现在的HHVM。

  1. PHP为什么慢?

PHP的慢是相对于C/C++级别的语言来说,事实上,PHP语言最初的设计,就不是用来解决计算密集型的应用场景。我们可以这样粗略理解为,PHP为了提升开发效率,而牺牲了执行效率。

我们知道PHP一个很大的特点,就是弱类型特性,也就是说,我可以随意定义一个变量,然后给它随意赋值为各种类型的数据。以一个int整型数字为例子,在C语言中:

int num = 200;//通常是4字节

但是,如果是PHP定义了一个同样的变量,实际对应的存储结构则是:

图片 4

这个结构体将会占据远比C变量多得多的内存,PHP中定义方式如下:

$a = 200;//这变量将实际占用对比C变量很多倍的存储空间。

其实对PHP来说,无论存储什么类型的数据,都是用上述“通杀”的结构体实现。为了兼容PHP程序员的变量类型“乱入”,PHP做到了对开发者的友好,但是对执行引擎很残酷。单个变量内存消耗可能还不明显,一旦用到PHP的数组等,则复杂度指数上升(数组的实现是HashTable)。然后,Zend引擎执行时,将这些PHP代码编译为opcode(PHP的中间字节码,格式有点类似于汇编),由Zend引擎逐行解释执行。

无论是字符串的连接操作,还是数组的简单修改等,几乎都是“PHP程序员一句话,Zend引擎跑断腿”的节奏。因此,同样的操作,对比C来说,PHP消耗了更多的CPU和内存等系统资源。除此之外,还有内存自动回收、变量类型判断等等,都会增加系统资源的消耗。

例如,我用纯PHP实现的快速排序函数和原生sort函数,排序10000个整型数字,来做一个耗时对比,结果如下:

图片 5

原生的sort耗时3.44 ms,而我们自己实现的PHP函数sort则是68.79
ms。我们发现,两者执行效率差距巨大。我的测试方式,是计算函数执行前后的时间间隔,而不是整个PHP脚本从启动到结束的时间。PHP脚本启动和关闭过程,本身有着一系列的初始化和清理工作,也会占据不少的耗时。

图片 6

通常情况下,PHP执行效率的排行是:

  1. 最快的是PHP语言结构(isset、echo等),PHP语言的一部分(它们根本不是函数)。
  2. 然后比较快的就是PHP的原生和拓展函数。PHP拓展,基于Zend
    API之上,用C实现的功能,执行效率和C++/Java是属于同一个数量级的。
  3. 真正慢的就是,我们通过PHP自己写的代码和函数。例如,假如我们使用的比较重的纯PHP实现的框架,因为框架本身的模块很多,所以,会明显拖累语言层面的执行效率,同时占据更多的内存。(国内的Yaf框架,以拓展的方式实现,因此执行效率远快于纯PHP写的框架)

图片 7

在一般情况下,我们并不推荐用过PHP实现逻辑复杂计算类型的功能,尤其是Web系统流量比较大的场景下。因此,PHP程序员应该对PHP的各种原生函数和各类拓展有一个比较广泛的了解,在具体的功能实现场景中,寻求更原生的解决方案(原生接口或者拓展),而不是自己写一堆复杂的PHP代码来实现这类型功能。

如果有足够的PHP拓展开发实力,将这类型业务功能重写为一个PHP拓展,也会大幅提升代码的执行效率。这是一个非常不错的方式,也被广泛应用PHP优化中。但是,自己编写的PHP业务拓展的缺点也很明显:

  1. 拓展开发耗时比较长,需求变更的时候修改也复杂,写得不好可能会影响Web服务稳定性。(例如,在Apache的worker模式下,多线程场景下挂掉,会影响同一个进程下的其他正常子线程。如果是多线程的Web模式,编写拓展还需要支持线程安全)
  2. 拓展在PHP版本升级的时候,可能需要做额外的兼容工作。
  3. 人员变动后的维护和接手成本也比较高。

实际上,在互联网一线企业中,更常见的解决方案,并非增加PHP拓展,而用C/C++独立写一个服务server,然后PHP通过socket和服务server通信来完成业务处理,并不将PHP本身和业务耦合在一起。

不过,Web服务大部分的性能瓶颈都在网络传输和其他服务server的耗时上(例如MySQL等),PHP执行的耗时在整体耗时的占用比例非常小,所以从业务角度来说,影响可能并不明显。

  1. HHVM提升PHP执行性能的方式

HHVM提升PHP性能的途径,采用的方式就是替代Zend引擎来生成和执行PHP的中间字节码(HHVM生成自己格式的中间字节码),执行时通过JIT(Just
In
Time,即时编译是种软件优化技术,指在运行时才会去编译字节码为机器码)转为机器码执行。Zend引擎默认做法,是先编译为opcode,然后再逐条执行,通常每条指令对应的是C语言级别的函数。如果我们产生大量重复的opcode(纯PHP写的代码和函数),对应的则是Zend多次逐条执行这些C代码。而JIT所做的则是更进一步,将大量重复执行的字节码在运行的时候编译为机器码,达到提高执行效率的目的。通常,触发JIT的条件是代码或者函数被多次重复调用。

图片 8

普通的PHP代码,因为无法固定变量的类型,需要额外添加判断类型的逻辑代码,这样PHP代码是不利于CPU执行和优化的。因此,HHVM通常需要用到Hack写法(为了兼容某种特性而额外添加的技巧性质的代码)的PHP代码来“配合”,就是为了让变量类型固定,方便虚拟机编译执行。PHP追求以一种形式来容纳一切类型,而Hack则可以将被容纳的一切标记上确定的类型。

PHP代码的Hack写法的例子:

图片 9

上面的例子中,PHP代码主要被添加上了变量类型。Hack写法的总体方向,就是将之前“动态”的写法变为“静态”的写法,来配合HHVM。

HHVM因为它的高性能而吸引了不少人的关注,一些一线互联网公司也开始跟进使用。从纯语言执行性能测试结果来看,HHVM领先了开发中的PHP7版本不少。

图片 10

不过,从具体业务场景来看,HHVM和PHP7的差距并没有那么大,以WordPress开源博客首页为测试场景的结果中,他们目前的差距并不明显。

图片 11

但是,PHP7目前还在开发中,就已经可用的技术方案来看,目前的HHVM略胜一筹。不过,HHVM的部署和应用都存在一些的问题:

  1. 服务部署比较复杂,有一定维护成本。
  2. 对PHP原生代码并非完整支持,PHP拓展也需要做适当的兼容。
  3. HHVM是个新虚拟机,长时间运行有内存泄露。(据说,一线互联网公司在应用这个技术时,是通过自己打Patch的方式解决内存泄露)

HHVM毕竟是一个相对比较新的开源项目,发展到成熟仍然需要一定时间。

  单天的资源需求是平时的好多倍,怎么计划机器,让峰值最高的那天不出现问题,平时又要做到很好的利用,这是很不容易的。我特别希望自己能够有这么一个经历,去阿里巴巴解决这个问题,这是在其他公司找不到的技术问题,而且跟我很对口,我一直在做的都是怎么提高大规模系统的性能、稳定性,所以这正是我的兴趣所在。

PHP7的性能革新

PHP长期以来饱受批评的性能问题,将会在这个版本得到大幅度的改善。版本中间没有PHP6哈,据说,是因为这个版本曾经立过项目,后来大部分功能都在5.x的版本里实现了,为了避免混淆,下一个大版本直接就是PHP7。(几年以前,我还看到过关于PHP6的书籍。)

  1. PHP7的介绍

虽然PHP7的正式版本可能要到2015年的10月份才发布,不过明年6月份应可以看见一个测试版本了,之后是3-4个月的质量保证。

PHP社区的项目计划如下:

图片 12

因为项目仍然处于开发中的原因,从表格中,可以看见的特性描述都比较模糊。肯定有更多的其他特性,只是尚未公布。下面的这些,是从PHP社区看见的,因为PHP7是一个开发中的项目,下面的这些也不一定准确,不过,不妨碍我们一起来看看。

  1. PHPNG(PHP next
    generation,下一代PHP),对Zend执行引擎本身的各种性能优化,其中JIT,可能会实现在Zend
    Opcache组件中。
  2. AST(Abstract Syntax
    Tree,抽象语法树),目的是在PHP编译过程引入一个中间件,替代直接从解释器吐出opcode的方式。让解释器和编译器解耦,可以减少大量Hack代码,同时,让实现更容易理解和维护。
  3. uniform variable
    syntax(统一变量语法),引入一种内部一致和完整的变量语法,让PHP的解析器更完整地支持各种类型的变量。部分变量的用法需要调整,例如变量的变量$$a等。
  4. 支持integer
    semantics(整型语义),例如NaN、Infinity、<<、>>,修正list()的一致性等等。

上面的特性中,最令人期待的就是PHPng的性能优化,PHP社区已经放出了一些性能的测速数据。从数据上看,PHPng的执行性能比起项目启动之初,已经有接近1倍的提升。这个成绩已经非常不错,况且,最关键的是PHP7的优化计划还有很多尚未完成。等到都全部完成了,相信我们可以看见一个性能更高的PHP7。

这测速数据是来自于PHP社区(wiki.php.net/phpng),截取了一部分的数据:

图片 13

对其当前PHP5.6版本,PHPNG的10月份性能提升已经非常明显了:

图片 14

简单翻译下:

  • 综合测试速度提升35%。
  • 在实际应用场景有20%-70%的速度提升(WordPress首页有60%的提升)
  • 更少的内存消耗
  • 支持大部分常用的SAPIs
  • 支持大部分的PHP拓展绑定到资源分配(69个完成,6个待迁移)
  • 提供堪比HHVM3.3.0的执行速度
  1. PHP的弱类型争议

PHP被争议的特点很多,但是随着语言版本的发布和完善,功能和特性方面的批评开始变少了。但是,PHP的“弱类型”特性,却明显受到更多的争议,从HHVM通过Hack的方式直接“去掉”了“弱类型”特性可以看出,HHVM并不喜欢“弱类型”特性。然而,在我们很多PHP程序员的眼中,这却是PHP的重要优点之一。PHP里的变量被设计得随性和飘逸,海纳百川,一切皆可包容,不是让语言显得更为简单吗?

实际上,有些人认为它是个严重的问题,对于“弱类型”的批评观点大致如下:

  1. 在“严谨”的语言中,通常是预先定义好一个变量的类型,自始至终,变量的类型是固定的,使用范围也是固定。而PHP的变量,通常我们只能看见它名字,类型大部分都不可以预先定义,并且还可以随意改变。(内存分配不好管理)
  2. 为了兼容弱类型特性,PHP需要实现大量兼容代码,包括类型判断、类型转换、存储方式等,增加了语言内部的复杂度。(执行效率低下)
  3. 变量的类型是不可控的,在执行过程中存在大量的“隐性类型转换”,容易产生不可预知的结果。(这里的确需要强调,PHP的类型转换是个必须掌握的点,各种类型的互相转换的可能会产生很多问题,尤其是初学PHP的同学哈)

他们认为,这些都不符合“所见即所得”的简单性,而语法严谨的语言更高效率,也更容易“理解”。

受到类似批评的还有Javascript等语言,因为它在这个问题上的表现是一样的。但是,一门语言最终被大规模使用,必然有它们的道理。PHP成为Web服务开发的首选脚本语言,Javascript则直接称霸Web前端领域,能走到这一步都不可能是偶然因素,开发者们用脚投票选择了它们。编程语言是人类和机器沟通的桥梁,终极追求是实现“人人皆可编程”的宏伟目标。

纵观语言发展历史,从0和1的机器码开始,到汇编语言,然后到C语言,再到动态脚本语言PHP。执行效率呈指数下降,但是,学习门槛也呈指数降低。PHP语言不仅屏蔽了C的内存管理和指针的复杂性,而且更进一步屏蔽了变量类型的复杂性。提升了项目开发的效率,降低了学习的门槛,但同时牺牲了一定的执行性能。然后,HHVM的Hack给我们一种“回归原始”的感觉,重新引入了变量的复杂性。当然,不同的语言解决不同场景下的问题,并不能够一概而论。

图片 15

  InfoQ:您在阿里巴巴的新角色就是解决这些基础设施的性能问题?

小结

HHVM对PHP的性能提升,让人眼前一亮,而磨刀霍霍的PHP7则让人万分期待。两者都是极其优秀的开源项目,都在不断前进和发展中。就目前而言,因为距离PHP7正式版的发布还有比较长的一段时间,所以当前性能优化方案的首选当然是HHVM。不过,就我个人而言,我比较看好PHP7,因为它更能做到PHP代码的向下兼容。如果两者性能相差不大,我会选择简单的那个。

参考资料:

  赵海平:基本上是几个方面,性能、稳定性、容量、架构,还有运维,恰恰就是我现在这个团队——技术保障部——的工作。性能提升上去,容量就增加了,随着我们监控系统的改进,系统的稳定性也会提高,运维也会更方便。如果发现架构上的问题,我们也会做些调整。

  InfoQ:谈到性能问题,定位是很关键的一点。像这种规模的分布式系统,如何实现全系统的监控,准确定位问题就非常重要,您会在这方面发力吗?

  赵海平:Profiling 特别重要。如果能有一个特别强大的 Profiling
系统,就知道整个系统在哪个地方,哪台机器上,花了多少 CPU、内存、磁盘 IO
或者网络带宽等资源,才能知道优化什么地方效益最大。

  所以我的第一步工作就是帮助完善阿里巴巴的监控和 Profiling
系统,希望能够很清楚地把软件的整个性能展现给大家,做到实时监控,同时让研发人员看到自己的代码在线上的运行情况,了解这些代码花掉了多少资源,这样有问题的话他们可以自己解决。

  InfoQ:大家对您的最初印象多是来自 HipHop for PHP
这个项目。像淘宝之前就从 PHP 切换到了 Java,而 Facebook 选择了自己改进
PHP。可以谈一下这个项目吗,当时的出发点是什么样的?

  赵海平:HipHop 也是一步步慢慢建立起来的。最初是我遇到了一个 PHP
的函数,在 C++ 里也想用。当时想,重写一下就可以。不过那个 PHP
函数不断在变,我就想写一个简单的工具,把这个函数转换成C++,这样就可以跟上
PHP 代码的变化。那时正好机器开始吃紧,大家意识到 PHP 的速度问题,CPU
消耗很大。大家就开始讨论如何提高 PHP 的性能。当时想法很多,有人想改变
PHP 本身,有人想干脆用 Python 或 Java 重写网站。

  当时也重写过,有三四个人在做这件事情,但这些人改的速度远远赶不上另外二三十人写新
PHP
业务代码的速度。所以我们就想到写一个工具,来转换这些新写的代码,既不干扰既有的开发节奏,又能大幅优化性能,跟上变化。

  当时我也读了下 Zend Engine 的代码,研究 PHP 为什么会慢。发现 PHP
速度之所以慢,是因为有很多的函数调用是动态的,而像C和 C++
里,很多函数是静态调用,不需要在执行的过程中去查询函数指针在什么地方,所以速度才快。

  所以我们做了很大的调整,一定要改变这种方式,争取让所有的函数调用都能尽快实现,在编译的时候静态处理,执行的过程中就不需要再查询,指针已经在那儿了,这是最主要的加速思路。

  那时候就萌芽了一个想法,如果能够把 PHP
直接转换成C++,也许这个性能问题就解决了。然后就花了很多时间去做原型。我们做了很多工作,把底层的
PHP 实现都改变了,有一个自己的 Runtime Library,再就是一个 PHP
的扩展库,这个实际上是很大的一块代码。在这个上面,我们又写了一个把 PHP
转换成 C++ 的一个编译器。先将 PHP
编译成C++,然后靠底下的这个库实现功能。这是最早期的工作。

  不过这在当时只是一个副业,因为不知道这个东西到底有没有意义,是不是能提高性能。大概能拿出
30%~40%
的时间做这个。做完之后发现效果很好,就加入了其他同事一起做。后来速度不断提高,第一年提高了
2 倍,第二年又提高了 2 倍,后来提高到5~6 倍的样子。

  现在回头看,如果当时雇很多人把网站改成 Java 的,也是可以做到的,但
Facebook 的发展可能要停半年到一年时间,甚至更久,就有可能对 Facebook
的发展带来不可预期的影响。这件事情主要还是业务推动的。

  InfoQ:后来 HipHop 发展成 HHVM,从原来的静态编译变成了动态的 JIT
机制,您也参与了这方面的工作吗?

  赵海平:引入 HipHop
之后,我们也有自己本身的一些问题,比如产品环境和开发环境就是不一样的,这样多多少少会存在一些问题,也就容易出现
bug。再就是 Facebook
的代码量非常庞大,编译时间非常长,另外生成的二进制文件也非常大(超过
1G),发布也很困难。

  这时就出现了 HHVM。HHVM 不再是把 PHP
转换成C++,而是采用了一种新方法,把 PHP
转换成一个中间码,这个中间码在执行过程中再转换成机器码,不过调用的还是我们原来为
HipHop 写的底层库,它取代的主要是把 PHP 编译为 C++ 的过程。

  我并没有参与 HHVM
的编写,当时我已经离开这个小组了,另外一件事情吸引了我,这就是异步处理在分布式系统中的优化作用。

  之所以离开这个小组,原因大概有几个方面:一个是,个人认为 HHVM
不再能把性能提高更多了,后来也确实如此,两三年之后 HHVM
出来,速度并没有更大的提高,最高只比原来静态编译机制快
10%~15%,而且是因为静态编译这一块不再开发了。再就是新的课题特别有意思,具体我会在
QCon 北京上分享。

  这就是为什么去 GitHub 上看,HHVM
里面会有我的代码,主要是底层的代码还是基于 HipHop 的。HHVM
的头两个字母就是来自 HipHop,引擎还是原来的,不过上面做了很多工作,把
PHP 转换成中间代码,这个有点像 Java 的
JVM。这样的好处就是研发过程和产品过程其实是一样的,而且不会有原来说的那种超大二进制文件的问题。中间代码很小,PHP
可以直接发布到线上系统上。

  InfoQ:国外一些著名的互联网公司,在性能调整和优化的过程中,慢慢都发展出了自己的编程语言,像
Facebook 设计了 Hack 语言,Google 有 Go 和 Dart 等语言,Apple 有 Swift
等。这方面您有什么感想吗,Facebook 的 Hack 语言您是不是参与设计了?

  赵海平:Google 的 Go 语言挺有意思的,写得非常好。Hack
语言我没有太多的参与。

  PHP
是弱类型的,这是性能提高的一个瓶颈,而强类型的话就可以做很多优化。最初我们是想增强
PHP 的类型系统。强化数据类型,这是引入 Hack 的一个主要因素。

  InfoQ:PHP7 最近也有很多改变,性能提高也比较大。

  赵海平:这也是我临来之前刚刚听到的。PHP
核心开发组的力量是很强的。我也跟他们的人员交流过,他们对整个 PHP
的优化有自己的思路和想法,也做了很多工作。这是件好事。其实重要的并不是说哪个团队或小组把
PHP 优化到什么样的地步,有几个小组都在做这个事情,彼此竞争,会促进整个
PHP 生态系统的发展。这种竞争也恰恰说明了 PHP
的重要,所以会有很多人关注它的性能优化。

  InfoQ:您对公司发明创造自己的编程语言怎么看?

  赵海平:编程语言这个问题,我说两点。第一,不能把语言当成一个特别神圣、至高无上的东西。语言也是整个软件系统的一部分,只是它分割的很好,独立出来了,可以执行更多的功能,我们可以用它实现我们的功能,可是在整体架构上看,语言也只不过是软件系统的一部分,而这一部分我们完全可以做一些调整,使其更适合我们的系统。而设计语言时一般考虑的是比较通用的目标,我们拿来用,只是因为它的绝大部分特性都是我们想用的。比如我们用C和
C++ 写程序的时候,每次都要思考内存的模式是什么,是不是用 share
pointer,是不是用自己写的 Object,内存的 allocation/deallocation
怎么做,一个语言帮我们把这些事情都做好了,这就是它的好处。它提供了一个很大的库,提供了一个软件执行的环境和范围,而这正是我们选择语言的初衷。

  第二,作为一个公司来讲,不能说为了研发一个语言而去研发一个语言。这是没有意义的。一定要根据自己想要做的事情,在现有的软件架构当中,我们发现当前所用的语言提供的环境和范围不太适合,或者说这个语言的很多假设和假想,和我们所期待的东西并不一样,只有在这个时候,我们怎么也找不到一个合适语言的时候,我们才会创造一个新的语言,让这个语言更适合公司的事情。如果可以通用化,提炼出来,那就是语言,否则设计成软件库就可以了。

  这是水到渠成的,不要强求。像 Google 开发 Go
语言,我认为它有自己的考量,可能在开发很多分布式系统的时候,现在的语言写法上不太直观,或者速度不够快,所以才创造了这么一个东西。Go
应该能解决公司内部的很多问题,否则是很难存活的。

  InfoQ:您可以结合自己这些年的经验,给中国开发者的成长一些建议吗?

  赵海平:在美国的时候,我跟 Facebook
的中国员工聊的很多。我给他们最多的建议就几条。

  第一,一定要提高交流能力。咱们中国人,尤其是中国搞计算机的人,很多人有个不该有的特点,就是喜欢把自己锁在黑屋子里埋头干活,跟机器交流特别擅长,跟人的交流一窍不通。这样不行,我相信在中国也是这样的,你不但要把自己的工作,技术活要做得特别好,而且要擅长表达自己的想法,擅长在工作当中讲述做的是什么,怎么样能够说服别人,怎么样能够跟别人在不伤和气的情况下,把问题解决好,这是很强的一个能力,而这个能力不是在学校里能学会的,是我们走向社会之后慢慢学到的东西,这个我恰恰认为中国的员工,尤其是在美国那样的环境,因为不是母语,可能处理得就不是特别好,有时说出来的话比较生硬,给对方的感觉不是特别好。

  第二,中国人比较谦虚、内敛,讲究内涵,自己心里有的东西不表达出来。但是在工作中,可以适度强势一点,勇敢表达自己的想法。当然这个建议是基于美国多元文化的背景,在国内大家的文化背景一致,也许可以探讨最合适的沟通方式。

  第三,掌握好英语,开拓眼界。我觉得在计算机这个技术里边能够非常了解英语,把英语的这个隔阂给去掉还是非常重要的。

  我回来的时间还不长,等和大家接触多了,可能会有新的想法,目前就这几点吧。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注