LUA源碼筆記
這些文件根據實現的功能不同分成了 四大部分。
1>虛擬機運轉的核心功能
2>源代碼解析以及預編譯字節碼
3>內嵌庫
4>可執行的解析器,字節碼編譯器
(1)LUA核心
LUA虛擬機的行爲是由一連串的opcodes控制的,這些opcodes放在了lopcodes.c裏面。而對這些opcodes進行編譯解析的工作放在了lvm中,其中的API以luaV爲前綴。
虛擬機在外面的表現形式就是lua_State結構體。State有當前狀態的意思,全局的State裏面引用了虛擬機所有的數據。全局State使用luaE爲前綴代碼放在了lstate中。
函數的運行流程:函數的調用和返回放在了ldo.c中,相關的API用luaD開頭。
Lua中最重要的三種數據類型function table string 被存放在了 lfunc.c
Ltable.c lstring.c 中。這三組內部API則分別以luaF luaH luaS命名。
不同的數據類型最後被統一定義成了lua Object 在lobject.c裏面用luaO 作爲前綴。
元表的處理放在了ltm.c中 用luaT做前綴。
核心系統裏面還有兩個擠出設施。內存管理lmem.c 以luaM開頭,帶緩衝的流處理lzio.c 以luaZ爲前綴。
核心系統裏面最複雜的部分垃圾回收部分lgc.c,luaC爲前綴
Lua是一門嵌入式語言 需要和宿主系統進行交互。交互式通過C API函數來實現的,被放在了lapi.c中API直接以lua開頭 供C編寫的程序庫直接調用
(2)代碼翻譯以及預編譯字節碼
讓代碼運行起來要輸入lua程序,這些程序我們讀起來就是程序文本,需要通過解析得到內部數據結構(常量和opcode的組合)。這個過程是通過parser:lparser.c和詞法分析llex.c來完成解析玩文本代碼 還要生成虛擬機理解的數據。過程在lcode中實現,用luaK爲前綴。
(3)內嵌庫
本身可以完全由宿主系統注入到state中,不過有很多庫基本上很難不用所以可以自由加載。主動加載這些庫進入lua_state是由lualib.h中的API來實現。模塊化管理,require/module管理在loadlib中實現。內建庫的初始化API在linit.c中可以找到。
(4)獨立解析器和字碼編譯器
原來的源代碼一般都被編譯成了動態庫或者靜態庫被加載或鏈接。而現在lua更多的被做成獨立開發,所以提供了一個獨立的解釋器,lua.c實現的這個。Luac.c實現了一個簡單的字節碼編譯器,可以預編譯文本的lua程序。
推薦閱讀的順序
1 閱讀外圍的庫是如何實現功能擴展的,這樣可以熟悉lua公開API。
2 閱讀API的具體實現。Lua對外暴露的API是一個對內部模塊的一層封裝,並未觸及核心,但可以窺探核心。
3 開始瞭解 lua VM的實現
4 瞭解函數的調用 返回 string table metatable等如何實現
5 debug可以幫助理解細節
6 parser等和編譯相關的部分
7 垃圾回收部分 花掉很多時間去理解細節
全局狀態機和內存管理
可以很容易的創建出lua虛擬機對象 lua_state。不同的虛擬機對象之間是線程安全的,因爲所有有關虛擬機有關的線程操作都被關聯到虛擬機對象中,而沒有利用任何其他共享變量。
Lua要自己定義一個內存管理函數,在lua創建虛擬機的時候傳入。這保證了lua的整個運行狀態用戶是可控的。但是很多時候,不直接使用lua_newstate這個API,而是用另一個更方便的版本luaL_newstate
後面的是利用前面的API實現的,利用C標準庫中的函數實現了一個磨人的內存管理器。
//<<lua源碼賞析>>17頁。