Lua chunk文件结构
1.lua执行经过:
xx.lua源码文件-------》执行(lua虚拟机)
隐式调用luac编译器

我们可以直接用luac命令去编译lua源码文件,然后用编译后的文件运行在lvm(lua虚拟机),具体过程如下:
显示调用luac编译器

2.简要说明
lua编译器是以函数为单位进行编译,每一个函数都会被Lua编译器编译为一个内部结构,这个结构叫“原型”。原型主要包括6个部分:函数基本信息(包括参数数量、局部变量数量等)、字节码、常量表、upvalue表、调试信息、子函数原型列表。由此可知,函数原型是一种递归结构,并且Lua源码中函数的嵌套关系会直接反映在编译后的原型里。
lua编译器会自动为我们的脚步添加一个main函数(即主函数),并且把整个程序都放进这个函数里,然后再以它为起点进行编译,那么自然就把整个程序都编译出来了。这个主函数不仅是编译的起点,也是未来Lua虚拟机解释执行程序时的入口。
如xx.lua源码文件中 就一句代码
print("hello world!")
那么经过Lua编译器加工之后就编程了下面这样:
function main()
print("hello world!")
return
end
3.分析luac编译器编译后的.out文件结构组成(lua5.3版本,每个版本略显不同!具体可参考源码中dump和undump文件)
总体结构图如下:

header头部结构

Java代码头
// chunk头
private static class Header{
private static final byte[] LUA_SIGNATURE = {0x1b, 'L', 'u', 'a'}; // 头 ESC/l/u/a
private static final int LUAC_VERSION = 0x53; // 版本
private static final int LUAC_FORMAT = 0; // 格式
private static final byte[] LUAC_DATA = {0x19, (byte) 0x93, '\r', '\n', 0x1a, '\n'}; // 格式数据
private static final int CINT_SIZE = 4; // cint占字节数
private static final int CSIZET_SIZE = 8; // size_t占字节数
private static final int INSTRUCTION_SIZE = 4; //Lua指令占字节数
private static final int LUA_INTEGER_SIZE = 8; //Lua整数占字节数
private static final int LUA_NUMBER_SIZE = 8; // Lua浮点数占字节数
private static final int LUAC_INT = 0x5678; // 测试字节大小端
private static final double LUAC_NUM = 370.5; // 测试浮点数
}
Lua chunk文件结构的更多相关文章
- lua module环境探秘
module 作用 module (name [, ···]) Creates a module. If there is a table in package.loaded[name], this ...
- Lua 5.1 参考手册
Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes 云风 译 www.codingno ...
- C/C++与lua实现互调
1,在lua脚本中调用C/C++代码中的函数 在C++中定义函数时必须以lua_State为参数, 以int为返回值才能被Lua所调用. /* typedef int (*lua_CFunction) ...
- Lua 常用函数 一
lua_getallocf lua_Alloc lua_getallocf (lua_State *L, void **ud); 返回给定状态机的内存分配器函数.如果 ud 不是 NULL ,Lua ...
- redis源码学习之lua执行原理
聊聊redis执行lua原理 从一次面试场景说起 "看你简历上写的精通redis" "额,还可以啦" "那你说说redis执行lua脚本的原理&q ...
- lua解析赋值类型代码的过程
我们来看看lua vm在解析下面源码并生成bytecode时的整个过程: foo = "bar" local a, b = "a", "b" ...
- lua解析脚本过程中的关键数据结构介绍
在这一篇文章中我先来介绍一下lua解析一个脚本文件时要用到的一些关键的数据结构,为将来的一系列代码分析打下一个良好的基础.在整个过程中,比较重要的几个源码文件分别是:llex.h,lparse.h.l ...
- lua解释执行脚本流程
#include "lua.hpp" #include <iostream> using namespace std; #pragma comment(lib, &qu ...
- 使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件Lua脚本引擎介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
随机推荐
- vue中使用iview组件库实现图片的上传
vue文件如下: iview中Upload 属性详情 https://www.iviewui.com/components/upload js文件 :
- 使用vue脚手架搭建项目并将px自动转化为rem
一.安装node.js环境 二.node.js安装完成后使用npm安装vue脚手架vue-cli和安装webpack,我这里用cnpm cnpm i @vue/cli -g //全局安装脚手架3.0 ...
- pc,h5端动态设置style
<p class="plan" :style="'width:' + unit"></p>
- Vue props用法详解
Vue props用法详解 组件接受的选项之一 props 是 Vue 中非常重要的一个选项.父子组件的关系可以总结为: props down, events up 父组件通过 props 向下传递数 ...
- Protobuf的上手使用
这里不赘述Json和Protobuf的比较和区别,只谈谈简单的使用 1.在Client-Server交互的过程中,都是以二进制数据传输,所以Json和Protobuf在使用的过程中,都存在序列化和反序 ...
- iview表单数字验证
sort: [ {required: true, message: '请填写栏目排序', trigger: 'blur'}, {type: 'number', message: '请输入数字', tr ...
- Jupyter Notebook环境安装
Jupyter Notebook环境安装 一.什么是jupyter Notebook 1.简介 Jupyter Notebook 是基于网页的用于交互计算机的应用程序器可被应用程序. 能让用户将说明文 ...
- ViewBag---MVC3中 ViewBag、ViewData和TempData的使用和差别-------与ViewBag+Hashtable应用例子
ViewBag 在MVC3開始.视图数据能够通过ViewBag属性訪问.在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),Vi ...
- pom中添加插件打包上传源码
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> ...
- 源码解读之File
文件和目录路径名的抽象表示形式. 我们知道,对于不同的操作系统,文件路径的描述是不同的 比如 windows平台:用\ linux平台:用/ 四个构造方法 API: 文件自身属性读取 创建 ...