亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > C++ > 正文

Lua與宿主語(yǔ)言(C/C++)交互原理

2019-11-06 06:27:47
字體:
供稿:網(wǎng)友

Lua語(yǔ)言可研究的東西真是多,各種機(jī)制原理:與宿主語(yǔ)言(下文均指C/C++)的交互、內(nèi)存管理(垃圾回收)、虛擬機(jī)實(shí)現(xiàn)、協(xié)程、閉包、異常捕獲機(jī)制等。如取其一進(jìn)行研究,要吃透還是需要點(diǎn)時(shí)間和精力。相信只要一點(diǎn)點(diǎn)慢慢啃,終究還是會(huì)將其吸收。

以下的相關(guān)原理介紹是基于Lua-5.1.5版本的源碼,不排除與之后版本的源碼中有少部分差異存在,但基本原理應(yīng)該相同。

一、Lua與宿主語(yǔ)言(C/C++)的交互

1、lua_State、global_State

1). lua_State

lua_State是Lua語(yǔ)言中的一種基本類型,類似TString,Table等,主要用來管理一個(gè)lua虛擬機(jī)的執(zhí)行環(huán)境,一個(gè)lua虛擬機(jī)可以有多個(gè)執(zhí)行環(huán)境,lua_State最主要的功能就是用于函數(shù)調(diào)用以及和C/C++的交互。

主要功能包括:

1. 數(shù)據(jù)棧管理,包括交互過程中參數(shù)壓棧和出棧、函數(shù)注冊(cè)的臨時(shí)數(shù)據(jù)存儲(chǔ)等。

2. 調(diào)用棧管理,其中CallInfo結(jié)構(gòu)表示一次調(diào)用,包括指向數(shù)據(jù)棧中數(shù)據(jù)邊界指針top和base、被調(diào)用函數(shù)指針func。

3. 全局表l_gt管理,注意:它其實(shí)只是在當(dāng)前l(fā)ua_State范圍內(nèi)是全局唯一的,和global_State的l_registry注冊(cè)表不同,l_registry是lua虛擬機(jī)范圍內(nèi)是全局唯一的。

4. gc的一些管理和當(dāng)前棧中upvalue的管理(出現(xiàn)閉包應(yīng)用場(chǎng)景時(shí))。

5. hook相關(guān)的,包括hookmask,hookcount,hook函數(shù)等(暫未了解)。

以上1、2點(diǎn)是Lua與C/C++交互時(shí)操作最頻繁的步驟,因此整理數(shù)據(jù)棧和調(diào)用棧的操作流程是理解交互的重中之重。

2). global_State

Lua 虛擬機(jī)全局狀態(tài)的存儲(chǔ)的地方,管理lua虛擬機(jī)的全局環(huán)境,所有的lua_State共享這個(gè)全局狀態(tài),由于Lua被設(shè)計(jì)為單線程的,所以global_State上的狀態(tài)控制沒有考慮多線程問題。主要功能可分為:內(nèi)存分配策略、全局字符串hashtable管理、注冊(cè)表、gc管理、lua_State集合管理、元表管理(暫時(shí)尚未知用來干嘛)等。

最后記住一條:一個(gè)Lua虛擬機(jī)有且只有一個(gè)global_State對(duì)象,一個(gè)進(jìn)程中允許多個(gè)Lua虛擬機(jī)同時(shí)運(yùn)行。運(yùn)行形態(tài)例如下圖所示:

2、啟動(dòng)Lua虛擬機(jī)過程

Lua的API中提供了宏lua_open()用于啟動(dòng)一個(gè)Lua虛擬機(jī),之所以起了這個(gè)名,估計(jì)是為了與lua_close()對(duì)應(yīng),open、close看著就知道明顯是一對(duì)。

啟動(dòng)Lua虛擬機(jī)的過程總結(jié)成一句話就是:構(gòu)造global_State、lua_State對(duì)象,并初始化。具體包括以下幾個(gè)步驟:

1、通過內(nèi)存分配策略(l_alloc)分配兩個(gè)對(duì)象(global_State、lua_State)大小的內(nèi)存空間。

2、初始化lua_State對(duì)象,例如:類型設(shè)置、數(shù)據(jù)??臻g分配(45*TValue)、調(diào)用??臻g分配(8*CallInfo)等。

3、初始化global_State對(duì)象,例如:主lua_State設(shè)置、內(nèi)存分配方法、全局字符串表等。

4、加載所有標(biāo)準(zhǔn)庫(kù)到Lua虛擬機(jī)執(zhí)行環(huán)境中,實(shí)際操作就是將各種庫(kù)提供庫(kù)函數(shù)通過現(xiàn)有的注冊(cè)機(jī)制注冊(cè)到當(dāng)前l(fā)ua_State的l_gt中,之后Lua腳本中就可以直接調(diào)用注冊(cè)過的庫(kù)函數(shù)。

 

Lua現(xiàn)在支持的庫(kù)有:協(xié)程庫(kù)、表操作庫(kù)、io庫(kù)、系統(tǒng)庫(kù)、string庫(kù)、math庫(kù)、debug庫(kù)、包處理庫(kù),以string庫(kù)為例:

static const luaL_Reg strlib[] =

{

  {"byte", str_byte},

  {"char", str_char},

  {"dump", str_dump},

  {"find", str_find},

  {"format", str_format},

  {"gmatch", gmatch},

  {"gsub", str_gsub},

  {"len", str_len},

  {"lower", str_lower},

  {"match", str_match},

  {"rep", str_rep},

  {"reverse", str_reverse},

  {"sub", str_sub},

  {"upper", str_upper},

  {"pack", str_pack},

  {"packsize", str_packsize},

  {"unpack", str_unpack},

  {NULL, NULL}

};

luaL_register(L, LUA_STRLIBNAME, strlib); //注冊(cè)函數(shù)

 

經(jīng)過以上若干步驟后,lua虛擬機(jī)執(zhí)行環(huán)境已準(zhǔn)備就緒,宿主語(yǔ)言就可以和lua腳本進(jìn)行相互調(diào)用。

3、棧操作原理

1). DataStack、CallStack

與宿主語(yǔ)言交互時(shí)的棧主要涉及兩個(gè),為了方便理解,暫且將它歸納為:DataStack和CallStack,其中棧操作指針變量均是lua_State的成員,DataStack可以理解為交互數(shù)據(jù)的實(shí)際存儲(chǔ)地,而CallStack中記錄著每次調(diào)用需要的數(shù)據(jù)在DataStack中的地址范圍,具體如下:

// DataStack

typedef Tvalue*StkId;

StkId top;  /* first free slot in the stack (棧頂指針) */

StkId base;  /* base of current function (當(dāng)前調(diào)用幀所在DataStack中的棧底) */

StkIdstack_last;  /* last free slot in thestack (??臻g的上邊界) */

StkIdstack;  /* stack base (棧空間的下邊界,即棧底)*/

 

// CallStack

CallInfo*ci;  /* call info for current function (當(dāng)前調(diào)用幀)*/

CallInfo *end_ci;  /* points after end of ci array (調(diào)用棧空間的上邊界)*/

CallInfo*base_ci;  /* array of CallInfo's (調(diào)用??臻g的下邊界,即棧底)*/

        

         根據(jù)以上分類,清楚可知:在Lua和宿主語(yǔ)言交互時(shí),實(shí)際就是這些指向棧的指針不停被更新的過程。下圖描述了Lua虛擬機(jī)啟動(dòng)后,兩個(gè)棧原始狀態(tài)的直觀感覺:

2). 一次調(diào)用的棧操作

         在了解完以上所有前提知識(shí)點(diǎn)后,從一次C++調(diào)用Lua方法的示例入手理解,逐步深入其中的棧操作過程,調(diào)用示例如下:

         lua_settop(L,0);

         lua_getglobal(L,“l(fā)ua_Function”); //假設(shè)lua腳本中有一個(gè)名為lua_Function的方法

 

         if( lua_pcall(L, 0, LUA_MULTERT, 0) )

{

/* 調(diào)用錯(cuò)誤,從(L->top) + index的棧中取出錯(cuò)誤信息,然后pop掉該棧幀*/

}

else

{

/* 調(diào)用正確,從(L->base) +(index – 1)的棧中取出返回信息,然后pop掉該棧幀 */

}

 

分解步驟:

(1)、lua_settop(L,0): 調(diào)整DataStack中top、base兩個(gè)指向棧的指針值,使L->top== L->base,指向統(tǒng)一棧幀位置,屬于調(diào)用的前期準(zhǔn)備。

(2)、lua_getglobal(L,“l(fā)ua_Function”):獲取lua腳本中被調(diào)用方法“l(fā)ua_Function”,并將其壓入DataStack,此時(shí)L->base指向剛?cè)霔?,L->top + 1。檢索“l(fā)ua_Function”的步驟:

1). 計(jì)算“l(fā)ua_Function”字符串的哈希值,然后與global_state的stringtable中匹配出該哈希值下的所有字符串對(duì)象所在的沖突鏈表,遍歷鏈表查詢是否存在“l(fā)ua_Function”,存在則直接返回值,否則臨時(shí)構(gòu)造TString對(duì)象并返回;

2).根據(jù)返回的字符串對(duì)象從lua_State的l_gt(所有函數(shù)的注冊(cè)地)中匹配出該函數(shù)名對(duì)

應(yīng)的函數(shù)對(duì)象;

3). 將以上檢索出來的函數(shù)對(duì)象壓入DataStack。

(3)、如果調(diào)用的lua_Function方法有參數(shù),則繼續(xù)向DataStack壓棧,L->top+ nArgs,nArgs為參數(shù)個(gè)數(shù),L->base則繼續(xù)指向被調(diào)用方法lua_Function所在的棧位置。

(4)、lua_pcall(L,nArgs, LUA_MULTERT, nRets):開始調(diào)用lua方法,在到達(dá)真正調(diào)用那一步前,需要有以下子操作:

         1). 計(jì)算此前入棧的lua_Function所在棧位置:func=L->top–(nArgs+1),為何不直接

用L->base?

2). 更新L->base的值,L->base = func+ 1;

3). 更新CallStack中指向當(dāng)前調(diào)用棧幀的L->ci,包括: ++ci、ci->base= L->base、

         ci->top=L->base+nArgs、ci->func=func、ci->nresults=nresults等;

4). 解釋執(zhí)行l(wèi)ua_Fucntion函數(shù)腳本,該部分涉及Lua虛擬機(jī)具體如何實(shí)現(xiàn)解釋執(zhí)

行相關(guān)機(jī)制,此處暫不作過多說明。只需記住一點(diǎn),執(zhí)行過程中會(huì)將DataStack之前壓

入的參數(shù)逐一彈出。

(5)、步驟(4)中如果出現(xiàn)遞歸調(diào)用非C函數(shù)(lua腳本函數(shù)),則重復(fù)步驟(4);如果遞歸調(diào)用已注冊(cè)的C函數(shù),則會(huì)觸發(fā)更新L->ci值操作(類似步驟(4)的第二步子操作),然后重復(fù)進(jìn)入步驟(1)開始新的交互流程。

(6)、最后將返回值壓入DataStack中,根據(jù)返回值個(gè)數(shù)逐一將其取出,然后pop掉。

 

下圖表示Lua和宿主語(yǔ)言進(jìn)行多層調(diào)用時(shí)的DataStack和CallStack的狀態(tài)圖:

 


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

亚洲美女av电影| 中文字幕丰满乱子伦无码专区| 欧美寡妇偷汉性猛交| 日本三级视频网站| 亚洲视频专区在线| 日本久久免费| 亚洲天堂2016| 综合久久亚洲| 国产精品热久久| 国产成人av在线影院| 精品无码m3u8在线观看| 免费在线黄网站| 亚洲爆乳无码一区二区三区| 欧美特级xxxxbbbb毛片| 欧美一级高清免费播放| 成人一区不卡| 中文字幕久久综合| 香港久久久电影| 午夜精品久久久久久久99热浪潮| 美女桃色网站| 国产精品jvid在线观看| 在线免费视频一区| 欧美一区二区三区日韩| 一本久道久久综合中文字幕| 影音先锋中文字幕在线播放| 亚洲高清视频在线播放| 成人国产视频在线| 欧美亚洲动漫制服丝袜| 国产中文伊人| 久久er99热精品一区二区| 中文字幕av一区中文字幕天堂| 好吊色视频一区二区三区| 欧美精品一区二区视频| 亚欧洲精品视频在线观看| tube8在线hd| 91福利视频网站| 中文字幕校园春色| 欧美一级免费在线观看| 国产精品99免费看| 日本三级午夜理伦三级三| 青草青在线视频| 曰批又黄又爽免费视频| 成人免费毛片xxx| 欧美又粗又大又爽| 亚洲美女在线一区| 韩国三级中文字幕hd久久精品| 中文字幕永久有效| 四虎国产精品成人免费4hu| 久久精品一区二区不卡| 亚洲激情视频在线观看| 日韩亚洲一区中文字幕| www.色国产| 91看片在线播放| 国产精品传媒麻豆hd| 欧美精品成人一区二区三区四区| 色综合天天狠狠| 欧美亚洲综合在线| 国产精品无码一区二区在线| 中文视频一区视频二区视频三区| 久久综合激情网| 亚洲精品一区二区| 狠狠色丁香婷婷综合久久片| 国产欧美日韩精品在线| 香蕉视频网站在线播放| 宅男网站在线免费观看| 在线观看免费视频一区| 自由色视频.| 先锋影音日韩| 午夜精品久久久久久久| 毛片视频免费播放| 亚洲女人天堂色在线7777| 亚洲欧美制服中文字幕| 欧美日韩国产高清一区| 五十路六十路七十路熟婆| 666av成人影院在线观看| 99久久精品一区二区成人| 日韩欧美精品一区二区三区| 日韩视频免费观看| 内射无码专区久久亚洲| 国产高清精品久久久久| 蜜桃免费网站一区二区三区| 日本一区二区三区dvd视频在线| 久草在线新资源| 精品亚洲aⅴ无码一区二区三区| 国产主播av在线| 国产精品玖玖玖在线资源| 国产精品天干天干在线综合| 亚洲色图官网| 久草视频精品在线| 国产精品久久久久久69| 久久国产精品久久w女人spa| 专区另类欧美日韩| 精品日产一区2区三区黄免费| 青草青草久热精品视频在线网站| 99久久久国产精品无码免费| 中文日韩欧美| 国产性色视频| 欧美做受777cos| 亚洲免费视频一区二区三区| 特级特黄刘亦菲aaa级| 污导航在线观看| 国产无套内射久久久国产| 国内免费精品视频| xxxx欧美18另类的高清| 日韩精品在线看片z| 亚洲性视频大全| 国产欧美午夜| 4kfree性满足欧美hd18| 国产亚洲欧洲997久久综合| 狠狠色噜噜狠狠狠狠8888| 日韩午夜电影免费看| 日韩欧美精品网址| 神马久久高清| 黑人巨大精品欧美一区二区桃花岛| 456成人影院在线观看| 国产成人综合欧美精品久久| 亚洲福中文字幕伊人影院| 午夜伦理福利在线| 日本韩国在线不卡| 久久这里只精品最新地址| 99re6在线精品视频免费播放| 亚洲一区在线观| 成品网站w灬+源码1688网页| 国产亚洲精品中文字幕| 亚洲午夜剧场| 俄罗斯男人又粗又大| 91亚洲精品一区二区乱码| 欧美网站大全在线观看| 欧美日韩在线播放视频| 国产伦精品一区二区三区视频免费| 99视频免费| 涩涩涩视频在线观看| 蜜桃狠狠色伊人亚洲综合网站| 亚洲精品视频91| 少妇在线看www| 在线欧美日韩| 1pondo在线播放免费| 国产精品99一区| а√天堂www在线а√天堂视频| 欧美在线视频全部完| 91av在线播放| 成人在线看视频| 欧美xxxx黑人xyx性爽| 国产一级免费看| 性欧美videos高清hd4k| 台湾亚洲精品一区二区tv| 日韩视频在线观看国产| 秋霞午夜在线观看| 成+人+亚洲+综合天堂| 久久久久久久久久久免费| 中文字幕乱码亚洲无线精品一区| 日本三级电影网站| 免费一级特黄录像| 日韩欧美伦理电影院| 一区二区视频在线免费观看| 午夜精品一区二区三级视频| 精品国产一区久久| 激情小说一区| 久久人人97超碰国产公开结果| 日本精品久久久久中文字幕| 日韩 国产 一区| 久久久99精品视频| 91在线播放国产| 国产大学生自拍视频| 亚洲国产精品成人久久蜜臀| 日韩毛片一区| 蜜桃91精品入口| 性欧美一区二区三区| 日韩在线播放一区| 国产成人亚洲精品青草天美| 男人的天堂a在线| 免费白浆视频| 潮喷失禁大喷水aⅴ无码| 久久久亚洲天堂| 亚洲免费视频一区| 毛片在线看网站| 国产老头和老头xxxx×| 精品少妇久久久久久888优播| 日本五级黄色片| 男女av免费观看| 国产成人免费91av在线| 亚洲国产美女视频| 国产精品第100页| 免费**毛片在线| 亚洲欧美日韩天堂一区二区| 国产午夜福利片| 欧美午夜在线| 欧美高清在线观看| 免费激情网址| 91久久精品无嫩草影院| 天堂成人在线观看| 日本人妖在线| 欧美亚洲国产日韩2020| 欧美日韩在线三区| 国产成人的电影在线观看| 中文字幕欧美人妻精品一区| 中文字幕另类日韩欧美亚洲嫩草| 精品成a人在线观看| 中文字幕一区二区三区域| 国产又黄又大又粗视频| av一区二区三区四区| 99精品视频免费全部在线| 亚洲春色h网| 欧美在线中文字幕高清的| 成人亚洲综合色就1024| 情趣视频网站在线免费观看| 国产精品高清一区二区| 欧美日韩蜜桃| 深夜福利日韩在线看| 午夜3点看的视频| 国产乱码精品一区二区三区不卡| 国产精品免费不| 国产日韩第一页| 亚洲 自拍 另类 欧美 丝袜| 黄色高清视频在线观看| 国产在线视频精品视频免费看| 日韩欧美综合在线视频| 亚洲一区二区三区日韩| 老色鬼在线视频| 少妇被躁爽到高潮无码文| 国产天堂在线播放视频| 午夜日韩成人影院| av电影免费在线看| 日韩欧美中文字幕精品| 亚洲欧美中文在线视频| 国产精品无av码在线观看| 欧美1区视频| 国产肉体xxxx裸体784大胆| 亚洲小说春色综合另类网蜜桃| 欧美a v在线播放| 国产精品美女久久久久| 久久国产欧美日韩精品| 欧美日韩成人综合在线一区二区| 91精品久久久久久久久久久久久| av中文字幕一区二区三区| 欧美熟妇交换久久久久久分类| 中文字幕免费高清电视剧网站在线观看| 欧美国产激情二区三区| avove在线播放| 色欲av伊人久久大香线蕉影院| 欧美成人aaa片一区国产精品| 日韩在线免费电影| 国产精品美女在线观看| 精品一区二区成人免费视频| 成人网站免费观看| 欧美人与禽zozo性伦| 国产性生交xxxxx免费| 天堂资源最新版在线视频观看免费网| 中文字幕永久在线| 99re66热这里只有精品4| 岛国爱情动作片在线| 亚洲成av人片在线观看www| 久久爱www成人| 日韩中文字幕不卡| 久久精品aaaaaa毛片| 在线能看的黄色| 在线观看av片| 免费在线性爱视频| 在线成人h网| 涩涩屋成人免费视频软件| 国产一区在线观看视频| 欧美又粗又长又爽做受| 欧美一级免费在线观看| 国产精品亚洲不卡a| 天天色天天射天天干| 国产日韩欧美夫妻视频在线观看| 91黄色在线观看| 在线观看免费黄色片| 亚洲色图欧美自拍| 高跟丝袜一区二区三区| 欧美一级日韩一级| 天堂中文在线播放| 91精品国产三级| 中文字幕超清在线免费观看| 国产精品三级一区二区| 久草在线资源网| 男女视频网站| 亚洲国产毛片aaaaa无费看| 成人免费视频国产免费| 精品一区二区三区蜜桃| 日韩中文字幕麻豆| 在线国产精品一区| 在线免费视频福利| 亚洲色偷精品一区二区三区| 啊啊啊久久久| www.亚洲天堂.com| 亚洲视频精品在线观看| 欧美性猛片xxxx免费看久爱| 国产成人av在线| 国产成人免费视频app| 奇米综合一区二区三区精品视频| 91欧洲在线视精品在亚洲| 国产精品女同互慰在线看| 久热爱精品视频线路一| 中文字幕在线观看视频免费| 久久精品国产一区二区电影| 欧美激情自拍偷拍| 亚洲电影天堂av| 爱福利一区二区| 欧美日韩水蜜桃| 影音先锋在线视频| 伊人久久久大香线蕉综合直播| 日韩精品中文字幕一区二区三区| 久久久久久久久久一区二区三区| 97人妻精品一区二区三区免| 一本久道久久综合狠狠爱| 岛国中文字幕在线| 六月丁香婷婷激情| 久久精品国产免费观看| 亚洲在线成人| 日本 片 成人 在线| 美女扒开内裤让男人桶| 久久色在线播放| 国产叼嘿视频在线观看| 欧亚一区二区| 中文字幕亚洲综合| 国产稀缺真实呦乱在线| 99精品免费网| 亚洲第一成肉网| 黄页网站大全在线观看| 国产一区二区视频在线| 北条麻妃在线一区| 国产精品亚洲一区| 伊人久久综合视频| www.91在线观看| 欧美精品三区| 欧美成人免费电影| 色七七影院综合|