有人可以解释Lua的口译员,为什么这么快?

ASt*_*ser 3 lua interpreter language-design

我一直在查看Lua独立解释器的源代码,到目前为止我还没有能够理解它.

也许我的谷歌搜索技能已经磨损,但我无法找到一个很好的解释,它是如何工作的.Lua的代码似乎针对性能进行了优化,而不是可读性.

lhf*_*lhf 6

速度感知有两个来源:脚本编译和脚本执行.

脚本编译使用递归下降解析器与优先表达式解析器相结合.见http://www.lua.org/source/5.1/lparser.c.html.

脚本执行解释虚拟机的指令.这台机器很快,因为它专门用于Lua的语义,也因为它是一个基于寄存器的虚拟机,比早期版本的Lua中使用的基于堆栈的虚拟机更快.见http://www.lua.org/source/5.1/lopcodes.h.html.


RBe*_*eig 6

作为一个广泛的概述,Lua核心通过首先将源文本编译为称为字节码的中间形式来操作,然后由解释器执行.对字节码的编译部分地通过仅执行昂贵的词法和语法分析来提高性能,并且部分地通过提供在没有编译阶段将极难执行的优化的机会来提高性能.字节码是寄存器虚拟机的机器语言.它被设计为与Lua的语义很好地对应,并且易于解释.

独立可执行文件只是加载Lua核心,对任何在命名脚本之前生效,编译,加载和执行命名脚本的选项(例如-l-e)起作用,并以通常的方式将状态返回给操作系统.

因此,错误被一致地处理,lua.c除了创建Lua状态pmain而不是仅仅执行它之外,所有实际工作的委托都是一个混乱main.这允许pmain在受保护的上下文中调用,以便它捕获的错误将被捕获而不是导致异常终止main.

虽然Lua核心的来源不明确,但它的记录非常清楚.它确实需要在编译器设计,语言设计,虚拟机和相关主题方面有相当多的背景才能真正理解它.

关于语言,实现和应用的学术论文很多.这些将提供关于为何做出某些决定的信息的金矿,在某些情况下,后来经过修订.

Lua的用户的Wiki,有专门的语言的几个特点,以及许多关于它的使用和推广内容的内部机制的探索某些页面.

最后,我要提的是,源代码的标准库模块是很多更方便的是,源核心.它将始终提供将外部库连接到Lua的技术的可靠示例.