Lua 對 Perl

lua-users home
wiki

引言

Perl [1] 是一種通用的動態程式語言,支援多種程式設計典範(程序式、物件導向和函數式風格)、自動記憶體管理、內建文字處理支援,以及大量的第三方模組。[2]

語意

表達性:儘管 Lua 規模小,但表達性卻驚人,甚至提供協程、閉包和用於物件導向及其他範例的元機制。Perl 可以說是現有最具表達性的語言之一 [3][4],但其規模和複雜度也大得多。[5]

協程支援: Lua 具有內建協程支援。Perl 中有一些模組可以新增這個功能 [6]。Perl 6 支援類似協程的東西 [7][8],儘管截至 2009 年 8 月,Rakudo 尚未支援這個功能所需的惰性。

效能、效率和實作

效能: Lua 是最快的編譯指令碼語言之一。Perl 通常較為重量級,但針對某些文字處理功能進行了最佳化 [9]

程式碼佔用空間: Lua 的佔用空間小很多:約 120K 二進位檔。Perl 5.6 約為 1.1M。Perl 中最小的組建之一 TinyPerl? [10] 5.8.0/Win32,是 94K tinyperl.exe + 356K perl58.dll (~3.8x)(以及可選擇的 262K lib.zip)。

可移植性: Lua 幾乎可以在任何 ANSI C 編譯器上編譯。這一點加上它的小規模,讓它甚至可以在許多嵌入式平台上執行。儘管 Perl 在眾多作業系統上執行,但其需求更嚴格 [11]

虛擬機器: Lua VM 是一個效率極高的基於寄存器的虛擬機器。Perl 使用基於堆疊的 VM 工作 [12][13](Perl 6 將會有稱為 Parrot 的註冊表 VM [14])。LuaJIT [15] 是適用於 x86 的 VM 的 JIT 版本。

有許多情況下,Lua 在其他 VM 上有其他部分實作,請參閱 LuaAddons 中的「Lua 的其他實作」。Perl 的複雜性、缺乏正式的語言規格,以及缺乏獨立的 VM,都是實際上僅有一個實作存在的原因(儘管這一點在 Perl 6 中有所改變,後者雖然更複雜,但確實有正式的語言規格和獨立的 VM,其中一個編譯器是用 Haskell 編寫的)。

記憶體管理:Lua 5.1有一個遞增的垃圾回收機制(垃圾回收教學)。Perl使用一個簡單,但有效率的基於參考的垃圾回收機制,可能會在循環中洩漏[16](不過Perl 6/Parrot會使用垃圾回收機制[17])。

穩定性:Lua中可以找到的錯誤非常少。[18]程式碼很小,高度穩定,並且經過廣泛的檢閱。Perl核心比較大,功能比較多,也複雜很多,因此確保其有效性會比較困難。即便如此,Perl廣泛的使用與測試,核心一般來說相當穩定。如果使用核心模組,Perl在整體來看可能是更穩定/成熟的。

擴充/嵌入/自訂

使用C語言嵌入和擴充:Lua有一個非常清晰且簡單的介面,可以嵌入或擴充C語言。Perl有XS,它有一些廣為人知的不足和複雜性[19],但也有一個比較清晰的Inline介面[20],可以連接不同的語言。

Lua編譯器和虛擬機器比較容易理解和自訂。Perl複雜許多。

語法

語法:Perl是一個非常複雜的語言。如果精通,複雜的語法可以用來提供更多表現力[21],但學習起來也比較困難,而且也比較容易被濫用。Perl語法的有些地方有點怪,像是使用標記符號[22],不過這在Perl 6中已經修正了[23]

Lua有簡單,清晰的語法,它的核心語言可以用25頁說明,而標準函式庫則可以用25頁說明[24]。Lua語法可以用一至兩頁來概括(請參閱Lua語法)。

語法規範/外部解析器:Lua語法是根據某個規範來定義的,而且很簡單(請參閱Lua語法)。Perl是根據實作而非正式的語言規範來定義的(不過Perl 6會根據某個規範來定義)。由於缺乏正式規範且複雜,Perl只有在Perl中可以合理地完全解析(請參閱 [PPI])或在有些困難的情況下,可以部分解析 [25](在有些困難的情況下,Perl 6可以完全解析[26])。

基於以上原因,編寫 Lua 解析器比 Perl 解析器容易得多。這使得撰寫應用於該語言的工具更加容易,例如:語法高亮工具、原始碼分析器、原始碼轉譯器、原始碼過濾器、文件萃取器、元程式設計工具(例如 Metalua [27])和替代性實作(參閱 LuaAddons 中的「Lua 替代性實作」)。但請注意,由於 Lua 是一種高度動態的語言,因此僅從語法中萃取原始碼意義會十分困難。

功能/應用領域

資料庫支援: Perl 的資料庫支援 [28] 更加成熟,且包含繫結值/佔位符支援 [29]。不過 Lua 也有 LuaSQL [30]

正規表示式: Perl 在語言中內建正規表示式支援。Lua 有一個較受限制但仍然很實用的樣式比對函式庫,且有許多正規表示式函式庫外掛(參閱 LibrariesAndBindings)。Lua 的 LPeg [31](用於 PEG)備受矚目,但 Perl 有許多針對語法編寫的模組,例如 Parse::RecDescent [32]

網路開發: 自網路建立以來,Perl 就廣泛用於網路程式開發,先是 CGI,然後是 mod_perl 和許多其他架構。有廣泛的支援模組(例如:[33])。Lua 有 Kepler [34]

執行緒: Perl 有內建執行緒 [35]。Lua 有內建的協程支援(合作式多工),並鼓勵使用協程而非執行緒,或至少針對每個 Lua 狀態使用一個執行緒(參閱 ThreadsTutorial)。有幾個支援 Lua 預先搶佔式多執行緒處理的外掛,例如 LuaLanes? [36]

模組與軟體工程

模組: Perl 在 [CPAN] 中有大量的模組,可以用來簡化各種的腳本編寫和程式開發任務(截至 2005 年,CPAN 中有 1500 萬行程式碼 [37])。Lua 的模組較為特殊且受限,但許多模組會在 LuaForge 中維護。

Lua 欠缺完整的標準函式庫(部分原因是 ANSI 相容性設計需求),但請參閱 ExtensionProposal

社群: Perl 有個龐大且有組織的使用者社群(例如:CPAN、CPANTS [38]、use.perl.org、perl.com、perlmonks.org、超過一百個郵件列表 [39],...)。Lua 也有活躍的郵件列表、wiki、LuaForge、Kepler 等。

封裝/配置: Perl 擁有透過 CPAN/ExtUtils::MakeMaker 的封裝、版本控制、發行和安裝機制。類似功能正在透過 LuaRocks 計畫帶到 Lua 上。

文件格式: Perl 有標準的模組文件格式,POD [40]。Lua 的文件方法較為分散(例如:LuaDoc [41] 和 LuaPOD [42])。

測試: Perl 有 CPANTS [43]/Kwalitee。CPAN 上的大多數模組都包含測試套件。有版本測試模組,包括熱門的 Test::More [44]。Lua 本身有幾個測試模組(單元測試)。

結合 Perl 和 Lua

Parrot 上有 Lua 的實作。 [Inline::Lua][Outline::Lua][Lua::API][Lux](最近維護過)會將 Lua 嵌入 Perl 中。 [perlembed][luaperl] 會將 Lua 嵌入 Perl 中。re::engine::Lua [45][46] 會透過可插入的正規運算式引擎為 Perl 5.10 提供 Lua 模式。LuaPOD [42] 以 Lua 分析 POD。Syntax::Highlight::Engine::Kate::Lua [47] 會以 Perl 突顯 Lua 語法。

其他備註

雖然上面注意到從 Perl 5 到 Perl 6 有些進展,但 Perl 6 是個龐大的工程,而最終的 Perl 6 版本離我們還有幾年尚不得而知。 [48]

另請參閱


最近的變更 · 偏好設定
編輯 · 歷史
最近更新時間 2018 年 6 月 24 日,上午 4:48 格林威治標準時間 (比較)