有人能解释一下Lua';s的翻译,为什么这么快?

有人能解释一下Lua';s的翻译,为什么这么快?,lua,interpreter,language-design,Lua,Interpreter,Language Design,我一直在看源代码,到目前为止我还没能找到它 也许我的谷歌搜索技能已经过时了,但我还没有找到一个好的解释来解释它是如何工作的。Lua的代码似乎针对性能而不是可读性进行了优化 对速度的感知有两个来源:脚本编译和脚本执行 脚本编译使用递归下降解析器和优先表达式解析器相结合。看 脚本执行解释虚拟机的指令。这台机器之所以快,是因为它专门用于Lua的语义,也是因为它是基于寄存器的虚拟机,比Lua早期版本中使用的基于堆栈的虚拟机要快。参见。作为一个概括的概述,Lua核心首先将源文本编译成一种称为字节码的中间形

我一直在看源代码,到目前为止我还没能找到它


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

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

脚本编译使用递归下降解析器和优先表达式解析器相结合。看


脚本执行解释虚拟机的指令。这台机器之所以快,是因为它专门用于Lua的语义,也是因为它是基于寄存器的虚拟机,比Lua早期版本中使用的基于堆栈的虚拟机要快。参见。

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

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

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

虽然Lua核心的来源不清楚,但它的文档记录非常充分。它确实需要相当多的编译器设计、语言设计、虚拟机和相关主题的背景知识才能真正深入地理解它

关于这种语言、它的实现和它的应用已经有了很多的研究。这些信息将为我们提供一座金矿,告诉我们为什么会做出某些决定,在某些情况下,这些决定后来会被修改

这本书有几页致力于探索语言的几个特征的内部机制,还有很多关于它的使用和扩展的内容


最后,我要提到的是,标准库模块的源代码比核心模块的源代码更容易访问。它将始终提供将外部库连接到Lua的技术的可靠示例

你知道这仅仅是REPL,而不是编译器和字节码解释器的东西吗?就C代码而言,这看起来相当可读。它是低级的,但这是C语言固有的,它很简洁,但这没关系(甚至可以说是可取的)。请参阅作者对虚拟机的解释,以及基于Lua 5寄存器的虚拟机如何以及为什么可以相当快地运行。