lua虚拟机字节码修改_如何实现Lua虚拟机

准确来说,这是一篇十分粗糙甚至有些跑题的阅读笔记(原书手机端1143页)源自张秀宏编写的《自己动手实现Lua:虚拟机、编译器和标准库》。有兴趣的可以自行阅读

一、二进制chunk

Lua是一门以高效率著称的脚本语言,为了达到较高的执行效率,Lua从1.0版本就开始内置了虚拟机,也就是说,Lua脚本并不是直接被Lua解释器解释执行,而是类似Java语言那样,先由Lua编译器编译为字节码,然后再交给Lua虚拟机执行。Lua字节码需要一个载体,这个载体就是二进制chunk.

1.什么是二进制chunk

在Lua的行话里,一段可以被Lua解释器解释执行的代码就叫作chunk,Lua并不是直接解释执行chunk,而是先由编译器编译成内部结构(其中包含字节码等信息),然后由虚拟机执行字节码。这种内部结构在Lua中就叫作预编译chunk,由于采用了二进制格式,所以也叫作二进制chunk。

2.Luac命令介绍

Luac命令主要有两个用途:第一,作为编译器,把Lua源文件编译成二进制chunk文件;第二,作为反编译器,分析二进制chunk,将信息输出到控制台。

2.二进制chunk格式

(1)Lua二进制本质上也是一个字节流。二进制chunk格式没有考虑跨平台的需求,Lua官方实现的做法比较简单:编译Lua脚本时,直接按照本机的大小端方式生成二进制chunk文件,当加载二进制chunk文件时,会探测被加载二进制文件的大小端方式,如果和本机不匹配,就拒绝加载。

(2)编译Lua脚本时,直接按照当时的Lua版本生成二进制chunk文件,当加载二进制chunk文件时,会检测被加载文件的版本号,如果和当前Lua版本不匹配,则拒绝加载。

(3)把Lua脚本预编译成二进制chunk的主要目的是为了获得更快的加载速度。

3.数据类型

在讨论二进制chunk格式时,我们称被编码为一个或多个字节的信息单位为数据类型,二进制chunk内部使用的数据类型大致可以分为数字、字符串和列表三种。

(1)数字类型主要包括字节、C语言整型,C语言size_t类型,Lua整数、Lua浮点数五种。

(2)字符串在二进制chunk里,其实就是一个字节数组。因为字符串长度是不固定的,所以需要把字节数组的长度也记录到二进制chunk里。

(3)在二进制chunk内部,指令表、常量表、子函数原型表等信息都是按照列表的方式存储的。

4.头部

头部总共占有约30个字节(因平台而异),其中包含签名、版本号、格式号、各种整型类型占用的字节数,以及大小端和浮点数格式识别信息。

(1)签名:Lua二进制chuk的签名是四个字节,分别是ESC、L、u、a的ASCII码 。用十六进制表示为0X1B4C7561,签名主要用来快速识别文件格式。

(2)版本号:签名之后的一个字节,记录二进制chunk文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值