摘要:生成跳转指令时并不确定最后将跳转到哪里去(因为往往还未解析到目标代码段)。因此这里会用到编译原理中一个叫“回填”的技术。相关的指令: typedef enum { /* name args description */ // ...... OP_LOADBOOL,/* A B C R(A) := (
阅读全文
随笔分类 - Lua源码
摘要:生成跳转指令时并不确定最后将跳转到哪里去(因为往往还未解析到目标代码段)。因此这里会用到编译原理中一个叫“回填”的技术。相关的指令: typedef enum { /* name args description */ // ...... OP_LOADBOOL,/* A B C R(A) := (
阅读全文
摘要:在下面的指令中选择power解释,其他指令类似 typedef enum { /* name args description */ //...... OP_ADD,/* A B C R(A) := RK(B) + RK(C) */ OP_SUB,/* A B C R(A) := RK(B) - R
阅读全文
摘要:在下面的示例中,(3)的prev成员指向(2),(2)的prev成员指向(1),(1)的prev为NULL。 g = 10 -- (1) 全局环境的 FuncState: 其 prev 为 NULL function fun () -- (2) fun 的 FuncState: 其 prev 指向(
阅读全文
摘要:6.3.1 创建表 创建一个空表,测试代码为: local p = {} --filename 使用ChunkSpy反编译出来的结果: ; function [0] definition (level 1) ; 0 upvalues, 0 params, 2 stacks .function 0 0
阅读全文
摘要:6.1 Lua词法 语言的解析一般是两遍遍历的过程,第一遍生成AST,第二遍将AST翻译为字节码。 Lua使用一遍扫描代码文件的方式生成字节码,以加快解释执行的速度。但缺点是代码比较难以理解。如 dostat -> DO block END 函数 -> 终结符 语法块 终结符 6.2 赋值类指令 -
阅读全文
摘要:5.1 Lua执行过程概述 脚本语言处理代码生成字节码,让虚拟机执行。硬件平台的差异由虚拟机解决,因此相同的代码可以运行在不同的操作系统、硬件平台上。 Lua是基于寄存器虚拟机的编程语言,这里的寄存器并不是物理意义上的寄存器,而是某个物理内存地址。 相比于基于栈的虚拟机,Lua只需一条指令即可执行加
阅读全文
摘要:使用表来统一表示Lua中的一切数据,是Lua区分其他语言的一个特色。 Lua表分为数组(索引从1开始)和散列表两个部分,可以模拟其他各种数据--数组、链表、树等。 4.1 表的数据结构 //llimits.h:27 typedef unsigned char lu_byte; //ltm.h:18
阅读全文
摘要:3.1 概述 字符串在Lua中是不可变的数据。每当使用不存在的字符串时,就会创建一份新的数据,创建之后是不可更改的。 3.2 字符串实现 //luaconf.h:595 // 用于8字节对齐 #define LUAI_USER_ALIGNMENT_T union { double u; void *
阅读全文
摘要://主要有以下几种数据类型 //lua.h:72 #define LUA_TNONE (-1) // 无 #define LUA_TNIL 0 // 空 #define LUA_TBOOLEAN 1 // 布尔 #define LUA_TLIGHTUSERDATA 2 // 指针 void* 使用者
阅读全文
摘要:1.1 前世今生 Lua于1993年诞生于巴西的Tecgraf实验室,Tecgraf主要专注于图形图像相关的工具研发。 (1)可移植性:使用clean C编写的解释器。 (2)良好的嵌入性:提供丰富的API供宿主与Lua脚本之间进行通信和交换数据。 (3)非常小的尺寸:Lua5.1源码只有一万多行。
阅读全文
|