美文网首页
什么是chunk?

什么是chunk?

作者: APP4x | 来源:发表于2020-09-03 19:30 被阅读0次
    本文借鉴《自己动手实现Lua:虚拟机、编译器和标准库》,算是对自己学习的总结,也希望分享下所学知识~~

    什么叫Chunk?
    一段可以被Lua解释器解释执行的代码就叫做chunk
    可以很小,小到只有一两条语句;可以很大,大到包含成千上万条语句喝复杂的函数定义

    Lua为了提高效率,并不是直接解释执行chunk,先由编译器编译成内部结构(其中包括字节码等信息),再由虚拟机执行字节码

    这种内部结构叫做:
    **预编译(Precompiled)chunk,由于采用了二进制格式,也叫做二进制(binary)chunk
    (预编译并不会加快脚本执行的速度,但是预编译可以加快脚本的加载速度)
    (一般不需要关心二进制chunk,因为lua解释器会在内部进行编译)

    如何把Lua源文件编译成chunk文件?

    print("Hello World");
    

    调用 luac 命令就可以编译指定的 Lua 源文件,成功后会出现 luac.out 文件(里面就是对应的二进制文件)
    常用命令如下:

    luac hello_world.lua             #单纯的生成
    luac -o hw.luac hello_world.lua  #指定名称
    luac -s hello_world.lua          #不包含调试信息
    luac -p hello_world.lua          #只进行语法检查
    

    Lua编辑器会以函数为单位进行编译,每一个函数都会被Lua编译器编译为一个内部结构

    这个结构叫做:原型(Prototype)
    主要包含六个部分:
    1.函数基本信息(参数数量、局部变量数量)
    2.字节码
    3.常量表
    4.Upvalue表(upValue 是局部变量?)
    5.调试信息
    6.子函数原型列表(可知函数原型是一种递归结构,lua源码中的函数的嵌套关系会直接反映在编译后的原型里)

    如果没有函数,Lua编辑器会自动为脚本生成一i个main函数,并把整个程序都放进这个函数里,再以它为起点进行编译

    function main(...)
      print("")
      return
    end
    

    把主函数编译成函数原型后,Lua编译器会给它再添加一个头部(Header)
    然后一起dump成luac.out文件

    如图所示:

    相关文章

      网友评论

          本文标题:什么是chunk?

          本文链接:https://www.haomeiwen.com/subject/lnlncktx.html