天天看點

《Hack與HHVM權威指南》——導讀

《Hack與HHVM權威指南》——導讀

在facebook公司的大部分發展曆程中,每隔幾個月就會舉辦“黑客馬拉松(hackathons)”活動,活動的目的在于鼓勵工程師們碰撞出好的想法,而這些好的想法并不是和他們的日常工作相關的,他們自由組隊,然後在一兩天的時間内做出一些非常有意思的事情。

在2007年11月的一次“黑客馬拉松”活動上,誕生了一個非常有意思的實驗:一個工具能夠将php程式轉化為c++程式,然後還能夠用c++編譯器進行編譯。想法是c++程式将會比php原生的程式運作起來快很多,因為它可以得益于多年以來對c++編譯器的大量優化工作。

對于facebook來說,這種可能性是非常有趣的,因為公司增加了大量新的使用者,而支援更多新的使用者需要耗費大量的cpu運算周期。是以當你耗盡所有可用的cpu運算周期後,除非你耗費大量财力購買更多的cpu,用來支援日益增多的使用者所帶來的cpu運算能力的需求,否則你必須尋找一個方法來降低每個使用者的cpu消耗。由于facebook整個網站的前端都是用php語言編寫的,是以任何使php代碼耗費更少cpu運算周期的新技術都受到歡迎。

在接下來的7年時間裡,這個項目的發展遠遠超出了最開始在“黑客馬拉松”中的起點。php到c++的轉換器稱為hphpc, 在2009年的時候它成為支撐fackbook網頁業務唯一的伺服器端引擎。在2010年年初,它以“hiphop for php”的名字開源了。然後從2010年起,一個全新的方法用來執行——即時編譯為機器代碼,并沒有c++牽扯其中——脫胎換骨于hphpc的代碼庫,并最終取代它。這個即時的編輯器稱為“hiphop虛拟機”,簡稱為 hhvm,并且在2013年的早期徹底取代了facebook的網站伺服器叢集。早期的php到c++的轉換器消失了,它沒有在任何地方進行部署,同時它的代碼都被删除了。

而hack的起源是完全分開的,其根源在于試圖在php中使用靜态分析以自動探測潛在的安全漏洞的一個項目。很快,事實證明,php的本質使得它在非常有用的靜态分析方面很難有所進展。于是“嚴格模式(strictmode)”的想法就誕生了。對php進行修改,增加一些新的特性,比如引用、删除和添加一個補充的複雜類型系統。php代碼的作者可以自由選擇是否使用嚴格模式,在保持完整的互操作性同時,獲得更加強大的代碼檢查能力。

hack的方向從那時開始就作為基于php的類型系統掩蓋了其本質。它在建構hack編碼的道路上獲得了很多有重大影響的新特性,比如異步函數。它添加了很多包括集合在内的新特性,使得類型系統更加強大。本質上來說,它是一門和php不同的新語言,它已經在程式設計語言方面取得了自己的新位置。

以上就是hack的發展曆程,目前hack是一門現代化的動态程式設計語言,它擁有魯棒的靜态類型檢查能力,在hhvm上執行。hhvm是一個和php無縫相容且具有互操作性的實時編譯運作時引擎。

什麼是hack和hhvm

hack和hhvm是緊密聯系在一起的,是以對于這些術語到底指代的是什麼會有一些混亂。

hack是一門程式設計語言。它基于php,繼承了php中的很多文法,并且完全可以和php進行互操作。然而,很可能有人會認為hack隻是在php的基礎上略加了裝飾修改。hack最核心的特色是魯棒的靜态類型檢查,這已經足夠把hack作為一門程式設計語言和php區分開了。對于現在已經從事已有php代碼庫開發方面工作的開發者來說,這是非常有益的。在這種情形下,将會給這些開發者很多的啟迪,當然,對于新項目的底層開發也是一個非常不錯的選擇。

除了靜态類型檢查外,hack還擁有php沒有的很多項新特性,本書将對這些新特性進行闡述:異步函數、xhp等。出于解決一些粗糙邊界問題的目的,hack也故意缺失了對一些php特性的支援。

hhvm是一個執行引擎,它同時支援php和hack。它讓兩種語言可以互操作:php書寫的代碼能夠調用hack代碼,反之亦然。當執行php的時候,它的目标在于對php.net提供的php标準解釋器進行替換。本書中有些章節的内容是關于hhvm的:如何配置并部署它,如何使用它調試和配置代碼。

最後,我們要介紹的就是從hhvm中分離出來的hack類型檢查器:這是一個能夠分析hack代碼(而不是php代碼)然後報告類型錯誤的程式。在它能夠接受的代碼方面,類型檢查器目前要比hhvm嚴格一些。當然,在未來的發行版本中,hhvm應該比類型檢查器更加嚴格。目前,除了你在指令行裡面啟動它的指令“hh_client”外,類型檢查器還沒有個定型的名字,我更傾向于叫它“hack類型檢查器”(hack typechecker)或者就叫做“類型檢查器”(typechecker)。

到目前為止,hhvm是運作hack的唯一執行引擎,這也是有時它們會混為一談的原因。

前言

<a href="https://yq.aliyun.com/articles/89623">第1章 類型檢查</a>

<a href="https://yq.aliyun.com/articles/89627">1.1 為什麼使用類型檢查器</a>

<a href="https://yq.aliyun.com/articles/89630">1.2 設定類型檢查器</a>

<a href="https://yq.aliyun.com/articles/89636">1.3 類型标注文法</a>

<a href="https://yq.aliyun.com/articles/89660">1.4 hack的類型系統</a>

<a href="https://yq.aliyun.com/articles/89675/">1.5 規則</a>

<a href="https://yq.aliyun.com/articles/89715">1.6 類型推理</a>

<a href="https://yq.aliyun.com/articles/89725">1.7 類型提煉</a>

<a href="https://yq.aliyun.com/articles/90161">1.8 運作環境中的類型标注的執行</a>

第2章 泛型

<a href="https://yq.aliyun.com/articles/90163">2.1 入門執行個體</a>

<a href="https://yq.aliyun.com/articles/90170">2.2 其他泛型實體</a>

<a href="https://yq.aliyun.com/articles/90171">2.3 類型消除</a>

<a href="https://yq.aliyun.com/articles/90175">2.4 限制</a>

<a href="https://yq.aliyun.com/articles/90177">2.5 重溫未決的類型</a>

<a href="https://yq.aliyun.com/articles/90182">2.6 泛型和亞型</a>

<a href="https://yq.aliyun.com/articles/90185">2.7 進階:協變和逆變</a>

第3章 hack的其他特性

3.1 枚舉

3.2 類型别名

3.3 數組形狀

3.4 拉姆達表達式

3.5 構造函數參數更新

3.6 屬性

3.7 加強的自動加載

3.8 整數算術溢出

3.9 nullsafe方法調用操作

3.10 trait和接口的必要條件

3.11 隐藏類型檢查器錯誤

第4章 在hack中不支援的php特性

4.1 引用

4.2 舊式風格構造器

4.3 不區分大小寫的名稱查找

4.4 可變變量

4.5 動态屬性

4.6 混合方法調用文法

4.7 isset、empty和unset

4.8 其他

第5章 集合

5.1 為什麼使用集合

5.2 集合擁有引用語義

5.3 使用集合

5.4 集合類型标注

5.5 與數組互操作

第6章 異步

6.1 入門執行個體

6.2 異步細節

6.3 建構異步代碼

6.4 其他類型的等待

6.5 常見錯誤

6.6 異步擴充

第7章 xhp

7.1 為什麼使用xhp

7.2 如何使用xhp

7.3 建立你自己的xhp類

7.4 xhp最佳實踐

7.5 遷移到xhp

7.6 xhp内部原理

第8章 配置和部署hhvm

8.1 指定配置選項

8.2 伺服器模式

8.3 jit熱身

8.4 repo-authoritative模式

8.5 管理伺服器

第9章 hphpd:互動式調試器

9.1 開始入門

9.2 代碼執行

9.3 執行環境

9.4 使用斷點

9.5 檢視代碼和文檔

9.6 宏

9.7 配置hphpd

第10章 hack工具

10.1 檢查代碼庫

10.2 遷移php代碼到hack

10.3 編譯hack代碼到php代碼