Lua设计与实现
QQ : 1841545843
邮箱 : jiaxx903@163.com
-
Lua特性
- 可移值性
- 良好的嵌入式
- 非常小的尺寸
- Lua的效率很高,是执行最快的脚本语言之一
-
用户可以使用C, C++等语言进行主要功能的开发,而一些需要扩展配置的等会频繁动态变化的部分使用Lua语言来开发。
-
游戏服务器的组织与分工
- C、C++语言实现服务器引擎内核,其中包括最核心的功能,比如网络收发,数据库查询,游戏逻辑主循环等,将这一层简称为引擎层。
- 向引擎层注册一个Lua 主逻辑脚本,当接受到用户数据时,将数据包放到Lua脚本中进行处理,主逻辑脚本主要是一个大的函数表,可以根据收到的协议包的类型,调用相关的函数进行处理,以下简称这一层为脚本层。
- 引擎层向脚本层提供很多的API,能方便额调用引擎层的操作,比如脚本层处理完逻辑后调用引擎层的接口应答数据。
引擎层实现了很功能,脚本层实现了游戏的逻辑玩法。
这个组合框架的优势:
- 编码效率高‘
- 开发效率高
- 对人员素质相对较低
-
Lua4.1.4 MakeFile
# makefile for installing Lua # see INSTALL for installation instructions # see src/Makefile and src/luaconf.h for further customization # == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= # Your platform. See PLATS for possible values. PLAT= none # Where to install. The installation starts in the src and doc directories, # so take care if INSTALL_TOP is not an absolute path. INSTALL_TOP= /usr/local INSTALL_BIN= $(INSTALL_TOP)/bin INSTALL_INC= $(INSTALL_TOP)/include INSTALL_LIB= $(INSTALL_TOP)/lib INSTALL_MAN= $(INSTALL_TOP)/man/man1 # # You probably want to make INSTALL_LMOD and INSTALL_CMOD consistent with # LUA_ROOT, LUA_LDIR, and LUA_CDIR in luaconf.h (and also with etc/lua.pc). INSTALL_LMOD= $(INSTALL_TOP)/share/lua/$V INSTALL_CMOD= $(INSTALL_TOP)/lib/lua/$V # How to install. If your install program does not support "-p", then you # may have to run ranlib on the installed liblua.a (do "make ranlib"). INSTALL= install -p INSTALL_EXEC= $(INSTALL) -m 0755 INSTALL_DATA= $(INSTALL) -m 0644 # # If you don't have install you can use cp instead. # INSTALL= cp -p # INSTALL_EXEC= $(INSTALL) # INSTALL_DATA= $(INSTALL) # Utilities. MKDIR= mkdir -p RANLIB= ranlib # == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE ========= # Convenience platforms targets. PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris # What to install. TO_BIN= lua luac TO_INC= lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp TO_LIB= liblua.a TO_MAN= lua.1 luac.1 # Lua version and release. V= 5.1 R= 5.1.4 all: $(PLAT) $(PLATS) clean: cd src && $(MAKE) $@ test: dummy src/lua test/hello.lua install: dummy cd src && $(MKDIR) $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) $(INSTALL_MAN) $(INSTALL_LMOD) $(INSTALL_CMOD) cd src && $(INSTALL_EXEC) $(TO_BIN) $(INSTALL_BIN) cd src && $(INSTALL_DATA) $(TO_INC) $(INSTALL_INC) cd src && $(INSTALL_DATA) $(TO_LIB) $(INSTALL_LIB) cd doc && $(INSTALL_DATA) $(TO_MAN) $(INSTALL_MAN) ranlib: cd src && cd $(INSTALL_LIB) && $(RANLIB) $(TO_LIB) local: $(MAKE) install INSTALL_TOP=.. none: @echo "Please do" @echo " make PLATFORM" @echo "where PLATFORM is one of these:" @echo " $(PLATS)" @echo "See INSTALL for complete instructions." # make may get confused with test/ and INSTALL in a case-insensitive OS dummy: # echo config parameters echo: @echo "" @echo "These are the parameters currently set in src/Makefile to build Lua $R:" @echo "" @cd src && $(MAKE) -s echo @echo "" @echo "These are the parameters currently set in Makefile to install Lua $R:" @echo "" @echo "PLAT = $(PLAT)" @echo "INSTALL_TOP = $(INSTALL_TOP)" @echo "INSTALL_BIN = $(INSTALL_BIN)" @echo "INSTALL_INC = $(INSTALL_INC)" @echo "INSTALL_LIB = $(INSTALL_LIB)" @echo "INSTALL_MAN = $(INSTALL_MAN)" @echo "INSTALL_LMOD = $(INSTALL_LMOD)" @echo "INSTALL_CMOD = $(INSTALL_CMOD)" @echo "INSTALL_EXEC = $(INSTALL_EXEC)" @echo "INSTALL_DATA = $(INSTALL_DATA)" @echo "" @echo "See also src/luaconf.h ." @echo "" # echo private config parameters pecho: @echo "V = $(V)" @echo "R = $(R)" @echo "TO_BIN = $(TO_BIN)" @echo "TO_INC = $(TO_INC)" @echo "TO_LIB = $(TO_LIB)" @echo "TO_MAN = $(TO_MAN)" # echo config parameters as Lua code # uncomment the last sed expression if you want nil instead of empty strings lecho: @echo "-- installation parameters for Lua $R" @echo "VERSION = '$V'" @echo "RELEASE = '$R'" @$(MAKE) echo | grep = | sed -e 's/= /= "/' -e 's/$$/"/' #-e 's/""/nil/' @echo "-- EOF" # list targets that do not create files (but not all makes understand .PHONY) .PHONY: all $(PLATS) clean test install local none dummy echo pecho lecho # (end of Makefile)
Lua源码大体分为三部分:虚拟机核心, 内嵌库及其解释器,编译器
Lau解释器中内部模块对外提供的接口,数据结构都以“lau模块简称_“为前缀,而供外部调用的API使用”Lua_“前缀
虚拟机核心文件相关列表
文件名 作用 对外接口前缀 lapi.c C语言接口 lua_ lcode.c 源码生成器 luaK_ ldebug.c 调试库 luaG_ ldo.c 函数调用及栈管理 luaD_ ldump.c 序列化预编译的Lua字节码 lfunc.c 提供操作函数原型及闭包的辅助函数 luaF_ lgc.c GC luaC_ llex,c 此法分析 luaX_ lmem.c 内存管理 luaM_ lobject 对象管理 luaO_ lopcodes.c 字节码操作 luaP_ lparser.c 分析器 luaY_ lstate.c 全局状态机 luaE_ lstring.c 字符串操作 luaS_ ltable,c 表操作 luaH_ lundump.c 加载预编译字节码 luaU_ ltm.c tag方法 luaT_ lzio.c 缓存流接口 luaZ_
内嵌库相关文件列表
文件名 | 作用 | |
---|---|---|
lauxlib.c | 库编译时需要用到的辅助函数库 | |
lbaselib.c | 基础库 | |
ldblib.c | 调试库 | |
liolib.c | IO 库 | |
lmathlib.c | 数学库 | |
loslib.c | OS库 | |
ltablib.c | 表造作库 | |
lstrlib.c | 字符串造作库 | |
loadlib.c | 动态扩展库加载器 | |
linit.c | 负责内嵌库的初始化 | |
解释器,字节码编译器相关文件
文件 | 作用 | |
---|---|---|
lua.c | 解释器 | |
luac.c | 字节码编译器 | |
-
Lua虚拟机工作流程
Lua代码通过翻译成Lua虚拟机能识别的字节码运行主要分为两个部分:
- 翻译代码以及编译为字节码的部分:这部分代码负责将Lua代码进行词法分析,语法分析等,最终生成字节码。涉及这部分的代码文件包括llex,c(用于词法分析)和 lparser.c(用于语法分析),而最终生成的代码则使用lcode.c文件中的功能。在lopcodes,h , lopcodes,c文件中,则定义了Lua虚拟机相关的字节码指令的格式与相关的API
- Lua虚拟机相关的部分:在这一步中,经过分析阶段之后,生成相应的字节码,第二步就是将这些字节码装载到虚拟机中运行。Lua虚拟机相关的代码在lvm.c 中,虚拟机执行的主函数是luaV_execute,不难想象这个函数是一个大的循环,依次从字节码中取出指令执行。Lua虚拟机对外看到的数据结构是Lua_State, 这个结构体将一直贯穿整个分析及执行阶段。除了虚拟机的执行之外,Lua的核心部分还包含函数调用和返回处理的相关代码,主要处理函数前后环境的准备和还原,这部分代码在ldo,c中,垃圾回收部分的代码在lgc.c中。Lua是一门嵌入式的脚本语言,这意味着设计他的目的必须满足能够与宿主系统进行交互,这部分代码在lapi.c中。