Lua虚拟机
解释性脚本语言与编译型语言区别:
1:由于每个脚本语言都有自己的一套字节码,与具体的硬件平台无关,所以不用修改脚本代码,就能运行在各个平台上。硬件、软件平台的差异都由语言自身的虚拟机解决
2:由于脚本语言的字节码需要由虚拟机执行,而不像机器代码这样能够直接执行,所以运行速度比编译型语言差不少
Lua使用的是基于寄存器的虚拟机实现方式,其中很大的原因是它的设计目标之一就是尽可能高效。
总结一下,实现一个脚本语言的解释器,其核心问题如下:
- 设计一套字节码,分析源代码文件生成字节码。
- 在虚拟机中执行字节码
- 如何在整个执行过程中保存整个执行环境
原理在于使用了叫CIL(Common Intermediate Language通用中间语言,也叫做MSIL微软中间语言)的一种代码指令集,
CIL可以在任何支持CLI(Common Language Infrastructure,通用语言基础结构)的环境中运行,就像.NET是微软对这一标准的实现,Mono则是对CLI的又一实现。
由于CIL能运行在所有支持CLI的环境中,例如刚刚提到的.NET运行时以及Mono运行时,也就是说和具体的平台或者CPU无关。
具体过程是:C#或者VB这样遵循CLI规范的高级语言,先被各自的编译器编译成中间语言:IL(CIL),
等到需要真正执行的时候,这些IL会被加载到运行时库,也就是VM中,由VM动态的编译成汇编代码(JIT)然后在执行
虚拟机需要完成如下工作:
- 将源代码编译成虚拟机可以识别执行的字节码
- 为函数调用准备调用栈
- 内部维持一个IP(指令指针)来保存下一个将执行的指令地址。
- 模拟一个CPU的运行:循环拿出