当前位置:Gxlcms > PHP教程 > Facebook新发布的Hack语言怎么样?

Facebook新发布的Hack语言怎么样?

时间:2021-07-01 10:21:17 帮助过:9人阅读

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)
    • require 继承
    • require 实现
  • 优化的生成器和 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主要是想解决这几个问题:
  1. 效率
  2. 对大型项目提供编译时代码检查
  3. 面对巨大现有代码库,提供渐进过渡到新语言的方案

为了解决这几个问题,对应的策略是

  1. Hack是一门typed language,增加HHVM的JIT优化空间
  2. 同上,Hack是一门typed language,并自带type inference提供编译时代码检查

正因为需要将FB内部大量代码迁移到Hack上,很多基本的东西是不能变的。如果把变量名前加$给去掉…那还不如用其他语言重写代码,何必要继续用Hack呢?

HHVM才是PHP的未来…


来点八卦


  1. Hack这门语言在FB外讨论是在去年一个OCaml的一个con上(抱歉实在找不到原始链接了)。是的Hack是用OCaml写的
  2. 为了避免NDA violation,我就贴个链接 spyder.wordpress.com/20 关键词『web IDE 』。这个东西好像暂时没开源但是应该快了。
对于php是件福音,虽然现在有ruby/py等等,但php在网站开发上悠久的历史、众多的项目依然占据主流。scala是对java的升级,java自己也在升级,hack也是php的升级吧。

人气教程排行