lua源代码分析01:lua源代码结构分析
生活随笔
收集整理的這篇文章主要介紹了
lua源代码分析01:lua源代码结构分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 一、什么是lua
- 二、lua源代碼結構
- 三、閱讀lua源代碼順序
一、什么是lua
1、lua是用C編寫的腳本語言,可以在web、游戲、物聯網等場景下使用,源代碼共1萬多行;可以獨立編程,可以嵌入到其他語言里面作為一個庫使用,從而為應用程序提供靈活的擴展和定制功能。
2、lua官方源碼下載網址:http://www.lua.org/
二、lua源代碼結構
1、lua語言結構圖
2、lua源代碼都放在src文件夾下,源碼分為四部分
第一部分:虛擬機運轉的核心功能
lapi.c C語言接口 lctype.c C標準庫中ctype相關實現 ldebug.c debug接口 ldo.c 函數調用以及棧管理 lfunc.c 函數原型及閉包管理 lgc.c 垃圾回收 lmem.c 內存管理接口 lobject.c 對象操作的一些函數 lopcodes.c 虛擬機的字節碼定義 lstate.c 全局狀態機 lstring.c 字符串池 ltable.c 表類型的相關操作 ltm.c 元方法 lvm.c 虛擬機 lzio.c 輸入流接口說明:
lua核心部分僅包括lua虛擬機的運轉。 (1)lopcodes.c控制了lua虛擬機的行為 (2)lvm.c定義了虛擬機對opcode的解析和運作,API以luaV為前綴 (3)lstate.c,lua虛擬機的外在數據形式是一個lua_State結構體,描述了lua虛擬機當前的狀態,全局State引用了整個虛擬機的所有數據,API以luaE為前綴。 (4)ldo.c定義了函數的調用即返回,相關API以luaD為前綴 (5)lua最復雜也最重要的三種數據類型是function、table、string,他們的實現定義在lfunc.c、ltable.c、lstring.c中,三組內部API分別以luaF、luaH、luaS為前綴命名,不同的數據類型被統一定義在lobject.c中,API以luaO為前綴。 (6)ltm.c定義了元表的處理,API以luaT為前綴 (7)核心系統還用到了兩個基礎設備:內存管理lmem.c,API以luaM為前綴;帶緩沖的流處理lzio.c,API以luaZ為前綴。 (8)lgc.c定義了垃圾回收機制,也是核心系統里最為復雜的部分,API以luaC為前綴。 (9)lapi.c, lua是一門嵌入式語言,可以和宿主機系統相結合。所以必須提供和宿主機系統交互的API,這些API以C函數的形式提供,在lapi.c中實現,API直接以lua為前綴。第二部分:源代碼解析及預編譯字節碼
lcode.c 代碼生成器 ldump.c 序列化預編譯的lua字節碼 llex.c 詞法分析器 lparser.c 解析器 lundump.c 還原預編譯的字節碼說明:
只有核心代碼和一個虛擬機還不能讓lua程序運行起來,還需要有外部輸入經過解析才可以運行起來。 (1)lparser.c、llex.c,外部輸入的文本程序代碼需要經過解析得到內部的數據結構(常量opcode的集合),這個過程通過lparser.c完成,API前綴為luaY,這個過程還需要通過詞法分析llex.c完成,API前綴為luaX。 (2)lcode.c,解析完外部文本代碼,還需要最終生成虛擬機理解的數據,這個步驟在lcode.c中完成,API前綴為luaK。 (3)ldump.c、lundump.c,為了加快代碼翻譯的流程,可以采用預編譯的過程,把運行時編譯的結果生成字節碼,這個過程以及逆過程由ldump.c和lundump.c完成,API前綴為luaU。?第三部分:內嵌庫
lauxlib.c 庫編寫用到的輔助函數庫 lbaselib.c 基礎庫 lbitlib.c 位操作庫 lcorolib.c 協程庫 ldblib.c debug庫 linit.c 內嵌庫的初始化 liolib.c IO庫 lmathlib.c 數學庫 loadlib.c 動態擴展庫管理 loslib.c OS庫 lstrlib.c 字符串庫 ltablib.c 表處理庫說明:
嵌入式語言可以不提供庫及函數,全部由宿主系統注入到State中即可,但是lua官方版本提供了少量的庫, 比如一些基礎函數,如pairs、error、setmetatable、type等。lua允許自由加載需要的部分,以控制最終 執行文件的體積和內存的占用量。 (1)lualib.h,主動加載這些內嵌庫進入lua_State是在lualib.h中的API實現。 (2)loadlib.c、limit.c:在lua 5.0之前,lua并沒有統一的模塊管理機制,因為早期lua定位是嵌入式語言,后來人們 傾向于把lua作為一門獨立的編程語言來使用,那么統一的模塊化管理就變得很由必要,這樣才能讓豐富的第三方庫可以 協同工作。在lua 5.1引入了官方推介的模塊管理機制,require、module,并允許從C語言編寫的動態庫中加載模塊, 在lua 5.2做了簡化。我們可以在loadlib.c中找到實現,內嵌庫的初始化API則在limit.c中找到。 (3)lib.c,其他的基礎庫在lib.c為后綴的文件中實現。?
第四部分:可執行的解析器,字節碼編譯器
?
lua.c 解釋器
luac.c 字節碼編譯器
說明:
早期lua主要在嵌入式系統中使用,所以源代碼通常被編譯成動態庫或靜態庫被宿主機系統加載或鏈接, 但隨著lua第三方庫越來越豐富,人們開始把lua作為一門獨立的語言來使用,lua的官方版本里提供了 一個單獨的解析器,在lua.c中實現,luac.c實現了一個簡單的字節碼編譯器,可以預編譯文本的lua源程序。三、閱讀lua源代碼順序
lua源碼設計精簡、優雅、易讀,在閱讀之前理清代碼的設計脈絡很重要。推薦的閱讀順序是:
首先,閱讀外圍的庫是如何實現功能擴展,這樣可以熟悉lua的公開API,不陷入功能細節;
然后,閱讀API的具體實現,lua對外暴露的API是對內部模塊的一層封裝,可以對核心代碼有個初步的了解;
其次,閱讀lua VM的實現、函數調用、返回、string、metatable等實現;
再次,閱讀debug模式(一個額外的設施),幫助你理解lua內部細節;
最后,閱讀parser等編譯相關的部分、垃圾收集(最難部分)
?
?
總結
以上是生活随笔為你收集整理的lua源代码分析01:lua源代码结构分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell实例第17讲:连续输入4个10
- 下一篇: lua源代码分析02:内存管理