在Facebook的规模下,PHP的局限性非常明显:数千名工程师每天发布两次新代码,但对null对象调用方法或猜测复杂API的方法名等问题,只有到运行时才会报错,而语言本身也缺乏结构化工具来帮助代码检查。动态语言保持了快速编辑-刷新的循环,但没有早期安全网;像Java或C++这样的传统静态类型语言虽然能提供检查,却会牺牲迭代速度——而重写会浪费Facebook在PHP及其库上的投入。

Hack于2014年3月20日作为HHVM运行时的一部分发布,它通过保持PHP的超级集解决了这个难题。大多数PHP文件本身就可以作为有效的Hack代码,工程师可以为一个函数添加类型注解,而让下一个函数保持动态,静态类型代码和动态类型代码甚至可以在单个文件中无缝互操作。Hack增加了泛型、可空类型、类型别名、集合和lambda表达式,HHVM会在运行时强制执行带注解的返回类型和参数类型,这也让JIT编译器能安全地利用这些注解进行优化。

为了保持快速的PHP工作流程,团队将类型检查器设计为本地服务器,它监听文件系统变化并将整个代码图保存在内存中;典型的检查在200毫秒内完成,很少超过1秒。由于转换是细粒度的且可选,工程师们自愿转换了自己大部分代码,内部的代码修改工具自动处理了剩余部分,在过去一年中,几乎整个Facebook PHP代码库都迁移到了Hack。

同一公告还以HHVM项目的一部分开源了Hack和转换工具,HHVM将同时运行未修改的PHP和Hack,并邀请开发者参加次月在门洛帕克园区举行的Hack开发者日。该版本发布当天在Hacker News上获得了576分和415条评论。

将渐进式静态类型直接嵌入PHP,使安全性按函数逐步扩展,而非一次性全面推行

超级集兼容意味着无需重写,也无需一次性大规模迁移:现有PHP文件可以继续运行,HHVM仍然是PHP运行时,第三方PHP库在整个过程中一直可用。

每函数细粒度让安全性的扩展按团队自身的节奏进行,因为未注解的代码保持动态,不会阻塞整个文件或模块的转换。

文件系统监听的检查器服务器将反馈时间控制在200毫秒以内,因此静态类型不会影响PHP快速迭代的编辑-刷新循环。

工程师选择为自己的代码添加注解,而codemods处理重复的其余部分,因此数百万行代码在一年内完成转换,无需专门的迁移团队。

不要通过重写来获得安全性:让语言接受旧代码,让新规范逐个函数地传播,并保持检查足够快速,以免打断工作流程。

Hack及其代码修改工具在hacklang.org上以HHVM项目的一部分开源,Facebook表示HHVM将继续作为PHP运行时,努力达到PHP 5的兼容性,以便第三方PHP代码能与Hack共存。2014年3月20日,该公告在Hacker News上获得了576分和415条评论,Facebook计划次月在门洛帕克园区举办Hack开发者日。在Facebook内部,迁移实际上已经完成:经过大约一年的有机采用加上自动化重构工具,几乎整个PHP代码库都在运行Hack。

从这里,追溯依据

参考来源

  1. Hack: a new programming language for HHVM engineering.fb.com
  2. Hacker News discussion: Hack: a new programming language for HHVM news.ycombinator.com