Scribunto:入门/背景
要了解什么是 Scribunto,首先需要了解 MediaWiki。MediaWiki 是为维基百科(一个流行的在线百科全书)提供支持的软件。它是一个维基引擎,这意味着任何人都可以随时编辑任何页面。MediaWiki 是为维基百科而构建的,维基百科的成功也意味着 MediaWiki 的蓬勃发展。截至 2014 年 2 月,超过 9,000 个网站使用 MediaWiki,[1] 并且已经编写了超过 2,000 个核心 MediaWiki 软件扩展。[2]
Scribunto 是这 2,000 个扩展之一。Scribunto 这个名字在拉丁语中意为他们将会写,这很恰当,因为 Scribunto 允许用户在 MediaWiki 维基上编写计算机程序。具体来说,它允许用户嵌入用 Lua 编程语言编写的脚本。维基媒体基金会是一个非营利组织,运营着维基百科并监督 MediaWiki 软件的开发,他们将这些脚本视为现有 MediaWiki 模板系统的一种替代方案。与 MediaWiki 模板相比,Lua 脚本具有显着的性能优势,尤其是在更复杂的模板中,这些模板具有许多参数和多个子模板。Lua 脚本也比 MediaWiki 模板更灵活,在某些情况下,可以显着减少相同功能的代码大小。
Lua 是一种编程语言,由巴西里约热内卢天主教大学的计算机科学家于 1993 年开发。它快速轻便,使其成为嵌入式应用的理想选择。它还具有相对简单的语法,并以学习曲线短而闻名。
Scribunto 的起源在于 MediaWiki 的模板系统。最初,模板旨在作为一种在许多不同页面上重复使用相同内容的方法。例如,在维基百科上,它们被用于制作需要改进的文章的维护横幅,以及用于链接相关文章的导航框。这极大地简化了文章的维护,因为用户只需对模板进行一次编辑,就可以对数百篇文章进行更改。
在 1.3 版中,MediaWiki 开发人员添加了在模板中使用参数的功能,这意味着同一个模板可以在不同页面上显示不同的输出。此外,从 MediaWiki 1.6 开始,这些参数可以接受默认值。这使得模板变得更加灵活,但也有意想不到的缺点。通过操作参数名称和默认值,可以将条件逻辑添加到模板中。
使用条件逻辑的能力使模板可以作为一种编程语言使用。模板从未被设计用于执行此类工作,以这种方式使用它们存在几个缺点。其中一个是显示代码与逻辑代码混合在一起,结果是模板不能轻易缩进以帮助理解。另一个是它们很慢;MediaWiki 已经用具有条件逻辑(PHP)的编程语言编写,在它之上添加另一种准编程语言会带来显著的性能成本,尤其是对于复杂的模板而言。一个名为“qif”的特定模板,提供了一种比直接操作模板参数更简单的方式来使用条件逻辑,并在维基百科上得到了广泛使用,相应的对性能产生了负面影响。
为了尝试改善这种情况,MediaWiki 的主要开发人员之一 Tim Starling 编写了 ParserFunctions 扩展,它引入了包括#if
和#switch
在内的逻辑运算符。这在一定程度上提高了性能,但从未打算作为永久性解决方案。果然,基于 ParserFunctions 的模板变得比那些使用 qif 的模板更复杂。
MediaWiki 1.12 中引入了一个进一步的创新来解决模板性能问题,它以 MediaWiki 解析器的新预处理器形式出现。这个新的预处理器旨在仅在必要时才评估模板代码。因此,如果一个模板使用了#if
解析器函数,MediaWiki 将仅在测试评估为true
时才评估“true”代码,并且仅在测试评估为false
时才评估“false”代码。同样,这个预处理器在提高 MediaWiki 的解析性能方面取得了成功,但在使用许多复杂模板的页面上仍然很慢。
Scribunto 是解决 MediaWiki 模板性能问题的最新努力。MediaWiki 开发人员没有对解析器函数或 MediaWiki 的核心软件进行更多改进,而是选择允许用户在维基页面上使用成熟的脚本语言。这意味着基于 Scribunto 的模板与基于 ParserFunctions 的模板相比,性能有显著提高。根据模板的不同,Scribunto 版本的速度可以是 ParserFunctions 版本的两倍到 50 倍。[3] Scribunto 还提供逻辑代码和显示代码的适当分离,这意味着基于 Scribunto 的模板可以轻松缩进和添加注释以提高可读性。