在本篇论文里,我们展现了Lua 5.0中很多创新的部分:基于寄存器的虚拟机;用新算法优化table,当它作为数组使用时;闭包的实现。
据我们所知,在所有被广泛使用的语言中,Lua第一个使用基于寄存器的虚拟机。对table的优化,lua可以实现一部分的table当数组使用(也就是说,如果有足够的key在1...n之间)。它实现的闭包也是很独特的,在复杂的情况下(基于数组的栈,词法作用域,first-class函数),用不复杂的方法实现了闭包。
图10中例举了Lua新旧版本之间一些简单的性能比较。这些测试运行在512内存的Intel奔腾IV上,用的是Linux 2.6,Lua编译器使用的是gcc 3.3。Lua 4.0即没有使用基于寄存器的虚拟器,也没有对table数组进行优化。Lua 5'是没有实现table数组优化,尾调用,动态栈(依赖于协程)的Lua 5.0版本;Lua 5'就是在Lua 4.0上多了基于寄存器的虚拟机。
我们所有的测试例子都来自于 The Great Computer Language Shootout [2], 除了第一个sum外,这个例子就是简单的将1循环的加到n。第一个例子在虚拟机上花费了很多的时间。它显示的新的虚拟机比旧的虚拟机快了不止一倍。其他的测试针对于另外的功能(函数调用,table/数组访问,等等),因此对虚拟机的优化对总时间影响不是很大。在使用数组的例子中(sieve,heapsort和matrix),新的数组和虚拟机的共同优化的作用下,测试时间减少了40%。
Lua 5.0的完整的源码可以通过http://www.lua.org/source/5.0进行浏览。
感谢
在闭包实现过程中Edgar Toernig提供了一个关键的建议。Thatcher Ulrich在Lua 4.0中,实现了早期的协程。为我们实现Lua 5.0中的协程提供了实际和理论的依据。作者部分的赞助来自于CNPq, FINEP, 和微软研究。