Lua簡介

luawiki  中文  官方社區:lua-users)是一門開源、簡明、可擴展且高效的弱類型解釋型腳本語言。html

因爲其實現遵循C標準,它幾乎能在全部的平臺(windows、linux、OS X、Android、iOS、PlayStation、XBox、wii等)上運行。java

當前最新的lua版本爲5.3.5;前兩位版本號爲lua的大版本,相同的大版本之間是兼容的;即5.3.5向下兼容5.3.4~0等版本python

lua很是小巧精簡,其解釋器加上週邊的庫函數也不過1w多行代碼。如下是Lua5.3.5的源文件:linux

核心文件:c++

文件名 做用 對外接口前綴
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.c 對象管理 luaO_
lopcodes.c 字節碼操做 luaP_
lparser.c 語法分析 luaY_
lstate.c 全局狀態機 luaE_
lstring.c 字符串操做 luaS_
ltable.c 表操做 luaH_
ltm.c tag方法 luaT_
lundump.c 加載預編譯字節碼 luaU_
lvm.c 虛擬機 luaV_
lzio.c 緩存流接口 luaZ_

內嵌庫文件: git

文件名 做用
lauxlib.c 庫編寫時須要用到的輔助函數庫
lbaselib.c 基礎庫
lbitlib.c bit位操做庫
lcorolib.c 協程庫
lctype.c 封裝c標準庫中的ctype文件
ldblib.c 調試庫
linit.c 負責內嵌庫的初始化
liolib.c IO庫
lmathlib.c 數學庫
loadlib.c 動態擴展庫加載器
loslib.c OS庫
lstrlib.c 字符串操做庫
ltablib.c 表操做庫
lutf8lib.c utf8庫

解釋器、編譯器文件:github

文件名 做用
lua.c 解釋器
luac.c 編譯器

lua很容易編譯成靜態庫、動態庫或以源代碼的形式集成到應用程序中,並方便地與c/c++及其餘語言進行互操做,所以其被稱爲膠水語言(glue language)。windows

若是不想本身編譯lua,可從LuaBinaries下載編譯好的各個平臺上靜態庫、動態庫及基於這些庫實現的lua、wlua解釋器、luac編譯器等工具.。api

因爲其動態性,支持熱更,上手難度低等特色,在遊戲行業經常被用來開發業務邏輯。緩存

可以使用跨平臺vsCode來編輯和調試lua腳本(注:調試須要安裝actboy168的LuaDebug插件  其github在這裏,可在vscode的Extensions面板中搜索lua找到它而後直接安裝)。

騰訊也提供了一款vsCode的lua調試器插件:LuaPanda 其github在這裏

 

lua/wlua解釋器

lua.exe、wlua.exe解釋器均可以經過傳入lua文件,來執行lua腳本  如:lua.exe/wlua.exe  D:/LuaTest/test1.lua  // 將Hello World!字符串打印到控制檯和寫入到e:/test.txt文件中

D:/LuaTest/test1.lua內容以下:

print("Hello World!")

file = io.open("e:/test.txt", "w")
file:write("Hello World!", "\n")
file:close()

lua.exe是subsystem:console類型程序,可在控制檯交互式地接受用戶的輸入,並能使用print等函數將結果輸出到控制檯中

wlua.exe是subsystem:windows類型程序,無控制檯窗口,所以不能將結果輸出到控制檯中,但可輸出到文件;另外經過加載GUI dll插件模塊,可以使用模塊中的接口來建立窗口程序

在lua5.1.5及以前版本,luaforwindowsgooglecode上的站點)項目會集成lua在windows上的各個插件,方便你們在windows上使用lua,現在該項目已停更

如:在luaforwindows中就集成了alien插件,該插件中提供的lua版的windows api,配合wlua.exe來運行如下腳本

require "alien"

local MessageBox = alien.User32.MessageBoxA
MessageBox:types{ret = "long", abi = "stdcall", "long", "string", "string", "long" }
MessageBox(0, "Hello World!", "My Window Title", 0x00000040)

 

lua.exe命令行

lua.exe --help // 查看lua.exe的用法

lua.exe -v // 顯示出Lua版本號   Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio

lua.exe  // 進入交互模式  windows系統按Ctrl+C、linux系統按Ctrl+D可退出交互模式

lua.exe -  // 從標準設備讀入腳本,輸完後按回車,而後按Ctrl+Z並回車,會執行輸入內容 注:進入輸入模式後可按Ctrl+C強制退出

lua.exe e:\Lua\Test.lua  // 加載並執行e:\Lua\Test.lua

lua.exe -e "print(type(100))"  // 經過-e參數執行一段lua代碼

注:對於5.3版本的Lua,lua.exe在開始執行前,會讀取環境變量LUA_INIT_5_3的值,若其沒定義,則會嘗試另一個環境變量LUA_INIT

      若該值不以@開頭,會將其做爲一段lua代碼進行執行;若以@開頭,則將其做爲lua文件路徑載入並執行

lua.exe -e "myPrint=print" e:\Lua\Test.lua 100 200

e:\Lua\Test.lua中的內容以下:

myPrint("Hello")

-- 打印全部傳入的命令行參數
for i, v in pairs(arg) do
    myPrint(i, v)
end

輸出結果爲:

在運行之前,Lua使用全部參數構造arg表。腳本名e:\Lua\Test.lua索引爲0,腳本的參數從1開始增長,腳本前面的參數從-1開始減小 

lua.exe -e "myPrint=print" e:\Lua\Test2.lua 1 "hello" true

e:\Lua\Test2.lua中的內容以下:

local a, b, c, d = ...
myPrint(a) -- 1
myPrint(b) -- hello
myPrint(c) -- true
myPrint(d) -- nil

lua.exe -i e:\Lua\Test3.lua  // 執行e:\Lua\Test3.lua腳本後,進入交互模式

lua.exe -lmisc.Test4    // 搜索misc.Test4模塊,找到後加載並執行模塊

lua.exe -e "print(package.path);print(package.cpath)" -l misc.Test4   // 打印出lua模塊和c模塊的搜索路徑,按照這些路徑來搜索misc.Test4模塊,找到後加載並執行模塊

E:\Lua\lua\?.lua;E:\Lua\lua\?\init.lua;E:\Lua\?.lua;E:\Lua\?\init.lua;E:\Lua\..\share\lua\5.3\?.lua;E:\Lua\..\share\lua\5.3\?\init.lua;.\?.lua;.\?\init.lua  // 將?替換爲misc\Test4來搜索lua模塊
E:\Lua\?.dll;E:\Lua\..\lib\lua\5.3\?.dll;E:\Lua\loadall.dll;.\?.dll;E:\Lua\?53.dll;.\?53.dll  // 將?替換爲misc\Test4來搜索c模塊

注1:對於5.3版本的Lua,package.path會被設置成環境變量LUA_PATH_5_3的值,若其沒定義,則會嘗試另一個環境變量LUA_PATH;若都沒定義,則使用編譯時定義的默認路徑(如上)

注2:對於5.3版本的Lua,package.cpath會被設置成環境變量LUA_CPATH_5_3的值,若其沒定義,則會嘗試另一個環境變量LUA_CPATH;若都沒定義,則使用編譯時定義的默認路徑(如上)

注3:在使用環境變量時,能夠添加;;來帶上默認路徑;如:將LUA_PATH定義爲c:\public;;  package.path則會變成c:\public和默認路徑(如上)的集合

注4:若命令行帶上-E參數,則會在阻止使用環境變量,強制使用默認路徑(如上)

 

Lua C#解釋器

Lua Interpreter使用C#實現的解釋器,它容許使用C#模塊,並能在lua代碼中調用這些C#模塊中的函數

 

Lua JIT

LuaJIT是(wiki)一款支持JIT的Lua代碼解釋器,使用C語言編寫,已開源(git);當前發佈的穩定版本爲2.0.5,最新的版本爲2.1.0-beta3,只兼容Lua的5.1版本

編譯技術大約分爲兩種,一種AOT,將源代碼、中間碼等提早靜態地編譯成本地機器碼,目標用戶直接用本地機器碼的程序來運行
另外一種是JIT(Just In Time,即時編譯),一個JIT引擎要想快,它會經過蒐集runtime信息,識別出程序的熱點(2/8原則),會將這部分代碼編譯成本地機器碼並緩存起來,以便下一次直接運行;
而對於只執行一次或少許次數的代碼,JIT編譯帶來的執行速度的提高也未必能抵消掉其編譯帶來的時間開銷,這部分代碼JIT引擎會仍然選擇解釋的方式執行

從官網上下載源碼解壓後,在Visual Studio 2008 Command Prompt命令行中,切換當前路徑到<LuaJIT>\src,而後執行msvcbuild.bat

在src目錄中,會獲得生成出luajit.exe及依賴文件

要編譯獲得64位的luajit,則須要在Visual Studio 2008  x64 Win64 Command Prompt命令行中編譯

 

若是想調試運行luajit.exe,可按照以下步驟來

① 在msvcbuild.bat腳本搜索/O2,將/O2改成/Od
② 執行msvcbuild.bat debug來生成luajit.exe
③ 用visual studio創建一個命令行工程,如:luajitcmd
④ 把<LuaJIT>\src下全部.h和.c代碼加入工程
⑤ 把工程的調試路徑設置爲
  命令:$(ProjectDir)..\..\src\luajit.exe
  工做目錄:$(ProjectDir)..\..\src\
⑥ 此時就能夠正常按f5下斷點調試了

 

luajit的命令行參數用法與lua.exe/wlua.exe是一致的,只是在其基礎上增長了幾個命令行參數(詳見:這裏),可經過luajit.exe --help查看詳細用法

luajit.exe -b Hello.lua Hello.luajit  // 將Hello.lua代碼編譯成luajit字節碼(缺省是開啓O3最高優化)

luajit.exe -O0 Hello.lua // 關閉優化,執行Hello.lua代碼

luajit.exe -joff Hello.lua // 關閉jit,僅僅使用解釋器執行Hello.lua代碼

關於luajit字節碼的詳細格式詳見:【技術分享】Lua程序逆向之Luajit文件格式

 

更多請閱讀:

Lua程序逆向之Luajit文件格式 

LuaJIT反編譯總結 

 

lua反編譯工具

工具名稱 下載地址 說明
Unluac

https://github.com/HansWessels/unluac

https://sourceforge.net/projects/unluac/

java語言實現,lua反編譯器開源項目,可將lua字節碼反編譯爲lua代碼
Luadec

https://github.com/viruscamp/luadec

http://luadec.luaforge.net/

c語言實現,結合lua引擎源碼寫的開源lua反編譯器,解析整個lua字節碼文件並儘量的還原爲源碼
Chunkspy

https://github.com/viruscamp/luadec/tree/master/ChunkSpy

http://chunkspy.luaforge.net/

lua語言實現,將lua字節碼翻譯成lua彙編

該工具還包括了一個交互式的命令,能夠將輸入的lua腳本轉換成lua字節碼彙編,這對學習lua字節碼很是有幫助

Luadec工具中集成了Chunkspy

luajit-decomp https://github.com/bobsayshilol/luajit-decomp au3語言實現,先經過luajit原生的exe文件將luajit字節碼文件轉換成彙編,而後使用該工具將luajit彙編轉換成lua代碼
ljd https://github.com/NightNord/ljd python語言實現,一款luajit反編譯工具

 

lua性能分析工具

工具名稱 下載地址 說明
pLua https://github.com/esrrhs/pLua lua函數熱點分析
lua-snapshot

https://github.com/cloudwu/lua-snapshot

https://blog.codingnow.com/2012/12/lua_snapshot.html

lua內存泄漏
lua_memleak https://github.com/radiotail/lua_memleak lua內存泄漏

 

遊戲引擎lua插件

插件名稱 支持引擎 下載地址 說明
xlua unity https://github.com/Tencent/xLua G6
unlua ue4 https://github.com/Tencent/UnLua G6
slua unity https://github.com/pangweiwei/slua 潘多拉(Pandora) 
sluaunreal ue4 https://github.com/Tencent/sluaunreal 潘多拉(Pandora) 
ulua unity https://github.com/jarjin/uLua  
tolua unity https://github.com/topameng/tolua  
unreal.lua ue4 https://github.com/asqbtcupid/unreal.lua tianle
相關文章
相關標籤/搜索