作者:莫奇
審校:武穆
近日,Perl 5.36正式發(fā)布,新版本帶來了許多便利的功能。Perl可以說是全球最常用的語言之一,在它全盛的時代,人們會經(jīng)常用它開發(fā)網(wǎng)絡(luò)程序,但時至今日,開發(fā)者對于Perl的評價卻是兩極分化的:有人會鄭重地紀(jì)念它的生日,有人卻希望它快點(diǎn)“死去”。
不可否認(rèn)的是,Perl已經(jīng)不再流行。從TIOBE 6月編程語言排行榜就可見端倪。大家更多關(guān)注的是時下最熱門的語言,雖然Perl也是榜上有名的,但非常遺憾的是,Perl位列第17名(前20名的下游位置),幾乎沒有人會在討論最佳編程語言時提到它。
TIOBE 6月編程語言排行榜(1-20名)
據(jù)了解,本次發(fā)布的Perl 5.36是自Perl 5.34以來較大的一次版本更新。更新后的Perl也給開發(fā)者帶來了更良好的使用體驗(yàn)。比如新增的use x.xx 功能省略了代碼頂部繁瑣的功能模塊聲明;此外,穩(wěn)定了布爾跟蹤、正則表達(dá)式集、支持Unicode 14.0等功能;還增加了內(nèi)置函數(shù)、單次迭代多個值、try/catch語法支持 finally 關(guān)鍵字等實(shí)驗(yàn)性功能。
也許很多人會問:這次版本更新能否挽救日漸沒落的Perl?不再流行的Perl會逐漸消失嗎?
三十余年坎坷路,Perl 7還在遠(yuǎn)方
編程語言Perl是“Practical Extracting and Reporting Language”的縮寫,意為實(shí)用提取和報告語言。Perl的功能豐富,可以在超過100種計(jì)算機(jī)平臺上運(yùn)行。Perl最初是為文本處理而開發(fā)的,現(xiàn)在則多用于各種任務(wù),包括網(wǎng)絡(luò)編程、Web開發(fā)、系統(tǒng)管理、GUI開發(fā)等。
1987年12月18日,Perl 1.0正式發(fā)布,其最初的設(shè)計(jì)者是拉里·沃爾(Larry Wall)。Perl語言借鑒了C、Sed、awk、shell腳本語言以及很多其他程序語言的特性,其中最重要的特性是它內(nèi)部集成了正則表達(dá)式的功能,以及巨大的第三方代碼庫CPAN。
Perl 2.0在1988年6月發(fā)布,Perl 3.0和Perl 4.0則分別在1989和1991年發(fā)布。1994年發(fā)布的Perl 5是最重要的一個版本,這個版本也成為使用最為廣泛的版本。
2015年12月25日,開發(fā)了十多年的Perl 6在圣誕節(jié)正式發(fā)布。Larry Wall以Perl 6吉祥物Camelia的名義宣布Perl 6可以在產(chǎn)品中使用,但強(qiáng)調(diào)其仍然處于青春期,意味著它有幾分成熟了,但依然存在一些問題。
進(jìn)入到第四個十年的Perl,在這些年經(jīng)歷了太多的起起落落。根據(jù)Perl指導(dǎo)委員會的說法,盡管5.36.0的最終版本“指日可待”,但萬眾期待的Perl 7繼續(xù)在遠(yuǎn)處閃爍。
Perl:不止一種方法可以做到
Perl是一種自然和智能語言,它能根據(jù)上下文環(huán)境解釋執(zhí)行,同時有大量省略寫法。Perl語言的座右銘是:There’s More Than One Way To Do It (TMTOWTDI,有多種方法可以完成一件事,或者“條條道路通羅馬”)。
如果你想使用sed、awk或sh來解決問題,但是卻發(fā)現(xiàn)它們的能力不夠,或者想運(yùn)行得更快一點(diǎn),卻不想傻傻地用C來寫,Perl將是很好的選擇。Perl擅長于文本處理和系統(tǒng)管理,不適合于實(shí)時嵌入式系統(tǒng)編程、操作系統(tǒng)底層開發(fā)(比如驅(qū)動程序開發(fā))、復(fù)雜的多線性共享內(nèi)存應(yīng)用以及較大的應(yīng)用。
Perl擁有動態(tài)語言強(qiáng)大靈活的特性,并且從C/C++、Basic、Pascal等語言中分別借鑒了語法規(guī)則,從而可以提供很多冗余語法。或許正因如此,它被評價為“write-only”——雖然你可以寫得很隨意,但是可能會得到意料之外的結(jié)果而不報錯。除此之外,讓程序員感到頭疼的還有它冗長的程序代碼,實(shí)現(xiàn)相同功能的程序代碼長度可能相差十倍百倍。
事實(shí)上,人們現(xiàn)在更習(xí)慣使用Perl來寫服務(wù)器腳本。與多數(shù)的網(wǎng)頁編程語言(PHP或JavaScript)相比,Perl是可以直接執(zhí)行的。為了使源代碼能夠被直接翻譯成機(jī)器語言,它在執(zhí)行每一行代碼之前都先翻譯,因此省去了編譯的時間。
Perl最強(qiáng)的一點(diǎn)在于,它可以執(zhí)行用其他計(jì)算機(jī)語言所編寫的代碼或子程序。此外,它還能夠利用處理器,讓開發(fā)者可以在海量的庫和模塊中任意挑選;并且適用于各類數(shù)據(jù)庫管理,支持SQL語句查詢,通過DBI模塊對返回結(jié)果進(jìn)行處理。
另一個為人稱贊的是,Perl只有三種數(shù)據(jù)類型,標(biāo)量(scalar)、數(shù)組和哈希。其中,標(biāo)量是最簡單的數(shù)據(jù)類型,一般是指單個數(shù)字、整數(shù)、文本或者引用。一連串的標(biāo)量可以有不同的處理方式,通常被稱為數(shù)組。以特定形式將值鍵組合的數(shù)據(jù)形式被稱為哈希。在Perl中,值鍵用標(biāo)量表示,而類型則以文本字符串的形式表示。
下面羅列了一些關(guān)于Perl語言的優(yōu)勢與不足:
Perl語言的優(yōu)勢:
*正則表達(dá)式:Perl最擅長的一件事,就是文本操作。許多語言都有正則表達(dá)式,但Perl幾乎是他們的發(fā)明人。并且它是內(nèi)置的,不需要任何模塊。
*靈活性:Perl具有三種基本的變量類型:標(biāo)量、數(shù)組和哈希。你可以隨意使用所有引用,而不必?fù)?dān)心內(nèi)存泄漏或整個PC崩潰的情況。
*Unicode支持(相對AWK與C)
*可移植性:Perl在網(wǎng)絡(luò)上運(yùn)行良好。它在UNIX中效果很好。它甚至在Windows中也能很好地工作。它不是單一功能,而是“萬事通”。
*CPAN:你可以找到所有你需要的東西。此外,通過CPAN安裝任何模塊都非常容易。直接從CPAN安裝,在解決依賴關(guān)系方面,它與apt-get一樣出色。
其不足之處在于:
*動態(tài)類型語言,不是很可靠;
*自然語言,是優(yōu)點(diǎn)也是缺陷,使得Perl語言代碼可能晦澀難懂;
*智能語言,是優(yōu)點(diǎn)也產(chǎn)生不足:根據(jù)上下文解釋編程者之意,可能產(chǎn)生臆斷,也因此產(chǎn)生很多編程陷阱;
*不是很優(yōu)美,多種方法做事,有時會讓編程者無所適從。
*性能問題,Perl靈活的數(shù)據(jù)結(jié)構(gòu)和處理性能通常不是很高(相對C/C++),若需要高性能的處理,有時需要使用其它語言重寫。
Perl語言的學(xué)習(xí)曲線淺而長。只要看看《Learning Perl》,就可以編寫簡單的Perl程序了,然而要深入掌握Perl,要使用Perl的復(fù)雜數(shù)據(jù)結(jié)構(gòu),進(jìn)行面向?qū)ο缶幊獭⒍嗑€程編程則不是那么容易的事,需要很長的時間去學(xué)習(xí)和實(shí)踐。
Perl會消失嗎?
十多年前,就有人問過類似這種問題,但是事到如今,Perl依然活得很好,并沒有消失。Perl在文本處理、數(shù)據(jù)挖掘、運(yùn)維、生物信息等眾多領(lǐng)域均有不錯的應(yīng)用,只是它不像互聯(lián)網(wǎng)熱點(diǎn)被人們所關(guān)注罷了。
客觀來說,Perl本身是一門古老的語言,但它擁有一個生機(jī)勃勃且生產(chǎn)效率很高的社區(qū),其價值體現(xiàn)在CPAN庫中。正如程序員Rox所說,幾乎沒有任何一種語言具有像CPAN一樣廣泛和全面的庫,一切都近在咫尺。在CPAN中,你可以找到成千上萬的模塊和框架,并通過它們來完成你想象的任何事情。
需要網(wǎng)絡(luò)服務(wù)器嗎?有HTTP :: Server;需要一個獨(dú)立的數(shù)據(jù)庫嗎?有Muldis :: DB。無論你的需求是什么,通常都可以找到幾個滿足您需求的模塊,你只需要選擇最適合你的應(yīng)用程序的模塊即可。
Rox表示,至于Ruby,Python和其他競爭對手,健康的競爭對Perl來說是巨大的好事。其他語言得到的任何東西,Perl社區(qū)都用Perl重寫。例如,當(dāng)Ruby在Rails的成功上飛速發(fā)展時,Perl有了Dancer,在許多方面都比Rails更好。
Perl不會死,也不會消失。周圍沒有什么浮華的事情,沒有公司可以從炒作Perl中受益,因此它并沒有引起媒體的廣泛關(guān)注,也不是每個人都知道Perl,所以對此的討論也較少。
另需說明的是,盡管Perl可能并不適用于應(yīng)用類的開發(fā),或者做CGI的Web開發(fā),但是作為腳本語言在數(shù)據(jù)挖掘、Linux系統(tǒng)管理等偏重于面向過程的文本處理分析方面,仍然是非常順手的工具,并且有很多自動化測試領(lǐng)域的工具都是Perl寫的,所以Perl還是會活得好好的,只是逐漸淡出了為人們所熟知的Perl CGI開發(fā)而已。
開發(fā)者對Perl的評價
(圖源:QA Stack)
(圖源:知乎)
寫在最后
客觀來說,Perl仍然存在較大的價值和潛力,但也不得不承認(rèn)它現(xiàn)在陷入了困境。未來,如果在不影響向后兼容性的情況下對其進(jìn)行現(xiàn)代化改造,保持向后兼容性,促使它更易于使用現(xiàn)代功能,或許就能激發(fā)這門語言的更大潛力。正如程序員Nikos Vaggalis所說,無論什么情況下,Perl的長壽和繁榮都是有保證的。大家是如何看待Perl語言的?歡迎在下方留言討論。
參考鏈接:
https://www.i-programmer.info/programming/perl/15105-perl-turns-34-a-retrospective.html?start=1
https://www.theregister.com/2022/05/26/perl_v7/
https://www.tiobe.com/tiobe-index/