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