想急切尝试Hack?传送门:http://hacklang.org/

今天我们发行了Hack,一门能够在HHVM上与PHP无缝交互的编程语言。Hack的静态类型兼顾及协调了PHP的快速开发周期。同时增加了在其他现代编程语言中常见的许多功能。

我们已经在Facebook上部署了Hack,并且取得了巨大的成功。在过去的几年里,借助自家开发的一些重构工具,我们几乎将有的PHP代码迁移到了Hack上。

我们也很自豪地向外发布一个开源版本的Hack,作为我们的 HHVM runtime 平台的一部分,它现在同时支持Hack和PHP。

【补充信息】:HipHop for PHP是一系列PHP脚本语言的程式码转换器的集合,它包含HPHPc、HPHPi、HPHPd以及HHVM,这四个脚本引擎各有所不同,但是他们共用相同的执行时期(Runtime)及工具集(Toolset)。HipHop是由Facebook所建立,他们用它来节省服务器的资源。HipHop 由 C++ 和 C 语言所编写,发布时代码量已高达60万行,它以自由软件发布,采用PHP许可证3.01版。(摘自维基百科

动机

每一个PHP程序员对于每天棘手又笨重的任务都很熟悉。上面的代码是一个常见​​错误,其中一个方法可能意外地被一个空的对象所调用,从而导致难以发现的错误,直到运行时报错。另一个例子是一个复杂的API,虽然开发者对于它的语义有直观的理解,但仍需花时间在文档中查找方法名。

在Facebook这样的规模——成千上万的工程师每天要发布两次新代码——这样的开发速度变慢将更成问题。在没有Hack之前,我们有一个能够快速反馈回溯的简单语言——但我们如何能减轻各种各样的上述问题?早期的错误检测和快速迭代是否能共存,同时还能保证在PHP上投入的精力有所回报?是否能够改善代码分析和帮助审查使开发者更具生产力,就像有了一个自动化完成工具?

传统上,动态类型语言允许快速开发,但会牺牲及早发现错误并迅速审查代码的能力,特别是在大的代码库。相反,静态类型语言提供更多的安全网,但往往增加快速迭代的成本。我们相信必须有一个平衡点。

因此,Hack就诞生了。我们相信,它提供了最好的动态类型和静态类型语言各有的特性,而且,它也适合各种规模的项目。

Hack语言

Hack和PHP有着很深的根源。实际上,许多PHP文件已经是合法的Hack文件。我们有意识地选择放弃那些与静态语言不兼容的少数便捷但将被被弃用的功能和特性。(例如:可变变量和extract()函数)。我们已经增加了许多新的特性,且这些特性能够使开发者们更具生产力。

我们新增的最主要的特性是支持静态类型。我们已经开发了一个系统来标注函数签名和类成员的类型信息,我们的类型检查算法(“类型检查器”)能够推断出来。类型检查是增量的,这样,即使在同一个文件中的一些代码可以转换为Hack,而其他部分保持动态类型。从技术上讲,Hack是一个“渐增类型”语言:动态类型代码和静态类型代码无缝地交互。

在Hack的类型系统中,我们引入了几个特性,例如泛型、可空类型、类型别名,和类型参数约束。这些新的语言特性是不显眼的,所以你写的Hack代码将仍然看起来像是使用动态语言的PHP程序员所编写的。

然而,Hack增加了额外的特性,超越静态类型检查,包括集合,lambda表达式和运行时强制约束返回类型和参数类型。
集合提供了一个替代PHP数组的简洁的,类型安全的数据结构。我们设计它专门与静态类型和泛型一起工作。集合API提供了许多经典的高阶功能,如map()和filter()用于适应函数式编程风格。

Lambda表达式给出一个简洁的语法来创建闭包。虽然PHP也有闭包,但它要求程序员显示地声明它们所要使用到的外部变量。使用Hack的lambda表达式,它会自动推断出这些用途,节省您不必要的工作。Lambda表达式使你能够更方便地充分利用集合的API。

运行时强制约束返回类型和参数类型(包括标量类型,如int和string)提供更高的安全性,胜过静态的代码审查,同时类型标注也会逐渐加入到代码库中。运行时强制约束帮助程序员发现和诊断某些类型的问题更加容易,并且为了优化,它可以帮助HHVM的JIT生产更高效的代码更加安全,通过对类型标注的信任。

即时类型检查

在开发过程中,一个PHP程序员通常会来来回回快速地在源代码和浏览器之间切换。工程师们可以进行尽可能地快速迭代,测试和调优实验,直到代码运行完美。

传统上,一种类型的检测器会破坏这种反馈环,因为它需要时间去分析源代码。我们不想减缓PHP的工作流程,所以我们想出了一个新的方法来协调类型安全的即时反馈。

我们的解决方案是将类型检查器构建为监视文件系统的本地服务器。服务器在内存中保存有关源代码的所有信息,并且当磁盘上的文件改变时会进行自动更新。这种做法已见成效:类型检查器通常运行在不到200毫秒,很少需要超过一秒钟,因此很容易集成到开发流程,而不会引入明显的延迟。

代码迁移

Hack的类型安全和重构随着在代码库的增加会带来更多的好处。需要明确可能对于一些代码很难完整地迁移到Hack上,对于我们更重要的是在增量引入Hack代码时,能够直接与现有的PHP代码共存。

迁移过程的其余事项,如添加类型注释,并使用新的语言特性,可以在代码库中适当的修改。例如一个类型标注能够在一个函数上添加,而另一个函数没有,即使在同一个文件中。如果一个函数的参数或者类的成员属性没有明确的类型标注,类型检查器会认为它的类型是动态的,并且它不检查该值的类型。

在Facebook,我们发现,我们的工程师们赞赏Hack,以至于他们开始自愿迁移大部分自己的代码。在我们的代码库有着数百万行的代码,我们也希望能够将一些工作自动化地执行,所以我们开发和使用了几个代码修改工具来帮助迁移过程(这些工具已经作为Hack的一部分发布)。

别担心,你的PHP是安全的!

HHVM仍然是一个PHP运行平台,我们打算继续保持这种方式。事实上,我们正努力达到PHP-5的标准。其中HHVM的首要任务是能够运行未经修改的PHP 5的源代码,不仅是为了社区,也因为我们依赖许多第三方PHP底层库。
HHVM现在是一个能同时运行PHP和Hack的平台,所以你可以逐渐体验Hack所带来的新特性。

感受Hack的趣味!

我们很高兴能够开源Hack,和自动转换代码库的工具。这仅仅是第一步,我们致力于继续发展此软件,使我们自己的工程师和更广泛的社区能够更加容易地进行开发。Hack的价值不局限于大项目:拥有类型信息,非常棒的错误提示,以及快速地反馈等特性,小的代码库也能享受到Hack的好处。

下个月,我们将在Menlo Park的Facebook校园举办Hack Developer Day来介绍Hack,我们希望在那里能看到你或者在线上。

我们很想听听您对我们工作的反馈,并欢迎大家加入HHVM和Hack社区。

致谢

在这里有许多人对Hack的开发贡献了一份力量。

核心的Hack团队由 Joel Beales, Eugene Letuchy, Gabriel Levi, Joel Marcey, Erik Meijer, Alok Menghrajani, Bryan O’Sullivan, Drew Paroski, James Pearce, Joel Pobar, 和 Joshua Van Dyke Watzman组成。

特别感谢我们的社区早期采用者提供宝贵的反馈意见,以使Hack更好:James Miller, Simon Welsh, Nils Adermann, Fabien Potencier, 和 Alexander Mols。

Hack主要是在OCaml开发的。我们也同样感谢Gallium团队发展了OCaml语言,和Ocsigen团队(CNRS – University of Paris Diderot – INRIA)开发的js_of_ocaml。

当然,感谢每一位帮助过Hack发展的人。这份名单无法在博客文章中详细列出,但是你知道你所贡献的一切。