Lua设计与实现(一) -- Lua源码组织

Lua设计与实现

QQ : 1841545843
邮箱 : jiaxx903@163.com

  1. Lua特性

    • 可移值性
    • 良好的嵌入式
    • 非常小的尺寸
    • Lua的效率很高,是执行最快的脚本语言之一
  2. 用户可以使用C, C++等语言进行主要功能的开发,而一些需要扩展配置的等会频繁动态变化的部分使用Lua语言来开发。

  3. 游戏服务器的组织与分工

    • C、C++语言实现服务器引擎内核,其中包括最核心的功能,比如网络收发,数据库查询,游戏逻辑主循环等,将这一层简称为引擎层。
    • 向引擎层注册一个Lua 主逻辑脚本,当接受到用户数据时,将数据包放到Lua脚本中进行处理,主逻辑脚本主要是一个大的函数表,可以根据收到的协议包的类型,调用相关的函数进行处理,以下简称这一层为脚本层。
    • 引擎层向脚本层提供很多的API,能方便额调用引擎层的操作,比如脚本层处理完逻辑后调用引擎层的接口应答数据。

    引擎层实现了很功能,脚本层实现了游戏的逻辑玩法。

    这个组合框架的优势:

    • 编码效率高‘
    • 开发效率高
    • 对人员素质相对较低
  4. 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.cC语言接口lua_
    lcode.c源码生成器luaK_
    ldebug.c调试库luaG_
    ldo.c函数调用及栈管理luaD_
    ldump.c序列化预编译的Lua字节码
    lfunc.c提供操作函数原型及闭包的辅助函数luaF_
    lgc.cGCluaC_
    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.ctag方法luaT_
    lzio.c缓存流接口luaZ_

​ 内嵌库相关文件列表

文件名作用
lauxlib.c库编译时需要用到的辅助函数库
lbaselib.c基础库
ldblib.c调试库
liolib.cIO 库
lmathlib.c数学库
loslib.cOS库
ltablib.c表造作库
lstrlib.c字符串造作库
loadlib.c动态扩展库加载器
linit.c负责内嵌库的初始化

解释器,字节码编译器相关文件

文件作用
lua.c解释器
luac.c字节码编译器
  1. 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中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值