Facebook 新發布的 Hack 語言怎麼樣?

來源:互聯網
上載者:User
關鍵字 Hack Facebook PHP Sullivan Bryan
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,我就貼個連結 http://spyder.wordpress.com/2014/03/16/why-ocaml-why-now/ 關鍵詞『web IDE 』。這個東西好像暫時沒開源但是應該快了。
對於php是件福音,雖然現在有ruby/py等等,但php在網站開發上悠久的曆史、眾多的項目依然佔據主流。scala是對java的升級,java自己也在升級,hack也是php的升級吧。
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.