Lua Versus Perl |
|
表达能力: Lua 尽管体积小巧,却具有惊人的表达能力,甚至提供了协程、闭包以及用于 OO 和其他范例的元机制。Perl 可能是最富表达力的语言之一 [3][4],但其体积和复杂性要大得多。 [5]
协程支持: Lua 内置了协程支持。在 Perl 中,有一些模块用于添加此功能 [6]。Perl 6 支持类似于协程的功能 [7][8],但截至 2009 年 8 月,Rakudo 尚未支持惰性求值,而这正是其所需。
性能: Lua 是最快的解释型脚本语言之一。Perl 通常更重量级,但针对某些文本处理功能进行了优化 [9]。
代码占用空间: Lua 的占用空间要小得多:大约 120KB 的二进制文件。Perl 5.6 大约是 1.1MB。最小的 Perl 构建之一,TinyPerl? 5.8.0/Win32,是 94KB 的 tinyperl.exe + 356KB 的 perl58.dll(约 3.8 倍)(还有可选的 262KB lib.zip)。
可移植性: Lua 几乎可以在任何 ANSI C 编译器上编译。这和它的小体积使其能够运行在许多嵌入式平台上。Perl 尽管运行在许多操作系统上,但有更严格的要求 [11]。
虚拟机: Lua VM 是一个高效的基于寄存器的虚拟机。Perl 工作在基于堆栈的 VM 上 [12][13](Perl 6 将拥有一个名为 Parrot 的寄存器 VM [14])。LuaJIT [15] 是 x86 的 VM 的 JIT 版本。
在其他 VM 上也有 Lua 的替代实现,尽管在很多情况下是不完整的——请参阅 LuaAddons 中的“Lua 的替代实现”。Perl 的复杂性、缺乏正式语言规范以及缺乏独立的 VM 是仅存在一种实际实现的原因(尽管这在 Perl 6 中正在改变,Perl 6 尽管更复杂,但确实有正式的语言规范和独立的 VM,并且有一个用 Haskell 编写的编译器)。
内存管理: Lua 5.1 具有增量式垃圾收集器(GarbageCollectionTutorial)。Perl 使用一种简单但有效的基于引用的垃圾回收机制,该机制在循环时会发生泄漏 [16](尽管 Perl 6/Parrot 将使用垃圾回收 [17])。
稳定性: 在 Lua 中可以找到的 bug 非常少。 [18] 代码小巧、高度稳定且经过广泛审查。Perl 的核心更大,功能更多,也更复杂,因此保证其有效性自然更难。尽管如此,Perl 被广泛使用并经过大量测试,其核心总体上相当稳定。如果包含非核心模块,那么 Perl 通常可能更稳定/成熟。
使用 C 进行嵌入和扩展: Lua 具有非常清晰简洁的接口,用于嵌入或扩展 C。Perl 有 XS,它存在普遍认识到的缺陷和复杂性 [19],但有一个更简洁的 Inline 接口 [20] 可用于各种语言。
Lua 的编译器和 VM 更易于理解和定制。Perl 要复杂得多。
语法: Perl 总体上是一种相当复杂的语言。复杂的语法如果掌握得当,可以提供更强的表达能力 [21],但也可能更难学习,更容易滥用。Perl 的某些语法部分比较笨拙,例如其对 sigil 的使用 [22],尽管 Perl 6 正在解决这个问题 [23]。
Lua 具有简洁、清晰的语法,其核心语言可以描述在 25 页中,标准库再占用 25 页 [24]。Lua 的语法可以容纳在一到两页(请参阅 LuaGrammar)。
语法规范/外部解析器: Lua 的语法根据规范定义,而且是一个简单的规范(请参阅 LuaGrammar)。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] 用于 PEGs 受到了广泛关注,尽管 Perl 有各种用于语法的模块,例如 Parse::RecDescent [32]。
Web 开发: 自从网络诞生以来,Perl 一直被广泛用于 Web 编程,最初是 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 拥有成熟的打包、版本控制、分发和安装机制。Lua 正在通过 LuaRocks 项目开始类似的努力。
文档格式: Perl 具有标准的模块文档格式,POD [40]。Lua 的文档方法有点分散(例如,LuaDoc [41] 和 LuaPOD [42])。
测试: Perl 有 CPANTS [43]/Kwalitee。CPAN 上的大多数模块都带有测试套件。有版本测试模块,包括流行的 Test::More [44]。Lua 本身也有一些测试模块(UnitTesting)。
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]。