美文网首页
Lua代码是如何执行的?

Lua代码是如何执行的?

作者: 码上述Andy | 来源:发表于2022-05-09 23:08 被阅读0次

    Lua代码是怎么执行的?

    1.和静态语言的差异?
    2.通过什么执行?
    3.执行的是什么?

    一.解释器VS编译型

    1.解释性(动态)语言与编译型(静态)语言差异
    1.1 解释型语言
    解释型语言在代码执行阶段通过解释器一行行翻译,通过字节码一行行执行。Lua属于动态解释型语言。
    Lua执行的流程主要分为:

    1.Lua脚本先翻译字节码
    2.然后通过虚拟机执行

    ByteCode通过虚拟机执行
    Lua虚拟机核心能力分为:

    1.虚拟寄存器:通过内存层面上的数据结构模拟CPU物理寄存器。
    2.字节码执行

    1.2.编译型语言
    编译型语言通过不同的编译器编译成各CPU架构类型可直接执行的机器码,可以直接供CPU执行。编译后的机器码不需要二次翻译,即为静态语言。比如C/C++语言。编译器最主要职责:1.翻译;2.优化;3.机器码生成。

    1.3.编译的作用

    1.提升程序的远行效率。
    2.尽量小的节省存储空间。

    二.VM及指令执行

    1.VM
    虚拟机相对于物理机,借助于操作系统对物理机器(CPU等硬件)的一种模拟、抽象,主要扮演CPU和内存的作用。
    主要职责:
    执行字节码中的指令,管理全局状态(global_state)、数据栈(StackValue)和函数调用链状态(CallInfo)

    2.指令构成
    指令由4个字节32位组成,以Lua5.4.3为例其中低7位为操作码,后25位为操作数,操作数又分了iABC, iABx, iAsBx, iAx, isJ几种模式。具体指令详见:lopcodes.h/lopcodes.c文件,里面详细列出了各指令的使用模式。

    3.Lua执行流程
    虚拟机类似cpu执行流程取指、译码、执行,Lua通过数据结构来抽象模拟CPU远行的流程,当原型到某个Proto(函数原型,编译生成的产物),通过for (;;)不断去取指,然后匹配Lua虚拟机指令类型,最后执行相关指令。整个过程通过指针pc++来指向下一条指令(Instruction)来不停的获取指令执行。通过断言检查栈的大小,防止过栈顶。具体详见:lvm.c#luaV_execute函数。

    三.总结--执行效率

    1.静态语言前面提到通过各平台类型编译器,最终编译各CPU架构能直接执行的机器码,而Lua属于解释型脚本语言,通过虚拟机执行中间生成的字节码。多了这么一层抽象,效率明显也没有直接执行机器码效率高。
    2.虽然Lua虚拟机也是虚拟寄存器来实现,但我理解是内存层面上的数据结构模拟。相比静态语言是cpu通过物理寄存器存储机器指令。指令读取速度明显要比内存读取要块很多。

    相关文章

      网友评论

          本文标题:Lua代码是如何执行的?

          本文链接:https://www.haomeiwen.com/subject/yluturtx.html