游戏开发工具

Lua运行原理

12 篇文章53 次收藏

Lua是解释型语言,代码在运行时才被解释器一行行动态翻译和执行:

编译:

Lua运行代码时,Lua脚本并不是直接被Lua解释器解释(“luac”)执行,而是类似Java语言,先由Lua编译器编译为字节码,然后再交给Lua虚拟机执行。

Lua字节码需要一个载体,这个载体就是二进制chunk,虚拟机的指令(“opcode”)

Lua脚本跑在Lua虚拟机中,将Lua虚拟机源代码整合到动态库供Unity使用,然后在C#中启动虚拟机跑Lua代码,此外动态库还提供一些支持代码提供给Lua和Unity的交互,这部分支持代码就是ToLua、Xlua所做的事情

连接:

Lua,编译阶段之后仅仅需要一个“打包”,真正的连接过程都是在运行之前才根据符号(如类名、模块名等等)被完成的。对lua来说,许多情况下,栈中保存着一个“将要被调用的函数的引用”,执行这个函数 就是把这个引用交给虚拟机,并压入参数,然后通知虚拟机去调用即可。这个过程比C/C++的“连接” 要简化很多,但功能和结果是一致的,都是使得当前代码获知被调用函数的地址。

目前绝大部分的高级语言,尤其是脚本语言,都是在运行期进行连接的。

总结:

Lua也需要编译和连接。编译可以单独完成,可以在载入源代码的时候才完成。连接通常在运行期(调用之前 或者模块加载的时候)被完成。

如下图所示:程序员编码lua文件 -> 语法词法分析生成Lua的字节码文件(对应Lua工具链的Luac.exe) -> Lua虚拟机解析字节码,并执行其中的指令集->输出结果。

1.png


Lua优点

1、Lua性能高

在解释型语言中,Lua是性能很高的,Lua常常被拿来和JS做对比,但是Lua比JS的好处是,性能高,而且语言简单,容易上手。 LuaJIT还可以执行编译后的Lua字节码,速度更快。

2、Lua不限制编程范式

很多语言对类提供了语言一级的支持,Lua并没有这么做。 Lua是基于原型的语言(prototype-based language)在Lua里非常容易地模拟面向对象

3、Table是Lua里最基本的、最常用的、几乎唯一的、几乎万能的数据结构。