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] 是 VM 的一个 JIT 版本,适用于 x86。

在其他 VM 上有 Lua 的替代实现,尽管在许多情况下是部分实现——请参阅 LuaAddons 中的“Lua 的替代实现”。Perl 的复杂性、缺乏正式的语言规范以及缺乏独立的 VM 是导致只有一个真正实现存在的原因(尽管这种情况在 Perl 6 中正在改变,尽管 Perl 6 更加复杂,但它确实有正式的语言规范和独立的 VM,并且一个编译器是用 Haskell 编写的)。

内存管理: Lua 5.1 具有增量式垃圾收集器(GarbageCollectionTutorial)。Perl 使用一个简单但高效的基于引用的垃圾收集器,它会在循环中泄漏 [16](尽管 Perl 6/Parrot 将使用垃圾收集 [17])。

稳定性: Lua 中很少发现错误。 [18] 代码量小,高度稳定,并且经过了广泛的审查。 Perl 核心更大,功能更多,也更复杂,因此自然更难确保其有效性。 也就是说,Perl 被广泛使用和测试,其核心通常非常稳定。 如果包含非核心模块,那么 Perl 在总体上可能更稳定/成熟。

扩展/嵌入/定制

嵌入和使用 C 扩展: Lua 具有非常干净且简单的接口,用于嵌入或扩展 C。 Perl 有 XS,它具有普遍认可的缺陷和复杂性 [19],但有一个更简洁的 Inline 接口 [20] 用于各种语言。

Lua 编译器和 VM 更容易理解和定制。 Perl 更加复杂。

语法

语法: Perl 实际上是一种相当复杂的语言。 复杂的语法可以允许更多表达力,如果掌握了 [21],但也可能更难学习,更容易被滥用。 Perl 语法中的一些部分很笨拙,例如它使用 sigils [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] 用于 PEG 已经引起了很多关注,尽管 Perl 有各种用于语法的模块,例如 Parse::RecDescent [32]

Web 开发:自 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 也有活跃的邮件列表、维基、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)。

组合 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 GMT (差异)