Perl 繼續前行,Perl 7 將是下一代(硬核老王點評版)
近日召開的 Perl 大會是在雲端舉辦的,在會上 Sawyer X 宣布 Perl 有了新的前進計劃。Perl 7 的開發工作已經在進行中,但不會有代碼或語法上的巨大變化。它是默認帶有現代行為的 Perl 5,將為以後更大的變化奠定基礎。
硬核老王:在經歷了 Perl 6 失敗的巨大痛苦之後,Perl 社區終於從陰霾的心情中走出了。但是失去的黃金 20 年卻是挽回不了了,否則別說 PHP,都不會有 Python 什麼事。我認為,Perl 7 是一條自我救贖之路,應該,或許,會有新的 Perl 7、Perl 8 吧……
Perl 7 基本上是 Perl 5.32
Perl 7.0 將會是 Perl 5 系列的 5.32,但會有不同的、更合理的、更現代的默認行為。你不需要啟用大多數你已經設置過的默認行為,因為這些已經為你啟用了。這個大版本跳躍為我們一直以來的工作方式和未來可以做的事情之間設定了一個界限。
硬核老王:可以理解為,Perl 是一個 Perl 5 兄弟們親手打下的家族企業,而 Perl 6 是外面請來的職業經理人,結果經理人要對家族企業採用現代化管理,差點雞飛蛋打。現在好了,Perl 6 分家出去單過了,親兒子 Perl 7 準備重振家業。
請記住,Perl 是一門「按我的意思做」的語言,其默認行為可能就是你想要的。在 Perl 4 和 Perl 5 的早期,這很容易。但是,幾十年過去了,現在的世界更加複雜了。我們不斷地往其中添加編譯指令,但由於 Perl 對向後兼容的承諾,我們不能改變其默認行為。現在,我們又回到了 C 語言的舊時代,在開始做一些事情之前,我們必須包含大量的例行模板:
use utf8;
use strict;
use warnings;
use open qw(:std :utf8);
no feature qw(indirect);
use feature qw(signatures);
no warnings qw(experimental::signatures);
這一點在 v5.12 及以後的版本中稍有好轉,因為我們可以通過使用設置最低版本來免去設置 strict
指令:
use v5.32;
use utf8;
use warnings;
use open qw(:std :utf8);
no feature qw(indirect);
use feature qw(signatures);
no warnings qw(experimental::signatures);
硬核老王:不可否認,Perl 二十年前如日中天,那個時候,不說終端運行的腳本,就是互聯網上主要的互動程序(CGI),也幾乎全是用 Perl 寫的。但是在風口時代它的主要精力都在折騰 Perl 6,而 Perl 5 系列不但很多地方顯得老舊,歷史包袱也過重。向前不能保持原有的精巧習慣,向後不能跟上現代的軟工理念。
Perl 7 是一個新的機會,即使不指定版本,也可以把其中的一些行為變成默認行為。Perl 5 仍然有它的極度向後兼容的行為,但 Perl 7 將以最小的歷史包袱獲得現代實踐的新生。我個人希望 簽名 功能能夠入選到新的版本,但要讓 Unicode 成為默認行為還有很多工作要做,所以你可能需要保留其中的一些編譯指令:
use utf8;
use open qw(:std :utf8);
你可能會丟掉一些你肯定不應該使用的垃圾功能,比如間接對象表示方式。Larry Wall 說他必須為 C++ 程序員做點什麼。
my $cgi = new CGI; # 間接對象,但在 Perl 7 不這樣用了
my $cgi = CGI->new; # 直接對象
但是,這個功能在 Perl 7 中並沒有真正消失。它在 v5.32 中已經可以通過設置關閉了,但現在有了不同的默認行為。
Perl 5 怎麼了?
沒有人要把 Perl 5 從你身邊奪走,它將進入長期維護模式 —— 比最新用戶版本的兩年滾動支持時間的兩倍都要長得多。這可能要從現在支持到十年後了(或者說 Perl 5 已經人過中年了)。
硬核老王:這樣挺好,舊時代的繼續留在舊時代,新生代的輕裝前行。
什麼時候開始?
這項工作現在就在進行,但你不需要擔心,大約六個月後,才會出現第一個候選版本。我們的目標是在明年發布 Perl 7.0 的用戶版本,並在這期間發布一些候選版本。
這也是一個容易實現的承諾,因為 Perl 7 基本上就是 v5.32,默認行為不同而已。沒有大的重寫,也沒新的功能,儘管目前一些實驗性的功能可能會穩定下來(請把「簽名」功能選入!)。
CPAN 怎麼辦?
CPAN( 綜合 Perl 檔案網 )有近 20 萬個模塊。人們正在使用的處於維護狀態的模塊應該還能用,對於其它的模塊會有一個兼容模式。記住 Perl 7 主要是 v5.32,所以你應該不需要修改太多。
你可能不知道 Perl5 Porters 幾乎會針對所有的 CPAN 模塊測試其新版本。這個用於檢查更改可能對 Perl 社區產生影響的工具已有很長的歷史了。作為一個模塊的作者,我經常會收到來自不同人的消息,主要是 Andreas Koenig 或 Slaven Rezić,他們說我的模塊中的一些奇怪的東西可能會在新的 Perl 版本中出問題。通常,我總是需要更新一些東西來解決這些問題。追蹤現有代碼中的問題已經不是問題了。修復代碼應該不會那麼繁瑣,因為它仍然是 Perl 5,但有更好的實踐。
硬核老王:知道當年 Perl 為什麼強悍嗎?有一個主要的原因是,Perl 有個無所不包的 CPAN 倉庫。
會不會有一個單獨的 Perl 7 的 CPAN?沒有人說不能有,但是在跳轉到 Perl 7 的過程中,開發人員不希望重做已經可以工作的東西。這個變化應該是可以控制的,盡量減少副作用。
另外,PAUSE( Perl 作者上載伺服器 )在過去的幾年裡得到了不少人的喜愛。這使他們可以更容易適應未來的需要。從事這方面工作的人都是經驗豐富、才華橫溢的人,他們讓代碼庫變得更加容易管理。
為什麼要跳到大版本?
一個主要版本可以與用戶訂立不同的契約。跳轉到一個主要版本可以用新的默認行為來改變這個契約,即使這與過去有衝突。如果你願意的話,總會有辦法將所有這些設置都重置為舊的 Perl 5 默認行為。不過在語法和行為上,Perl 7 的代碼(大部分)仍然是 v5.32 的代碼。
Sawyer 談到了 Perl 用戶的三個主要細分市場:
- 絕不會改變他們的代碼的人
- 使用新功能的人
- 從零開始的人
Perl 5 的社會契約是 極度後向兼容 ,並且在這方面取得了驚人的成功。問題是,極度後向兼容對那些不會更新代碼的人有效,但對另外兩部分人沒有幫助。要使用新功能的人不得不在每個程序中加入挺長的例行模板部分,而從零開始的人們則想知道為什麼他們創建一個程序就必須包含這麼多,才能不讓 StackOverflow 上的人因為少了那些編譯指令而呵斥他們。
硬核老王:迎合新血才是最重要的,讓舊代碼和舊人們自己過吧。
為什麼是 7,而不是 6?
這個答案分為兩部分。 首先,「Perl 6」 已經被現在稱為 Raku 的產品所採用。很久以前,我們認為這件非常雄心勃勃的重寫工作將取代 v5.8。但最後,這件事並沒有發生,Perl 語言依舊繼續過著自己的生活。
因此,下一個可用數字為 7。如此而已。這只是序列中的下一個基數。版本跳躍這事情並不稀奇:PHP 直接從 5 升到了 7 —— 難道是我們從 PHP 社區偷學到的跳躍技能?看看一下歷史上的其他奇怪的版本變化:
- 從 Solaris 2.6 到 Solaris 7
- 從 Java 1.4 至 Java 5
- 從以 Postgres 9.x 為主要版本變成了以 Postgres 10 為主要版本
- Windows 3.1 至 Windows 95(98、ME、2000、XP、Vista、7、8、10)
- TeX(每個新版本都更趨近於圓周率 π )
至少我們沒跳到 Perl 34!
硬核老王:言外之意,你們跳得,我也跳得~而且,你們不覺得版本 6 這個數字有點不吉利么,而版本 7 這個數字就好多了。
有什麼消失了么?
消失的東西不多。有些東西在默認情況下會被禁用,但同樣,這本質上是調整旋鈕和撥盤指向不同地方的 Perl 5.32。即使在 Perl 5 的土地上,有些東西你也應該學會不需要。以下這些都是第一輪變化的可能目標:
- 間接對象符號
- 裸詞文件柄(標準文件柄除外)
- 偽多維數組和哈希值(老的 Perl 4 花招)
- Perl 4 風格的原型定義(使用
:prototype()
代替)
硬核老王:是該學會放棄了,又不是區塊鏈,什麼舊的都不能丟下。
增加了什麼?
增加的也不多。Perl 7 主要是 Perl v5.32,但默認啟用了所有的功能。你不需要做任何事情就可以獲得大多數新功能,比如postfix 解引用,新的 isa 操作符,或者其他一些功能。這就是一個主要版本可以提供的新社會契約的好處。這是一個硬邊界,新功能可以在一邊默認存在,而不干擾另一邊。
硬核老王:多增加點新的編程語言技能吧!哪怕是語法糖。
那我現在應該做什麼?
如果你需要一個舊版的 Perl 來運行你的代碼,你繼續好了。那些舊版本是不會消失的。就像 Perl 5.6 到現在仍然可以使用,如果那是你希望運行的版本的話。
如果你的代碼在那些約束和警告下運行沒有問題,而且你使用的是現代 Perl 風格,可能你大部分代碼都不用動。如果你有一些裸詞的文件柄,就開始轉換這些,間接對象符號也一樣。
如果你的代碼比較凌亂,你也不是沒有機會。在從 Perl 5 到 7 的過渡過程中,會有兼容模式來幫助你(但不是 Perl 5 到 8)。一個編譯指令可以把那些旋鈕和撥盤設置回舊的設置(但這最多也就是一個版本的事情)。
use compat::perl5; # 行為類似 Perl 5 的默認行為
對於模塊來說,還有一些問題需要解決,但也會有一個兼容機制來解決這些問題。
硬核老王:代碼實在寫的爛(辯解:我這不是爛,是 Perl 的古怪傳統),那沒辦法,只能給你一次機會。
好消息是,這些東西已經被主要的 Perl 利益相關者在生產環境中進行了測試。這不是紙上談兵:我們已經在做了,一些粗陋的地方正在調整打磨。
而且,v5.32 中已經有了一些這些旋鈕和撥盤,比如,你可以這樣關閉間接對象表示:
no feature qw(indirect);
預期會有更多的旋鈕或撥盤,或許像這樣:
no multidimensional;
no bareword::filehandle;
我在《為 Perl 7 做準備》一書中收集了所有這些信息,這是我通過 Perl School 和 LeanPub 提供的最新產品。
硬核老王:本文作者 brian d foy 也是《 精通 Perl 》 的作者,我是這本書是中文譯者之一。
一句話總結
Perl 7 是 v5.32,設置不同而已。你的代碼如果不是亂七八糟的,應該可以用。預計一年內會有用戶發布。
硬核老王:作為一個老 Perl 程序員,這個消息讓我又動心了,認真考慮是不是再投回 Perl 的懷抱,哦不,是 Perl 7 的懷抱。
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive