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通过物理寄存器存储机器指令。指令读取速度明显要比内存读取要块很多。
网友评论