Perl 6 小感

Perl 6 是 Perl 家族的新成員,在 2015 年十二月發布了第一個正式版 (v6.c),代表其語言特性大抵上穩定了下來。在今年年初開始,陸續有數本 Perl 6 相關的書籍問世,代表 Perl 6 社群開始試著向外拓展。筆者最近利用一些時間學習 Perl 6 的核心特性,在此向各位讀者分享一些心得,做為使用 Perl 6 的參考。

The Good

Perl 6 最值得稱許的特性,就是內建一套完整的物件系統。原先 Perl 5 的物件系統相對簡單,有許多開發者試圖改善 Perl 5 的物件系統,反而造成 Perl 5 物件系統的混亂局面,直到引入 Moose 後,Perl 5 才有一個社群公認的物件系統。Perl 6 的物件系統支援不少特性,像是封裝、繼承、Role (類似 Java 8 的介面)、函式重載、運算子重載、多型等。

Perl 家族的特長在於文字處理,而 Perl 6 也延續這個優良的傳統。像是 Perl 6 內建一套完整的常規表示式引擎。此外,Perl 6 的 Grammer,將語法分析器 (parser) 內建在語言特性中,在程式語言中是相對少見的。透過 Grammer,可以用來處理常規表示式無法處理的問題,像是解析 HTML、XML 或其他複雜的文字檔案。

另外,Perl 6 的數字系統有特別處理過。像是 0.1 + 0.2 - 0.3 == 0.0 這種有理數的運算,在大部分的程式語言,都會有一些微小的誤差而無法正確運算,而 Perl 6 可以得到正確的結果。目前 Perl 6 速度相對較慢,其數字系統是否足以用於實際情境,仍有待觀察。

Perl 6 仍然保留 sigil 這套變數字首,比起 Perl 6 則相對簡化。針對不同類型的變數,像是純量 (scalar)、陣列 (array)、雜湊 (hash)、副常式 (subroutine) 等,不需要再頻繁轉換,同一種變數一律使用同一種 sigil 即可。對於 Perl 5 程式設計者來說,一開始會不太習慣,但一小段時間後,會發現新的規則更簡單好用。

Perl 6 對於複合資料結構的支援較先前改善,像是多維陣列 (multi-dimensional array),不需要透過參考 (reference) 這種中介結構,可以直接呼叫,大幅簡化了先前使用參考所需的特殊語法和觀念。

The Bad

雖然 Perl 6 支援多重繼承,但對於方法名稱衝突卻是使用特定演算法自動處理,而無法人為介入。由於 Role 對於方法名稱衝突會引發錯誤,但多重繼承不會,筆者認為這項特性算是設計上的失誤。在 Perl 6 正式版推出後,這個特性應該不太可能再大改,目前比較好的方法就是避免使用多重繼承。

Perl 6 大量使用特殊符號代替函式或方法呼叫,雖然語法比較簡短,但是某種程度上會增加閱讀的困難;即使筆者先前有使用 Perl 5 的經驗,在讀官方文件時,仍會對過多的符號產生排斥感。此外,特殊符號比較難透過搜尋引擎尋找相關文章,對於初學者來說也是相對不利。

Perl 6 仍然相當靈活,甚至可以自訂新的運算子,在某些情境下,這個特性有些幫助,像是數算運算等。但是,筆者認為這個特性要審慎使用,過多的特殊符號,會使得程式碼難以閱讀和維護。

The Ugly

雖然 Perl 6 有豐富的語言特性,缺乏足夠的套件,使得 Perl 6 難以推廣。尤其,缺乏 Ruby on Rails 這種重量級軟體 (killer application),更使得使用者不願轉換到新語言。雖然 Perl 6 這個計畫拖了得久,但 Perl 6 在 2015 年十二月才發布第一個正式版,實際的年齡仍相當年輕。這方面只能依賴有心的社群成員持續努力。

目前的時空背景和 Perl 當初問世時大不相同,使得 Perl 6 難以出頭。Perl 剛問世時,好的高階直譯語言很少,由於 Perl 在文字處理的長處,使得 Perl 大量用於 CGI 網頁程式。然而,現在至少有 Perl 5、Python、Ruby、Groovy 等數個成熟的語言生態圈,轉換到 Perl 6 的動機相對薄弱。此外,近年來有數個易於撰寫的編譯語言,像是 Go 和 Crystal 等,更加壓縮 Perl 6 的發展機會。

The Future

目前大部分 Perl 6 相關的學習資源多圍繞在語言特性上,較缺乏實務面的運用,某種程度反映了 Perl 6 的現狀。雖然 Perl 6 有豐富的特性,Perl 6 虛擬機器的速度仍需加強,這也使得程式設計者暫時不願轉換。Perl 6 語言本身和相關工具大抵上已經穩定,若能在套件和框架上加強,仍然大有可為。

Postscript

筆者在自己的網站放上了 Perl 6 的學習筆記,會於後續更新內容,若有需要的讀者可前往參考。

上篇買 Mac 來寫程式
下篇[公告] 網站更名