Facebook 新發布的 Hack 語言怎麼樣?
Hack
靜態類型,有一些先進的特性(比較而言)比如匿名函數。還有非同步之類的,不能忍的是變數名還是要加 $ 。
&> Facebook 是一個熱衷使用 PHP 的大家庭,但 Hack 團隊負責人布萊恩·奧沙利文(Bryan O』Sullivan)卻也指出,鑒於許多開發者在開發著很多不同的項目,能夠程序運行前捕獲到其中的錯誤也將會是很有意義的。這可以讓開發者的編程過程更加高效,這與讓程序運行得更加高效是具有同樣意義的。因此,一些個 Facebook 的高級工程師聚集到了一起,開發出了 Hack 語言。Facebook 在內部同時使用 PHP 和 Hack 已有一年時間,而現在已著手計劃儘可能將代碼移植到 Hack 上。奧沙利文表示,Hack 對代碼本身的運行速度並沒有實質影響...
Via Hack:Facebook推出的新編程語言
糾正一下,匿名函數是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 』。這個東西好像暫時沒開源但是應該快了。
- &
另一隻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是件福音,雖然現在有ruby/py等等,但php在網站開發上悠久的歷史、眾多的項目依然佔據主流。scala是對java的升級,java自己也在升級,hack也是php的升級吧。
推薦閱讀:
※「C++」讀作「C 加加」,為什麼「C?」不能讀作「C 井」呢?
※MFC 還在更新嗎?
※Swift 集成了哪些語言的特性?
※你在初學編程的時候遇到過哪些有趣的事情?
※Visual Basic 作為初學者的編程語言 究竟有多少常見程序是用它編寫的?