《lua源碼賞析》筆記 -1

LUA源碼筆記

這些文件根據實現的功能不同分成了 四大部分。

1>虛擬機運轉的核心功能

2>源代碼解析以及預編譯字節碼

3>內嵌庫

4>可執行的解析器,字節碼編譯器

 

(1)LUA核心

LUA虛擬機的行爲是由一連串的opcodes控制的,這些opcodes放在了lopcodes.c裏面。而對這些opcodes進行編譯解析的工作放在了lvm,其中的APIluaV爲前綴。

虛擬機在外面的表現形式就是lua_State結構體。State有當前狀態的意思,全局的State裏面引用了虛擬機所有的數據。全局State使用luaE爲前綴代碼放在了lstate中。

函數的運行流程:函數的調用和返回放在了ldo.c中,相關的APIluaD開頭。

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.cAPI直接以lua開頭 供C編寫的程序庫直接調用

(2)代碼翻譯以及預編譯字節碼

讓代碼運行起來要輸入lua程序,這些程序我們讀起來就是程序文本,需要通過解析得到內部數據結構(常量和opcode的組合)。這個過程是通過parser:lparser.c和詞法分析llex.c來完成解析玩文本代碼 還要生成虛擬機理解的數據。過程在lcode中實現,用luaK爲前綴。

(3)內嵌庫

本身可以完全由宿主系統注入到state,不過有很多庫基本上很難不用所以可以自由加載。主動加載這些庫進入lua_state是由lualib.h中的API來實現。模塊化管理,require/module管理在loadlib中實現。內建庫的初始化APIlinit.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頁。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章