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文件结构的更多相关文章

  1. lua module环境探秘

    module 作用 module (name [, ···]) Creates a module. If there is a table in package.loaded[name], this ...

  2. Lua 5.1 参考手册

    Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes 云风 译 www.codingno ...

  3. C/C++与lua实现互调

    1,在lua脚本中调用C/C++代码中的函数 在C++中定义函数时必须以lua_State为参数, 以int为返回值才能被Lua所调用. /* typedef int (*lua_CFunction) ...

  4. Lua 常用函数 一

    lua_getallocf lua_Alloc lua_getallocf (lua_State *L, void **ud); 返回给定状态机的内存分配器函数.如果 ud 不是 NULL ,Lua ...

  5. redis源码学习之lua执行原理

    聊聊redis执行lua原理 从一次面试场景说起   "看你简历上写的精通redis" "额,还可以啦" "那你说说redis执行lua脚本的原理&q ...

  6. lua解析赋值类型代码的过程

    我们来看看lua vm在解析下面源码并生成bytecode时的整个过程: foo = "bar" local a, b = "a", "b" ...

  7. lua解析脚本过程中的关键数据结构介绍

    在这一篇文章中我先来介绍一下lua解析一个脚本文件时要用到的一些关键的数据结构,为将来的一系列代码分析打下一个良好的基础.在整个过程中,比较重要的几个源码文件分别是:llex.h,lparse.h.l ...

  8. lua解释执行脚本流程

    #include "lua.hpp" #include <iostream> using namespace std; #pragma comment(lib, &qu ...

  9. 使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件Lua脚本引擎介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

随机推荐

  1. java第三次面试总结

    这次面试是二面,由于自己的经验不足,面试的结果不是很令人满意,所以与这家公司失之交臂,在这里记录一下经历,吸取教训. 之前的一面是笔试+面试,面试是主管,今天的面试是总监.在前台招待我的时候,还跟我说 ...

  2. React学习:状态(State) 和 属性(Props)

    State 与 Props 区别props 是组件对外的接口,state 是组件对内的接口.组件内可以引用其他组件,组件之间的引用形成了一个树状结构(组件树),如果下层组件需要使用上层组件的数据或方法 ...

  3. 增强学习--TRPO算法

    理论部分参考 推导 数学上的分析 代码

  4. UI5-技术篇-JS函数eval动态执行

    <html lang="en"> <head> <meta charset="utf-8" /> <title> ...

  5. 【MySQL】你以为设置了并行复制就降低延迟了?这个你绝对想不到!

    在MySQL官方版本中,为了保证其的高可用性,一般情况我们会采用主从复制的方式来解决.当然,方法很多.而我们今天所要处理的是采用GTID方式并且开了多线程复制后,仍然延迟的情况,糟糕的是,延迟还在不断 ...

  6. Python学习日记(十三) 递归函数和二分查找算法

    什么是递归函数? 简单来说就是在一个函数中重复的调用自己本身的函数 递归函数在调用的时候会不断的开内存的空间直到程序结束或递归到一个次数时会报错 计算可递归次数: i = 0 def func(): ...

  7. 臀部——哑铃&杠铃

  8. 用python实现数据库查询数据方法

    哈喽,好久没来了,最近搞自动化发现了很多代码弯路,特别分享出来给能用到的朋友 因为公司业务的关系,每做一笔功能冒烟测试,我们就要对很多的数据库表中的字段进行校验,当时我就想反正总是要重复的运行这些SQ ...

  9. Needham-Schroeder Scyther工具形式化过程

    1.Needham-Schroeder Public key Protocol 协议的通信认证的过程 顺序图的 1.  A-> S :   A,  B 2. S->A:     {Ks, ...

  10. 基于yum的方式安装Cloudera Manager Agent(使用Mysql 8.0版本)

    基于yum的方式安装Cloudera Manager Agent(使用Mysql 8.0版本) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.选择CDH版本 1>.确认 ...