1. 程式人生 > >深入LUA指令碼語言,讓你徹底明白除錯原理

深入LUA指令碼語言,讓你徹底明白除錯原理


這是道哥的第008篇原創
![](http://ql815naye.hn-bkt.clouddn.com/wechat-qrcode.png)
## 一、前言 上篇文章我們聊了[gdb的底層除錯機制](https://mp.weixin.qq.com/s/oY2pF5ilk8UCq09022Tt6w),明白了gdb是利用作業系統提供的系統訊號來除錯目標程式的。很多朋友私下留言了,看到能幫助到大家,我心裡還是很開心的,其實這也是我繼續輸出文章的最大動力!後面我會繼續把自己在專案開發中的實戰經驗進行總結。 ![](http://ql815naye.hn-bkt.clouddn.com/comment.png) 由於gdb的程式碼相對複雜,沒有辦法從程式碼層面仔細的分析除錯細節,所以這次我們選擇一個小巧、開源的Lua指令碼語言,深入到最底層的程式碼中去探究一下程式碼除錯真正是怎麼一回事。 不過請放心,雖然深入到程式碼最底層,但是理解難度並不大,只要C語言掌握的沒問題,其他就都不是問題。 另外,這篇文章重點不是介紹程式碼,而是介紹實現一個偵錯程式應該如何思考,解決問題的思路是什麼。 通過閱讀這篇文章,能有什麼收穫? 1. 如果你使用過Lua語言,那麼你能夠從原始碼級別瞭解到除錯庫的程式碼邏輯。 2. 如果你對Lua不瞭解,可以從設計思想、實現架構上學習到一門程式語言是如何進行除錯程式的。 ## 二、Lua 語言簡介 #### 1. Lua是什麼鬼? 喜歡玩遊戲的小夥伴可能會知道,Lua語言在遊戲開發中使用的比較多。它是一個輕量、小巧的指令碼語言,用標準C語言編寫,原始碼開放。正因為這幾個原因,所以我才選擇它作為剖析物件。 如果對於Lua語言還是沒有感覺,Python語言總應該知道吧?廣告滿天飛,你就把Lua想象為類似Python一樣的指令碼語言,只不過體積比Python要輕量的得多。 這裡有1張圖可以瞭解下,2020年12月份的程式語言市場佔有率。 ![](http://ql815naye.hn-bkt.clouddn.com/lua-2.png) 在上圖中看不到Lua的身影,因為市場佔有率太低了,大概是位於30幾名。但是再看看下面這張圖,從工資的角度再體會一下Lua的高貴: ![](http://ql815naye.hn-bkt.clouddn.com/lua-1.png) 遠遠的把C/C++、JAVA甩在了身後,是不是有點衝動想學一下Lua語言了?先別激動,學習任何東西,先要想明白可以用在什麼地方。如果僅僅是從找工作的角度來,Lua可以不用考慮了,畢竟市場需求量比較小。 #### 2. 為什麼選擇Lua語言作為研究物件? 雖然Lua語言在招聘網站中處於小眾需求,但是這並不妨礙我們利用Lua來深入的學習、研究一門程式語言,Lua語言雖小,但是五臟俱全。就像我們如果想學習Linux核心的設計思想,你是願意從最開始的版本(幾千行程式碼)開始呢?還是願意從當前最新的核心程式碼(2780萬行程式碼,66492個檔案)開始呢? 看一下當前最新版的Lua程式碼體積: ![](http://ql815naye.hn-bkt.clouddn.com/lua-3.png) 同樣的思路,如果我們想深入研究一門程式語言,選擇哪一種語言,對於我們的積極性和學習效率是非常重要的。每個人的職業生涯都很長,花一些時間沉下心來研究透一門語言,對於一個開發者來說,還是蠻有成就的,對於職業的發展是非常有好處的,你會有一覽眾山小的感覺! 再看一下Lua程式碼量與Python程式碼量的對比: ![](http://ql815naye.hn-bkt.clouddn.com/lua-18.png) 從功能上來說,Lua與Python之間是沒有可比性的,但是我們的目的不是學習一個程式設計工具,而是研究一門程式語言本身,因此選擇Lua指令碼語言進行學習、研究,沒有錯! 言歸正傳。 ## 三、Lua原始碼5.3.5 #### 1. Lua程式是如何執行的? Lua 是一門擴充套件式程式設計語言,被設計成支援通用程序式程式設計,並有相關資料描述設施。同時對面向物件程式設計、函數語言程式設計和資料驅動式程式設計也提供了良好的支援。它作為一個強大、輕量的嵌入式指令碼語言,可供任何需要的程式使用。 作為一門擴充套件式語言,Lua沒有"main"程式的概念:它只能嵌入一個宿主程式中工作,該宿主程式被稱為被嵌入程式或者簡稱宿主。宿主程式可以呼叫函式執行一小段Lua程式碼,可以讀寫Lua變數,可以註冊C函式讓Lua程式碼呼叫。依靠C函式,Lua可以共享相同的語法框架來定製程式語言,從而適用不同的領域。 也就是說,我們寫了一個test.lua程式,是沒有辦法直接執行它的。而實需要一個“宿主”程式,來載入test.lua檔案。 ![](http://ql815naye.hn-bkt.clouddn.com/lua-10.png) 宿主程式可以是一個最簡單的C程式,Lua官方提供了一個宿主程式。
我們也可以自己寫一個,如下: ``` // 引入Lua標頭檔案 #