為什么選擇Zephir給PHP編寫動態擴展庫?
介紹
歡迎使用Zephir,這是一種開源的、高級的/特定于域的語言,旨在促進PHP擴展的創建和可維護性,重點關注類型和內存安全。
Zephir是一種語言,它滿足了PHP開發人員試圖編寫和編譯可由PHP執行的代碼的主要需求。它支持動態和靜態類型,并且它的一些特性對于PHP開發人員來說是熟悉的。
Zephir這個名字是Z(end)E(ngine)/PH(P)/I(nte)r(mediate)的縮寫。雖然這表明發音應該是zephyr
,但Zephir的創造者實際上將其發音為zaefire。
為什么是Zephir?
今天的PHP應用程序必須平衡許多關注點,包括穩定性、性能和功能。每個PHP應用程序都基于一組通用組件,這些組件也是許多其他應用程序的基礎。
這些通用組件是庫、框架或兩者的組合。一旦安裝,框架很少改變,作為應用程序的基礎,它們必須功能強大,而且速度非常快。
得快速和健壯的庫可能很復雜,因為它們通常實現了高級別的抽象。在基本庫或框架很少更改的情況下,有機會構建提供此功能的擴展,利用編譯提高性能和資源消耗。
使用Zephir,您可以實現可從PHP使用的面向對象的庫/框架/應用程序,從而獲得重要的時間,使您的應用程序更快,同時改善用戶體驗。
如果您是一名PHP程序員
PHP是用于開發Web應用程序的最流行的語言之一。像PHP這樣的動態類型和解釋語言由于其靈活性而提供了非常高的生產力。
從版本4開始,PHP基于Zend Engine實現。這是一個虛擬機,它從字節碼表示中執行PHP代碼。Zend Engine幾乎存在于世界上所有的PHP安裝中。使用Zephir,您可以為在Zend Engine下運行的PHP創建擴展。
PHP是Zephir的宿主,所以它們顯然有很多相似之處;然而,它們也有重要的差異,這些差異賦予了Zephir自己的個性。例如,Zephir更嚴格,由于編譯步驟,與PHP相比,它可能會使您的生產力降低。
如果你是C程序員
C是有史以來最強大和最流行的語言之一。事實上,PHP是用C編寫的,這也是PHP擴展可用于它的原因之一。C為您提供了管理內存、使用低級類型甚至內聯匯編例程的自由。
然而,與PHP或Zephir相比,用C開發大型應用程序可能需要比預期更長的時間,如果您不是經驗豐富的開發人員,則可能很難找到一些錯誤。
Zephir的設計是安全的,所以它不實現指針或手動內存管理,所以如果你是一個C程序員,你會覺得Zephir不如C強大,但更友好。
編譯VS解釋
編譯通常會減慢開發速度,在運行代碼之前,您需要更多的耐心來編譯代碼。另一方面,解釋往往會降低代碼性能,從而有利于開發人員的生產力。也就是說,在某些情況下,解釋和編譯代碼的速度之間沒有任何明顯的差異。
Zephir需要編譯你的代碼,但功能是從PHP中使用的,它是解釋的。
一旦代碼被編譯,就沒有必要再這樣做了。解釋的代碼在每次運行時都被解釋。開發人員可以決定他們的應用程序的哪些部分應該在Zephir中,哪些不應該。
靜態類型語言與動態類型語言
一般來說,在靜態類型語言中,變量在其生存期內綁定到特定類型。它的類型不能更改,只能引用類型兼容的實例和操作。像C/C++這樣的語言是用這個方案實現的:
int a = 0;
a = "hello"; // not allowed
在動態類型中,類型綁定到值,而不是變量。因此,一個變量可能引用一個類型的值,然后稍后被重新分配給一個不相關類型的值。JavaScript/PHP是動態類型語言的例子:
var a = 0;
a = "hello"; // allowed
盡管動態語言具有生產力優勢,但它可能不是所有應用程序的最佳選擇,特別是對于非常大的代碼庫和高性能應用程序。
優化PHP等動態語言的性能比C等靜態語言更具挑戰性。在靜態語言中,優化器可以利用附加到變量本身的類型信息來做出決策。在動態語言中,可供優化器使用的此類線索較少,這使得優化選擇更加困難。
雖然動態語言優化的最新進展很有希望(如JIT編譯),但它們落后于靜態語言的最新技術水平。因此,如果你需要非常高的性能,靜態語言可能是一個更安全的選擇。
靜態語言的另一個小好處是編譯器執行的額外檢查。編譯器不能發現邏輯錯誤,這是更重要的,但編譯器可以提前發現錯誤,在動態語言中只能在運行時發現。
Zephir同時具有靜態和動態類型,允許您盡可能地利用這兩種方法。
編譯方案
Zephir提供原生代碼生成(目前通過編譯成C)。像gcc/clang/vc++
這樣的編譯器會優化代碼并將其編譯成機器碼。下圖顯示了該過程的工作原理:
圖片
除了Zephir提供的那些,隨著時間的推移,編譯器已經實現并成熟了許多優化,這些優化可以提高編譯應用程序的性能:
- GCC優化:https://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Optimize-Options.html
- LLVM通過:https://llvm.org/docs/Passes.html
- Visual C/C++優化:https://msdn.microsoft.com/en-us/library/k1ack8f1.aspx
代碼保護
在某些情況下,編譯不會顯著提高性能。這可能是因為瓶頸位于應用程序的I/O綁定部分(很可能),而不是計算/內存綁定。但是,編譯代碼也可以為您的應用程序帶來某種程度的知識保護。使用Zephir,生成本地二進制文件,您還可以向用戶或客戶“隱藏”原始代碼。
結論
Zephir不是用來取代PHP或C的。相反,我們認為它是對它們的補充,允許PHP開發人員冒險進行代碼編譯和靜態類型。Zephir試圖將C和PHP世界的好東西結合起來,尋找機會使應用程序更快。