LUA 原始碼閱讀筆記(一)

2021-06-01 13:04:32 字數 1661 閱讀 9030

背景介紹

因為工作的需要,後台svr要能夠動態修改更新,使用c當然沒有問題,問題就在於修改原始碼後,需要重啟服務。所以就想到在c裡能夠嵌入一種指令碼,最好是和c無縫結合的。因此就想到使用到lua,lua的大名圈內人士應該早有耳聞,只不過一直沒有機會接觸。機緣巧合,有幸一見。

俗話說得好,耳聞不如一見。lua使用起來還是很簡單的,語法和普通的指令碼語言相差不大,很容易上手。在實際專案的使用過程中,對lua效能的體驗也是感受尤深。這也是決定一探lua原始碼的動力所在。因此,本筆記也只是針對lua原始碼的相關記錄,不會涉及到lua使用上的一些問題。同時,也歡迎各位lua愛好者批評指正筆記中的錯誤之處。廢話不說了,切入正題。

(1)mathlib strlib

mathlib 和 strlib是lua的乙個基本庫,每個函式的實現都是在在基本庫的基礎上重新封裝,舉個例子

static int math_abs (lua_state *l)

呼叫基本庫fabs()函式,將返回的結果壓棧返回。那肯定有乙個疑問,就是引數怎麼傳遞進去的?是呀,引數怎麼傳遞進去的,我現在也不知道,但是不要緊,先有個印象就行。

static const lual_reg mathlib = ,

, ,

, ,

, ,

, ,

, ,

, ,

, ,

, ,

, ,

, ,

, ,

, ,

, ,

, };

上面這個結構體定義了內部函式名(或者是函式指標)與外部函式名之間的對映關係,比如要呼叫math_abs(),那實際使用的就是abs()來呼叫,目前,這還是猜測,是不是這樣還有待驗證。

那lual_reg 是啥,看如下宣告:

typedef struct lual_reg  lual_reg;

就是乙個名字,和乙個函式指標,

typedef int (*lua_cfunction) (lua_state *l);

lua如何將這個對映註冊進去呢,看下面的函式,這個是mathlib的外部唯一介面

lualib_api int luaopen_math (lua_state *l)

大概的意思就是將mathlib這個lual_reg物件在l中註冊登記,l是什麼,l就是lua_state*!!!!!等於沒說,但是目前的認知也就是這些,這是最準確的表述,不是嗎?從名字上看,應該是乙個狀態機。想知道到底是什麼,接著看**。註冊登記完了,將一些常量壓棧。應該是設定一些環境變數,等等。

strlib和mathlib的結構差不多,

也是重新封裝一大堆函式,然後通過乙個唯一介面來註冊所有的函式。實際使用的時候,也就是呼叫這個唯一的介面。呼叫完該介面,應該就可以在那個叫做lua_state*的l中使用這些基本庫函式了。

到目前為止,很多還是不確定的,比如lua_state是什麼,為什麼基本庫的註冊登記,都要向針對這個l進行。l中到底維護的是什麼資訊,翻開lua_state的定義,一大堆資料,很多都不知道是什麼。好吧,先不看這個,先繼續看別的,但是要知道這個就是乙個結構體就行,這個結構體裡面肯定維護很多核心的東西。

lua 原始碼閱讀 1 1 2 1

lua 1.1 閱讀 1.hash.c 中 a 對建立的 hash array 用 listhead 鏈式結構來管理,新增lua hashcollector,用來做 hash 的 處理。ps 1.0 用的是個 512 的陣列,用乙個少乙個 b hash lua createarray int nha...

閱讀原始碼筆記一

一 build public sqlsessionfactory build inputstream inputstream build作用 建立乙個sqlsessionfactory 返回值 inputstream輸入流 二 build public sqlsessionfactory build...

tomcat原始碼閱讀筆記一

container全部啟動後,connector接著啟動,connector包含乙個protocolhandler,protocolhandler目前有三種協議 bio nio apr,可以按需求啟用相應的協議。每個協議protocolhandler包含乙個endpoint,在endpoint中開啟...