最後更新:2016-06-06
來源:互聯網
上載者: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)
最佳化的產生器和 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的升級吧。