Hack
静态类型,有一些先进的特性(比较而言)比如匿名函数。还有异步之类的,不能忍的是变量名还是要加 $ 。
> Facebook 是一个热衷使用 PHP 的大家庭,但 Hack 团队负责人布莱恩·奥沙利文(Bryan O’Sullivan)却也指出,鉴于许多开发者在开发着很多不同的项目,能够程序运行前捕获到其中的错误也将会是很有意义的。这可以让开发者的编程过程更加高效,这与让程序运行得更加高效是具有同样意义的。因此,一些个 Facebook 的高级工程师聚集到了一起,开发出了 Hack 语言。Facebook 在内部同时使用 PHP 和 Hack 已有一年时间,而现在已着手计划尽可能将代码移植到 Hack 上。奥沙利文表示,Hack 对代码本身的运行速度并没有实质影响...
Via Hack:Facebook推出的新编程语言
回复内容:
另一只FB前实习生跳出来说句话。以下均属个人观点。
个人不认为 Hack 算是一门独立的语言。Hack 和 PHP 的关系,个人认为十分像 ActionScript 和 ECMAScript (JavaScript) 的关系。尽管引入了大量的新元素(类型检查等),仍改变不了其保留了 PHP 的语法、习惯和标准库的事实。Hack 更像是一个方言(dialect)
至于为什么 Facebook 在宣传上显得它是一个独立语言呢?这里我认为主要的考量是对 PHP 社区的尊重,也是避免很多 PR 问题。第一次浏览器战争留下的兼容性问题让互联网世界伤痕累累,留下一个教训:决不能让任何商业公司把持一个标准。所以,如果 Facebook 把 Hack 作为改良版的 PHP 发布,多少给人一种隐忧,担心从此 PHP 成了 Facebook 的天下。
PHP 社区自身应当说很难满足 Facebook 的需要了。Type Safety 的重要性我就不说了。一个非常非常重要的需求是 coroutine。Facebook 是一个极为 IO heavy 的应用(想象一下,每次你打开首页,需要排列出一个 feed,拿到每个 story 的内容、谁点了赞、最新评论...),因此十分需要异步。此前 Facebook 的解决方案是这个:Justin Mitchell's answer to Facebook Infrastructure: What are preparables and how are they implemented?
,代码相当丑陋。而解决异步代码结构的最佳方式是什么呢?Coroutine!参考 A Study on Solving Callbacks with JavaScript Generators
。PHP 5.5 终于引入了 generators,但 Facebook 等不了那么久。
但很显然 Facebook 不能迁移到另外一种语言。因为现在的代码“太古老”“太丑陋”而放弃已有代码而另起炉灶的行为是很幼稚的。参考这篇文章 Things You Should Never Do, Part I
。其中心思想很简单:写出现在代码的程序员都不傻。而且加一块很有可能比你聪明。
我倒认为扎克伯格当年使用 PHP+MySQL 是很明智的。Facebook 已经有十年的历史了。回忆一下 2004 年是一个什么状态?Django 刚刚问世,Ruby on Rails 还要等将近两年。Perl 自始至终就没火起来。ASP 已死,虽然还很流行(至少在国内)。再说,PHP 虽然不算什么好语言,但在做网站上很好用呀。
所以说,Hack 存在的目的不是成为一个通用的语言。如果你要做一个新 project,请考虑 Python、RoR、甚至 NodeJS 一类。它的存在是为了解决一类极其特殊的情形:你不喜欢 PHP 但还得用它。我能想到的情形也只有维护一个已有的大型网站了。不知道 Wikipedia 感兴趣不。
最后说一句,我不认为有任何语言本质是差的。太多人骂语言的时候忘了代码是人写的。再好的语言在三流工程师手里也写不出高效、易读、易维护的代码。只是,有的语言给三流工程师一种自己是大牛的幻觉(妈妈我能写动态网页啦!),这也是 PHP 恶名的一大来源。为什么 Haskell 听上去高大上?因为三流工程师没听说过。
不能说是好是坏,前途如何?最起码对 PHP 是一种优化和体验。但目前 HHVM 要推广起来确实有点难,安装起来不是一般的复杂。再加上如果 PHP 转换到 HH 还有不少成本。只能说目前自己用用还行,别指望很快会有一大波僵尸来袭。
翻出来看 hacklang 文档后写的笔记,给各位看官,仅供参考:
- 帮PHP增强了输入和输出类型
- 写法上更严谨、安全
- 也支持nullable类型(? 代表可为空值)
- 非透明类型 alias (可以将类型赋值方式给一个新名字)
- 类 this 指针类型 (继承时可以指向子类)
- 数组类型枚举 (指定数组中类型次序)
- 匿名函数类型 (这对匿名函数参数约定非常有用)
- 增加了类型 (不解释了,都是字面意思)
- Vector
- Map
- Set
- Pair
- Shape
- Tuple
- 类
- 输入参数提升为内部变量
- 方法分发:静态动态分离 (这个太爽了,原生 PHP,你只能写一些奇怪的名字,用 Magic 方式来实现分发)
- 严格的类继承方法覆盖 (要覆盖父类方法,必须加上声明)
- 类的 Alias
- 外部引申 ( = )
- as 语法 (传入指定 x as XXXXXXX)
- <> 语法
- 简化了 Lambda (比如:$x ==> $x * 2)
- XHP 语法,用来输出 HTML 和 XML,自动过滤 XSS (安全是 hacklang 很重要的事情)
- trait (加强了 trait)
- 优化的生成器和 Async (总算有点盼头,我其实更想要 Go 那种协程和 Channel)
- Continuas (对迭代器做了封装,可以指定迭代类型)
- Async (声明异步类型函数可以异步执行)
- Awitable (返回该声明的函数代表可以用 awit 去执行)
- 放弃 PHP 的特性
- 全局代码 (不允许把代码写到函数或类外)
- 类同名函数构建方法 (类函数名不能和类名一样,不然会抛错)
- 不允许调用父级静态方法 (parent::xxxx ,你完了)
- 对象级别的静态调用 (对象只能做对象调用 ->)
## 总结
为 PHP 做了严格的输入输出类型定义,增加了几种类型和更安全的 HTML 语法。总之大多补足 PHP 的不严谨,也有异步语法 Async,但只捉襟见肘。
纠正一下,匿名函数是PHP 5.4引入的(没记错的话)。
UPDATE: 查了下,是PHP5.3支持anonymous function然后在PHP5.4支持closure中使用$this关键字的,印象中一直以为是PHP5.4才支持。
Hack在FB内部推广的时候我刚好在那边实习。希望下面讲的东西没有影响到NDA
先看吐槽,顺便可以了解一下Facebook都在PHP上做了什么东西:
According to someone from HN, Facebook has written: a compiler from
PHP to C++; a compiler from PHP to VM byte code; a corresponding runtime
for each; extensions to PHP; a type checker, and an inference engine.
Now they have to created a new programming language, which is inspired
by PHP.
Lesson learned: start with a decent programming language.
为什么Facebook大费周章搞一个Hack?不就是因为历史代码库太大不得不继续在PHP本身基础上改良么?可笑的是很多人却把『Facebook在用PHP』作为PHP是一个好语言的论据…
回过头来说,Hack主要是想解决这几个问题:
- 效率
- 对大型项目提供编译时代码检查
- 面对巨大现有代码库,提供渐进过渡到新语言的方案
为了解决这几个问题,对应的策略是
- Hack是一门typed language,增加HHVM的JIT优化空间
- 同上,Hack是一门typed language,并自带type inference提供编译时代码检查
正因为需要将FB内部大量代码迁移到Hack上,很多基本的东西是不能变的。如果把变量名前加$给去掉…那还不如用其他语言重写代码,何必要继续用Hack呢?
HHVM才是PHP的未来…
来点八卦
- Hack这门语言在FB外讨论是在去年一个OCaml的一个con上(抱歉实在找不到原始链接了)。是的Hack是用OCaml写的
- 为了避免NDA violation,我就贴个链接 http://spyder.wordpress.com/2014/03/16/why-ocaml-why-now/ 关键词『web IDE 』。这个东西好像暂时没开源但是应该快了。
对于php是件福音,虽然现在有ruby/py等等,但php在网站开发上悠久的历史、众多的项目依然占据主流。scala是对java的升级,java自己也在升级,hack也是php的升级吧。