欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-06-17 15:02:10
...
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的升级吧。