週末看到一篇文章說 PHP 創始人提議將 PHP 拉出新分支,建立 P++ 語言。隨後閱讀了一下 Zeev Suraski 發起的這個郵件列表,大體瞭解了一下,這裏作個解讀。php
Zeev Suraski 就是幾周前爆出的 PHP 核心開發者從 Zend 公司離職消息裏面的主角。Zeev 是以色列的開發者。它也是 Zend 公司的聯合創始人。登錄它的 twitter 上看,它的 twitter 封面有個可愛的女兒,看來外國人也是很愛在社交帳號曬女兒的。html
其實 PHP 如今大都由社區進行維護了,Zeev 的離職並不必定會有多少影響。git
可是此次 Zeev Suraski 在社區中提的這個方案就引發了很多的反響。https://wiki.php.net/pplusplus/faq。 咱們能夠經過裏面的internal郵件 https://marc.info/?l=php-internals&m=156529545007909&w=2 查看整個郵件線。github
Zeev 的這封郵件的標題頗有意思: Bringing Peace to the Galaxy。它但願這個idea 能給社區的強弱類型的爭端帶來和平,但願能解決強弱類型問題的爭論。ide
基本上 Zeev 是從如何發展 PHP 的角度考慮。如今 PHP 最大的分歧就是是維護動態語言,仍是逐漸加入強類型的特性。基本上,若是要增長一些靜態語言的類型聲明和驗證,PHP 的向下兼容性是得不到保證的。可是隨着 Rust, Go 等語言的衝擊,有一部分開發者逐漸傾向於使用一些強類型的特性。ui
那麼 Zeev 就認爲,與其不斷在現有的 PHP 版本上對每一個特性討論強弱類型的兼容性,我不如讓 PHP 能夠支持另一種「新語法」 P++。固然這個 P++ 只是暫定的。在 Zeev 的思考中,它認爲 P++ 是一種加強型語言,可是和 PHP 是共存的。它們的調用關係就是 C 和 C++ 的關係,C++ 並不對 C 的全部語法兼容,而是C++ 中是能夠調用 C 代碼的。換句話說,它以爲咱們能夠在一個代碼文件中共存兩種語法的代碼段。可能示例以下:idea
<?php xxx ?> <?p++ ?>
這樣作的好處有幾個,首先 PHP 的適用人羣擴大了,它知足了不一樣開發者的不一樣口味。其次,一些新的特性不用再考慮向下兼容性了。在 P++ 中開發的特性等因而從頭開始開發,並不須要考慮 PHP 若干版本的歷史兼容問題。會解放新特性的開發進度。.net
因此說,Zeev 並非要開發一個新語言,也不是要從 PHP 分支 fork 出一個分支,更像是要建立一種新的語法分支,這個分支我理解主要是針對強類型限制的。而這個語法分支和原先的 PHP 是在同一份代碼內。而且隨着每次 PHP 的版本,原先弱類型的 PHP和 新類型的 P++ 都會進行修復和增長。code
可是緊跟着 Zeev 的這個郵件,Nikita Popov 回覆了這個郵件,它提出了反對的聲音,而且提出了本身的解決方法。htm
Nikita 的解決方法是參照 Rust 的版本管理,Rust 基本 2-3 年發佈一個大版本,可是 Rust 的編譯器能編譯全部版本的代碼,因此每次發佈新版本的時候,若是你的代碼是舊版本的,那麼還能夠繼續編譯,且不會和新特性有衝突。 https://doc.rust-lang.org/edition-guide/editions/index.html#what-are-editions。Rust 到現在有兩個大版本了,2015版本和2018版本。
能夠想象,若是引入 Nikita 的這種方式,須要在每一個代碼文件中(或者粒度更細,到代碼塊)中標記 PHP 的大版本版本號,好比用年號做爲大版本號,今年2019是初版本,也是默認版本,過兩年2021是第二版本。
Nikita 的這種方式目的是保持單一的 PHP 的語法分支,而且新特性也是不須要考慮向下兼容問題。好比假設有2019版本和2021兩個 PHP版本。2021版本中語言的新特性在2019版本中是沒法使用的。若是你想要使用這些新版本,開發者須要主動作升級修改。(能夠想象到時候會有一些自動升級的腳本)。可是若是你不想要修改,那麼就在你的全部文件(或者配置)中說明個人項目使用的是2019版本(即便你如今使用的是 PHP 程序的版本是2021)。
這封郵件後續的反饋基本都是針對這兩種方案展開的。Zeev 的方案基本的缺點就是須要維護兩個語言特性的分支,對於有限的語言開發者資源來講,是很吃力的。很多人會擔憂最後演變成爲 Python2 和 Python3 的現狀,長期沒法合併。並且須要開發者在是使用PHP 語法仍是P++ 語法作選擇。而 Nikita 的方案更有版本迭代的意味。
我我的更站邊 Nikita的這種升級,我以爲這種方案會有一種趨向性,最終你們會漸漸升級到新版本。且更容易落地,開發者只須要維護一套語言特性(相比於 Zeev 的方案更容易落地)。而 Zeev 的這種方案老是會給人一種老版本的 PHP 不想再去增長新特性,全部新特性都加在 P++ 這邊更好的感受。漸行漸遠,我感受最終還真會演變成你們都在開發新語言的態勢。
https://marc.info/?l=php-internals&m=156535343921170&w=2
https://doc.rust-lang.org/edition-guide/editions/index.html#what-are-editions
https://nikic.github.io/
https://www.oschina.net/news/108717/zeev-leave-zend