有人能解释一下Lua的解释器为什么如此快吗?

我一直在查看Lua独立解释器的源代码,但我目前还没有完全理解它。

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

点赞
用户107090
用户107090

有两种感知速度的来源:脚本编译和脚本执行。

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

脚本执行将指令解释给虚拟机。这台机器之所以快速,是因为它专门用于Lua的语义,并且还因为它是基于寄存器的虚拟机,这比早期版本的Lua中使用的基于堆栈的虚拟机更快。请参见http://www.lua.org/source/5.1/lopcodes.h.html

2013-11-13 19:15:33
用户68204
用户68204

Lua 的核心操作是首先将源代码文本编译成中间形式,称为字节码,然后由解释器执行。将代码编译成字节码可以提高性能,部分原因是只需执行一次昂贵的词法和语法分析,并且提供了进行优化的机会;如果没有编译阶段,这些优化将极为困难。字节码是一个寄存器虚拟机的机器语言。它的设计很好地符合 Lua 的语义,并且易于解释。

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

为了处理错误,lua.c 中的一个混淆之处在于除了创建 Lua 状态之外,所有实际工作都委托给函数 pmain 而不是仅在 main 中执行。 这允许在受保护的上下文中调用 pmain,从而可以捕捉到它抛出的错误,而不会导致 main 的异常终止。

虽然 Lua 核心的源代码比较晦涩,但其文档非常详细。要深入了解它,需要具备相当的编译器设计、语言设计、虚拟机等背景知识。

已经有许多学术论文涉及到该语言、其实现和应用。这些论文将提供有关某些决策为什么被做出,并在某些情况下被修改的宝贵信息。

Lua 用户 Wiki 有一些页面专门探讨该语言几个特性的内部机制,以及有关其使用和扩展的大量内容。

最后,我要提到标准库模块的源代码比核心源代码更易于理解。它将始终提供与将外部库与 Lua 进行接口的技巧的可靠示例。

2013-11-13 19:28:36