精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一篇學會好玩的Lua

開發 后端
周末看了一下lua引擎的一些實現,也體驗了一下lua語言的一些東西,本文簡單介紹一下,后續有時間的話再寫文章分析引擎的實現。

[[414539]]

本文轉載自微信公眾號「編程雜技」,作者 theanarkh 。轉載本文請聯系編程雜技公眾號。

最近體驗了一下Openresty,了解到Openresty里使用lua語言來增強了Nginx的能力,所以又去了解了一下lua,lua語言小而精悍,lua引擎也值得學習。周末看了一下lua引擎的一些實現,也體驗了一下lua語言的一些東西,本文簡單介紹一下,后續有時間的話再寫文章分析引擎的實現。

1 在c語言中嵌入lua引擎

lua引擎本身是一個庫,類似V8一樣,我們可以把它嵌入到其他項目中,我們首先安裝相關文檔安裝lua(我安裝的是5.1.5)。然后寫個demo體驗一下。

  1. #include <lua.h> 
  2. #include <lualib.h> 
  3. #include <lauxlib.h> 
  4. #include<stdio.h> 
  5.  
  6. int echo(lua_State *L) { 
  7.     printf("world"); 
  8.  
  9. int main(int argc, char *argv[]) { 
  10.     int s = 0; 
  11.     lua_State *L = lua_open(); 
  12.     // 注冊個自定義的函數 
  13.     lua_register(L,"echo", echo); 
  14.     luaL_openlibs(L); 
  15.     // 執行lua腳本 
  16.     luaL_dofile(L, "hello.lua"); 
  17.     lua_close(L); 
  18.     return 1; 

編譯上面的代碼

  1. gcc hello.c -llua -lm -ldl 

然后寫個hello.lua腳本。

  1. print("hello"); 
  2. echo(); 

執行./a.out,我們看到輸出了hello world。這個是個簡單的體驗demo,和直接使用lua提供的命令行工具類似,只不過我們這里還拓展了一個自定義的echo函數給lua腳本調用。如果我們想動態地執行一段腳本,而不是執行一個lua文件,也是可以的。

  1. #include <lua.h> 
  2. #include <lualib.h> 
  3. #include <lauxlib.h> 
  4. const char * script = "print('hi');"
  5. int main(int argc, char *argv[]) { 
  6.     lua_State *L = lua_open(); 
  7.     luaL_openlibs(L); 
  8.     luaL_dostring(L, script); 
  9.     lua_close(L); 
  10.     return 1; 

編譯執行以上代碼我們會看到輸出hi。以上這些似乎沒什么大的作用,因為我們執行簡單地使用lua語言提供的能力。而lua的能力絕不止于此,lua稱為膠水語言,除了可以嵌入其他語言中,還支持拓展。下面我們看如果拓展lua的能力。

2 基于lua的demo運行時

雖然這里只是簡單地拓展lua,但是這里稱之為運行時是因為類似Node.js基于V8一樣,我們也可以通過拓展lua來實現一個基于lua的運行時。下面我們看看怎么拓展(也就是怎么調用其他語言的代碼,這里是c)。新建一個test.c文件。

  1. #include <lua.h> 
  2. #include <lualib.h 
  3. >#include <lauxlib.h> 
  4. static int test(lua_State* L){ 
  5.     //取棧第一個參數 
  6.     const char *a = luaL_checkstring(L, 1);  
  7.     //返回值入棧 
  8.     lua_pushstring(L, (const char *)"hi"); 
  9.     return 1; 
  10.  
  11. static const struct luaL_Reg reg_test[] = { 
  12.     {"test", test}, 
  13.     {NULLNULL
  14. }; 
  15.  
  16. int luaopen_test(lua_State *L) { 
  17.     const char* libName = "test"
  18.     luaL_register(L, libName, reg_test); 
  19.     return 1; 

lua和c是通過一個棧進行通信的,lua調用c函數的時候,c函數可以從棧中獲取lua的參數,也可也從棧中返回執行結果給lua。我們把以上代碼編譯成一個動態庫。

  1. gcc test.c -fPIC -shared -o test.so 

然后寫個測試lua demo。

  1. local test = require "test" 
  2. a = test.test("hello world!"
  3. print(a) 

我們可以看到在lua中成功調用了test模塊的test函數,并輸出hi。當我們require"test"的時候,lua會去當前目錄找test.o,并且執行其中的luaopen_test函數。luaopen_前綴是約定,test則是模塊名稱。當前去哪里找需要加載的模塊這個我們可以設置。我們分析一下c文件的代碼,看看拓展lua時的一些內容。首先看luaL_register。

  1. LUALIB_API void (luaL_register) (lua_State *L, const char *libname, const luaL_Reg *l) { 
  2.   luaI_openlib(L, libname, l, 0); 

我們主要關注luaL_register的第二第三個參數libname和luaL_Reg。因為知道這個參數的格式,我們才知道怎么寫c代碼。其中name是庫名稱,也就是我們require時傳的字符串。luaL_Reg的定義如下

  1. typedef int (*lua_CFunction) (lua_State *L); 
  2.  
  3. typedef struct luaL_Reg { 
  4.   const char *name
  5.   lua_CFunction func; 
  6. } luaL_Reg; 

luaL_Reg是封裝了kv的一個結構體,。name是導出的函數名稱,即在lua中可以調用的函數。func則是對應的函數,當在lua執行name函數時就會執行func的代碼。

3 lua變量存儲的設計

lua是動態類型的語言,意味著一個變量的值的類型是可以改變的,下面看一下lua中是如何設計底層的存儲的。lua所有變量都使用TValue結構體來表示。

  1. #define TValuefields    Value value; int tt 
  2.  
  3. typedef struct lua_TValue { 
  4.   TValuefields; 
  5. } TValue; 

里面只有兩個字段。tt是表示變量類型。lua的類型比較簡單。如下

  1. #define LUA_TNIL        0 
  2. #define LUA_TBOOLEAN        1 
  3. #define LUA_TLIGHTUSERDATA  2 
  4. #define LUA_TNUMBER     3 
  5. #define LUA_TSTRING     4 
  6. // 數組和對象都使用一種類型 
  7. #define LUA_TTABLE      5 
  8. #define LUA_TFUNCTION       6 
  9. #define LUA_TUSERDATA       7 
  10. #define LUA_TTHREAD     8 

接下來我們看看Value的定義。

  1. typedef union { 
  2.   GCObject *gc; 
  3.   void *p; 
  4.   lua_Number n; 
  5.   int b; 
  6. } Value; 

Value里分為兩種類型,一種是不需要gc的,比如數字,一種是需要gc的,比如數組,lua是帶gc的語言。我們繼續看GCObject。

  1. union GCObject { 
  2.   GCheader gch; 
  3.   union TString ts; 
  4.   union Udata u; 
  5.   union Closure cl; 
  6.   struct Table h; 
  7.   struct Proto p; 
  8.   struct UpVal uv; 
  9.   struct lua_State th;  /* thread */ 
  10. }; 

我們看到GCObject是一個聯合體,可以存儲不同類型的變量。我們再看看TString的定義。

  1. typedef union TString { 
  2.   L_Umaxalign dummy;  /* 內存對齊,性能優化 */ 
  3.   struct { 
  4.     CommonHeader; 
  5.     lu_byte reserved; 
  6.     unsigned int hash; 
  7.     size_t len; 
  8.   } tsv; 
  9. } TString; 

字符串結構體里面主要的字段時len和hash,len就是字符串的長度,hash類似一個索引,lua中的字符串不是存儲在結構體本身的,而是統一管理起來,主要是為了復用,比如有兩個變量的值都是同一個字符串,那么lua中,只會存儲一個字符串值,而這兩個變量都會通過hash指向這個字符串的值。我們可以看一下一段代碼大概了解一下。

  1. // 新建字符串,如果存在則直接復用 
  2. TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { 
  3.   GCObject *o; 
  4.   unsigned int h = cast(unsigned int, l);  /* seed */ 
  5.   size_t step = (l>>5)+1;   
  6.   size_t l1; 
  7.   // 計算字符串的哈希值 
  8.   for (l1=l; l1>=step; l1-=step)  /* compute hash */ 
  9.     h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1])); 
  10.   // 判斷是否有一樣的字符串存在了,是則共享,直接返回,否則新建 
  11.   for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)]; 
  12.        o != NULL
  13.        o = o->gch.next) { 
  14.     TString *ts = rawgco2ts(o); 
  15.     if (ts->tsv.len == l && (memcmp(str, getstr(ts), l) == 0)) { 
  16.       if (isdead(G(L), o)) changewhite(o); 
  17.       return ts; 
  18.     } 
  19.   } 
  20.   // 找不到則新建 
  21.   return newlstr(L, str, l, h);  /* not found */ 

我們看到lua的變量存儲設計中是一種樹狀結構,通過上層的變量類型,再進行不同的存取操作。從而我們也可以了解到動態語言在變量存儲中的一些設計思想。

后記:這是周末學習lua的一些內容,后續有時間會繼續更新,lua是一個非常有意思的項目。

 

責任編輯:武曉燕 來源: 編程雜技
相關推薦

2022-01-02 08:43:46

Python

2022-02-07 11:01:23

ZooKeeper

2022-06-30 22:53:18

數據結構算法

2021-10-26 10:40:26

代理模式虛擬

2021-12-04 22:05:02

Linux

2022-05-17 08:02:55

GoTryLock模式

2021-07-06 08:59:18

抽象工廠模式

2023-11-28 08:29:31

Rust內存布局

2023-01-03 08:31:54

Spring讀取器配置

2022-08-23 08:00:59

磁盤性能網絡

2021-07-02 09:45:29

MySQL InnoDB數據

2022-08-26 09:29:01

Kubernetes策略Master

2021-07-05 22:11:38

MySQL體系架構

2021-05-11 08:54:59

建造者模式設計

2022-04-12 08:30:52

回調函數代碼調試

2022-10-20 07:39:26

2021-04-29 10:18:18

循環依賴數組

2021-07-16 22:43:10

Go并發Golang

2021-07-02 08:51:29

源碼參數Thread

2021-10-14 10:22:19

逃逸JVM性能
點贊
收藏

51CTO技術棧公眾號

色999久久久精品人人澡69| 一级做a爰片毛片| 国产原创在线观看| 国产成人激情av| 欧美黑人一级爽快片淫片高清| 日韩欧美一二区| 午夜美女久久久久爽久久| 男人的天堂影院| yw.尤物在线精品视频| 亚洲乱码日产精品bd| 久久99久久精品国产| 正在播放一区二区三区| 中文字幕日本人妻久久久免费 | 直接在线观看的三级网址| 不卡视频免费播放| 成人午夜一级二级三级| 国产精品视频免费播放| 亚洲一区在线| 揄拍成人国产精品视频| 污污内射在线观看一区二区少妇 | 欧美三级视频在线观看| 成品人视频ww入口| 国产调教视频在线观看| 国产欧美视频在线观看| 国产一区二区自拍| 国产人妖在线播放| 日韩国产精品久久| …久久精品99久久香蕉国产| 性色av无码久久一区二区三区| 欧美另类69xxxxx| 亚洲国产精品电影在线观看| 日本亚洲一区二区三区| 欧洲亚洲精品久久久久| 91国产视频在线观看| 色噜噜久久综合| 宅男一区二区三区| 搞黄视频免费在线观看| 99精品久久久久久| 高清视频在线观看一区| 国产高清免费在线观看| 九九**精品视频免费播放| 国产成人极品视频| 久久久久久久黄色片| 红桃视频国产一区| 欧美日韩第一视频| 欧美成人精品一区二区免费看片| 91久久国产| 最新的欧美黄色| 国产一二三四区在线| 国产精品视频一区二区三区四蜜臂| 欧美精品一区男女天堂| 色哟哟网站在线观看| 日本精品视频| 日韩欧美在线一区二区三区| 少妇性l交大片7724com| 国产欧美视频在线| 日韩一区和二区| 亚洲av无一区二区三区久久| 试看120秒一区二区三区| 日韩欧美黄色影院| 无码国产精品一区二区免费式直播 | 特黄特黄一级片| 粉嫩av国产一区二区三区| 91精品午夜视频| 青娱乐精品在线| 亚洲一区二区电影| 亚洲第一网中文字幕| 一级特黄a大片免费| 美国成人xxx| 亚洲色图第一页| 亚洲女人毛茸茸高潮| 午夜精品一区二区三区国产| 美女黄色丝袜一区| 久久精品国产av一区二区三区| 在线不卡亚洲| 日韩av片永久免费网站| 一区二区的视频| 国产成人高清在线| 欧美亚洲精品日韩| 黄色视屏免费在线观看| 亚洲国产成人tv| 成人在线观看a| av一级久久| 精品国产伦一区二区三区观看体验 | 欧洲精品在线播放| 在线成人av观看| 4438x亚洲最大成人网| 日本不卡视频一区| 精品国产91| 欧美成人午夜激情视频| av资源免费观看| 久久国产精品无码网站| 99一区二区三区| 国产人成在线观看| 一区二区久久久| 黄色国产精品视频| 国产不卡精品在线| 亚洲欧美日韩视频一区| 91porn在线视频| 视频一区在线播放| 粉嫩高清一区二区三区精品视频| 国模精品一区二区| 一区二区三区在线看| 熟女人妇 成熟妇女系列视频| 精品午夜视频| 国产一区二区三区在线看| 欧美人妻一区二区| 日韩电影免费一区| 国产综合精品一区二区三区| 精品麻豆一区二区三区| 欧美色xxxx| 中文字幕在线播放一区二区| 精品国产a一区二区三区v免费| 欧美高清视频在线播放| 在线观看中文字幕2021| 99re在线视频这里只有精品| 中国黄色录像片| yiren22亚洲综合| 日韩美女av在线| 国产一级在线观看视频| 经典三级在线一区| 亚洲.欧美.日本.国产综合在线| av在线网页| 日韩一区二区精品在线观看| 亚洲国产精品一区二区久久hs| 亚洲欧美视频一区二区三区| 亚洲一区二区三区视频播放| 日本在线看片免费人成视1000| 色悠悠久久综合| 国产又黄又粗又猛又爽的视频| 欧美另类专区| 91最新在线免费观看| 天堂аⅴ在线地址8| 色网站国产精品| 国产精品815.cc红桃| 免费亚洲一区| 久久久久久国产精品mv| yellow在线观看网址| 亚洲第一色在线| 久久精品国产亚洲av香蕉 | 三叶草欧洲码在线| 国产精品超碰| 亚洲成人av免费| 美女日批在线观看| 亚洲不卡av不卡一区二区| 国产精品视频一区二区三区四| 欧美91精品久久久久国产性生爱| 精品久久久视频| 亚洲蜜桃精久久久久久久久久久久| 韩国在线一区| 国产偷国产偷亚洲高清97cao| 国产啊啊啊视频在线观看| 日韩欧美国产电影| 久久久国产精品黄毛片| 成人自拍视频在线观看| 欧美亚洲日本一区二区三区 | 国产精品一国产精品最新章节| 97影院秋霞午夜在线观看| 日韩视频免费直播| 久久精品一区二区三| 成人高清视频在线| 免费成人在线视频网站| 国产剧情在线观看一区| 国产精品欧美日韩| 黄页视频在线播放| 欧美白人最猛性xxxxx69交| 国产一级免费av| 久久综合五月天婷婷伊人| 免费黄色一级网站| 91精品观看| 国产伦理久久久| japanese23hdxxxx日韩| 色777狠狠综合秋免鲁丝| 国产成人精品一区二区无码呦 | www.夜夜爱| 人人香蕉久久| 国产精品美女免费视频| 污视频在线看网站| 日韩精品www| 中文字幕+乱码+中文字幕明步| 亚洲色图清纯唯美| 国产人妻黑人一区二区三区| 日韩在线一二三区| 久久久久亚洲av无码专区喷水| 国产精品色在线网站| 国产精品444| 午夜激情在线| 亚洲欧美另类人妖| 99精品国产99久久久久久97| 午夜视频一区二区| 成人欧美一区二区三区黑人一| 成人在线视频一区二区| 蜜臀视频一区二区三区| 综合一区在线| 麻豆一区区三区四区产品精品蜜桃| 福利精品在线| 午夜美女久久久久爽久久| 午夜激情视频在线观看| 日韩www在线| 国产精品久久久久久久成人午夜| 欧美日韩在线第一页| 色欲人妻综合网| 久久人人超碰精品| 国产精品成人免费一区久久羞羞| 日韩有码一区二区三区| 免费视频爱爱太爽了| 成人久久一区| 久久99精品国产一区二区三区| 疯狂欧洲av久久成人av电影| 国产成人一区二| 98色花堂精品视频在线观看| 久久久国产精品亚洲一区| 男女污视频在线观看| 亚洲成年人在线播放| 中文字幕日韩第一页| 欧美日韩美女在线观看| 久久久精品视频在线| 亚洲欧洲日韩综合一区二区| 亚洲精品国产一区黑色丝袜| 99视频一区二区三区| 国产精品二区视频| 狠狠久久亚洲欧美| 亚洲综合婷婷久久| 日韩1区2区3区| 日韩av黄色网址| 激情久久久久久| 日本五级黄色片| 综合天天久久| 亚洲天堂第一区| 午夜欧美在线| 樱空桃在线播放| 亚洲成人99| 三年中文高清在线观看第6集| 成人免费在线观看av| 欧美亚洲爱爱另类综合| 亚洲影院天堂中文av色| 久久久久久久久一区| 日韩av三区| 久久精品女人的天堂av| 久久夜色精品国产噜噜av小说| 成人9ⅰ免费影视网站| 亚洲不卡视频| 成人在线资源网址| www.久久东京| 精品国产免费一区二区三区| 麻豆精品少妇| 欧美久久久久久| 久久av免费| 图片区小说区区亚洲五月| 欧美综合在线视频观看| 亚洲欧洲日韩综合二区| 99久精品视频在线观看视频| 在线看视频不卡| 亚洲影视一区二区三区| 国产精品久久久久久久久电影网| 影音先锋中文字幕一区| 欧美 国产 综合| 丝袜亚洲另类欧美| 日韩精品视频一二三| 国产河南妇女毛片精品久久久| 九色91porny| av成人老司机| 久久丫精品忘忧草西安产品| 国产精品另类一区| 18岁成人毛片| 亚洲妇熟xx妇色黄| 日韩一级片中文字幕| 欧美日韩精品三区| 亚洲精品久久久久久久久久久久久久| 精品国产污污免费网站入口| 欧美高清成人| www日韩欧美| 成人在线黄色电影| 国产精品极品在线| 亚洲一区二区三区免费| 久久综合一区二区三区| 99久久九九| 777精品久无码人妻蜜桃| 日韩 欧美一区二区三区| 免费看三级黄色片| 久久久久久久网| 精品欧美一区二区久久久久| 精品毛片网大全| 亚洲专区第一页| 亚洲精品videossex少妇| 国产在线超碰| 欧美激情欧美激情| 亚洲欧美在线成人| 草莓视频一区| 成人免费电影网址| 欧美一级免费播放| 蜜臀av性久久久久蜜臀aⅴ | 99久久国产宗和精品1上映| 韩国av一区二区三区| 无套内谢大学处破女www小说| 中文字幕日韩一区二区| 天天综合网入口| 欧美一区二区福利在线| 免费在线看v| 欧美激情视频三区| 欧美videos粗暴| 蜜桃精品久久久久久久免费影院| 亚洲精品久久| 日韩免费高清在线| 成人精品电影在线观看| 日韩欧美视频免费观看| 色婷婷综合在线| 亚洲成熟女性毛茸茸| 日韩一区av在线| 香蕉成人av| 精品欧美日韩| 欧美久久成人| 日本77777| 中文字幕精品一区二区三区精品| 精品成人免费视频| 精品捆绑美女sm三区 | 亚洲激情网站免费观看| 中文字幕视频在线播放| 亚洲视频一区二区| 激情国产在线| 国产精品国产精品国产专区蜜臀ah | 黄色网页免费在线观看| 国产超碰在线一区| 午夜精品一区二区三区视频| 欧美日韩一区精品| 国产高清自拍视频在线观看| 69av视频在线播放| 久久超级碰碰| 免费一级淫片aaa片毛片a级| 国产电影一区在线| 欧美片一区二区| 日韩欧美成人一区二区| av免费网站在线| 亚洲精品免费在线视频| 888久久久| 日本一区二区三区在线免费观看| 国产精品乱码一区二区三区软件 | 亚洲视频在线播放| 亚洲精品一级二级| 欧美一区二区综合| 久久久久欧美精品| 在线免费观看视频| 欧美色视频一区| 中文字幕在线免费| 成人av番号网| 一区二区中文字| 91精品国产高清91久久久久久| 一区二区高清在线| 日本韩国免费观看| 欧美最猛性xxxxx亚洲精品| 同性恋视频一区| 少妇性l交大片| 中文字幕乱码久久午夜不卡 | 国产一区美女在线| 欧美日韩精品在线观看视频 | 成人久久久久久| 偷偷www综合久久久久久久| 91在线第一页| 亚洲一区二区三区在线播放| 三级网站在线看| 日本在线精品视频| 999久久久国产精品| 日本成人xxx| 亚洲444eee在线观看| 欧美日本网站| 国产欧美在线播放| 国产一区二区中文| 亚洲成人日韩在线| 欧美日韩成人综合在线一区二区| 国产一二三区在线观看| 国产欧美日本在线| 日韩精品一二三四| 国产美女福利视频| 亚洲精品大尺度| 99久久伊人| 91免费国产精品| 久久精品视频免费| 国产情侣av在线| 欧美中文在线字幕| 五月精品视频| 性欧美丰满熟妇xxxx性久久久| 欧美性高清videossexo| 中文av资源在线| 日本一区二区免费看| 国产成人啪免费观看软件| 在线免费黄色av| 久久久999精品免费| 午夜a一级毛片亚洲欧洲| 亚洲另类第一页| 婷婷六月综合网| 久热国产在线| 欧美精品一区二区三区久久| 国产一区久久久| 国产一区二区视频网站| 美女视频黄免费的亚洲男人天堂| 久久爱www成人| 在线播放第一页| 欧美美女一区二区| 在线天堂资源| 国产精品无码免费专区午夜|