我一直在查看Lua 的独立解释器的源代码,但到目前为止我还无法理解它。
也许我的谷歌搜索技能已经用完了,但我无法找到一个很好的解释来解释它是如何工作的。Lua 的代码似乎针对性能而不是可读性进行了优化。
我一直在查看Lua 的独立解释器的源代码,但到目前为止我还无法理解它。
也许我的谷歌搜索技能已经用完了,但我无法找到一个很好的解释来解释它是如何工作的。Lua 的代码似乎针对性能而不是可读性进行了优化。
速度感知有两个来源:脚本编译和脚本执行。
脚本编译使用递归下降解析器与优先表达式解析器相结合。见http://www.lua.org/source/5.1/lparser.c.html。
脚本执行解释虚拟机的指令。这台机器速度很快,因为它专门用于 Lua 的语义,还因为它是一个基于寄存器的虚拟机,比早期版本的 Lua 中使用的基于堆栈的虚拟机要快。见http://www.lua.org/source/5.1/lopcodes.h.html。
概括地说,Lua 核心首先将源文本编译成称为字节码的中间形式,然后由解释器执行。编译为字节码部分是通过只执行一次昂贵的词法和语法分析来提高性能,部分是通过提供优化的机会,而这些优化如果没有编译阶段就很难执行。字节码是寄存器虚拟机的机器语言。它被设计成很好地对应 Lua 的语义,并且易于解释。
独立的可执行文件只是加载 Lua 核心,作用于在命名脚本之前生效的任何选项(例如-l
和),编译、加载和执行命名脚本,并以通常的方式将状态返回给操作系统。-e
为了始终如一地处理错误,其中的一个混淆lua.c
是除了创建 Lua 状态到函数之外的所有实际工作的委派,pmain
而不是仅仅在main
. 这允许pmain
在受保护的上下文中调用,以便捕获它抛出的错误,而不是导致main
.
虽然 Lua 核心的来源是模糊的,但它有很好的记录。它确实需要相当多的编译器设计、语言设计、虚拟机和相关主题的背景才能真正深入理解它。
已经有大量关于该语言、其实现和应用的学术论文。这些将提供有关为什么做出某些决定的信息的金矿,并且在某些情况下,后来进行了修订。
Lua 用户的Wiki有一些页面专门用于探索该语言几个特性的内部机制,以及许多关于其使用和扩展的内容。
最后,我会提到标准库模块的源代码比核心源代码更容易访问。它将始终提供将外部库连接到 Lua 的可靠技术示例。