# lua_on_lua **Repository Path**: ddmm0927/lua_on_lua ## Basic Information - **Project Name**: lua_on_lua - **Description**: lua_on_lua 是一个完全用 Lua 语言编写的 Lua 5.3 虚拟机实现。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2025-11-03 - **Last Updated**: 2026-01-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: Lua ## README # Lua-on-Lua [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 项目仓库地址:[https://gitee.com/ddmm0927/lua_on_lua](https://gitee.com/ddmm0927/lua_on_lua) ## 简介 Lua-on-Lua 是一个使用纯 Lua 语言实现的 Lua 虚拟机项目。该项目不仅能执行 Lua 代码,还提供了一个控制流图(Control Flow Graph, CFG)分析工具,可以将 Lua 字节码可视化为图形化的控制流结构,帮助开发者更好地理解程序执行流程。 本项目旨在为对 Lua 语言内部实现机制感兴趣的学习者提供一个清晰、可运行的参考实现,涵盖了词法分析、语法解析、编译优化、虚拟机执行等核心概念。 ## 核心功能 - ✅ 部分的 Lua 5.2 虚拟机实现 - ✅ Lua 源码到字节码的编译器 - ✅ 字节码解释执行引擎 - ✅ 控制流图(CFG)分析与可视化 ## 项目结构 ``` src/ ├── Main.lua # 主程序入口 ├── CfgTest.lua # CFG 分析测试用例 ├── lua/ │ ├── cfg/ # 控制流图分析模块 │ │ ├── BasicBlock.lua │ │ ├── CfgState.lua │ │ ├── ControlFlowGraph.lua │ │ ├── Edge.lua │ │ ├── EdgeType.lua │ │ └── Instruction.lua │ ├── io/ # IO 类库(仿 Java IO) │ │ ├── FileInputStream.lua │ │ ├── FileOutputStream.lua │ │ ├── BufferedInputStream.lua │ │ ├── DataInputStream.lua │ │ ├── DataOutputStream.lua │ │ ├── PrintStream.lua │ │ └── ... │ ├── lang/ # 核心语言支持 │ │ ├── Class.lua │ │ └── ... │ ├── util/ # 工具类库 │ │ ├── Stack.lua │ │ └── StringUtils.lua │ └── vm/ # 虚拟机核心实现 │ ├── compiler/ # 编译器组件 │ ├── Globals.lua │ ├── Lua.lua │ ├── Prototype.lua │ └── ... ``` ## 效果展示 使用控制流图分析功能可以生成 Lua 程序的控制流图,下面是一个示例: ![控制流图效果展示](out.png) 图中展示了 Lua 代码的控制流结构,其中: - 矩形节点代表基本块,包含一系列顺序执行的指令 - 黑色实线箭头表示顺序执行路径 - 红色虚线箭头表示跳转路径(条件分支、循环等) ## 快速开始 ### 环境要求 - Lua 5.3 或更高版本 ### 基本用法 #### 1. Lua 字节码编译与保存 ```lua -- 将 Lua 源代码编译为字节码并保存为 .luac 文件 local Globals = require('lua.vm.Globals') local FileOutputStream = require('lua.io.FileOutputStream') local DumpState = require('lua.vm.compiler.DumpState') local LuaCompiler = require('lua.vm.compiler.LuaCompiler') local LuaLoader = require('lua.vm.compiler.LuaLoader') local workDir = './' local inputPath = workDir .. 'test.lua' local outputPath = workDir .. 'test.luac' local globals = Globals:new() globals:installCompiler(LuaCompiler) globals:installLoader(LuaLoader) local f = globals:loadfile(inputPath) local p = f:checkClosure().p local fos = FileOutputStream:new(outputPath) DumpState:dump(p, fos) fos:close() ``` #### 2. 控制流图分析 ```lua -- 分析 Lua 字节码并生成 DOT 格式的控制流图 local Globals = require('lua.vm.Globals') local LuaCompiler = require('lua.vm.compiler.LuaCompiler') local CfgState = require('lua.cfg.CfgState') local ByteArrayInputStream = require('lua.io.ByteArrayInputStream') local FileOutputStream = require('lua.io.FileOutputStream') local src = [[ -- 测试 if, for, while, goto 的 Lua 代码 x = 10 y = 0 z = 5 -- if 语句测试 if x > 5 then y = 1 elseif x == 5 then y = 2 else y = 3 end -- for 循环测试 sum = 0 for i = 1, 10 do sum = sum + i if i == 5 then break end end -- while 循环测试 counter = 0 while counter < 5 do counter = counter + 1 if counter == 3 then goto skip_three end :: continue :: end -- goto 测试 :: skip_three :: z = z * 2 -- 嵌套控制结构测试 for j = 1, 3 do k = 0 while k < 2 do if j == 2 and k == 1 then goto end_loop end k = k + 1 end end :: end_loop :: result = x + y + z + sum + counter -- 最终的复杂控制流 if result > 50 then for m = 1, 3 do n = 0 while n < m do if n == 1 then goto next_iteration end :: next_iteration :: n = n + 1 end end end ]] local workDir = './' local bis = ByteArrayInputStream:new(src:toByteArray()) local globals = Globals:new() globals:installCompiler(LuaCompiler) local p = globals:loadPrototype(bis, 'test.lua', 't') bis:close() local state = CfgState:new(p.code) local g = state:analyze() local fos = FileOutputStream:new(workDir .. 'cfg.dot') fos:writeString(g:toDotString()) fos:close() -- 使用 Graphviz 生成图像: dot -Tpng cfg.dot -o cfg.png ``` ## 开发说明 ### 项目特点 1. **纯 Lua 实现**:所有代码均使用 Lua 编写,无外部依赖 2. **模块化设计**:清晰的模块划分,便于理解与扩展 3. **教学友好**:代码注释详细,结构清晰,适合学习研究 4. **功能完整**:实现了完整的 Lua 虚拟机功能和 CFG 分析工具 ### 代码示例 项目中的 [Main.lua](./Lua-on-Lua/src/Main.lua) 提供了一个完整的使用示例,展示了如何: - 编译 Lua 源代码为字节码 - 保存字节码到文件 - 进行控制流图分析 - 输出分析结果 ## 许可证 本项目采用 MIT 许可证,但有特殊限制: - 仅供个人学习和研究使用 - 严禁任何形式的商业用途 - 禁止对源码进行修改或二次开发 详细信息请参阅 [LICENSE](LICENSE) 文件。 ## 免责声明 本项目仅供学习交流使用,作者不对因使用本项目可能造成的任何后果负责。 交流群:991065351