lua虛擬機器工作流程:lua**是通過翻譯成lua虛擬機器能識別的位元組碼執行的,分兩部分:
翻譯**以及編譯為位元組碼部分:將lua**進行詞法分析、語法分析,最終生成位元組碼。
lua只有字串和表兩種最基本的資料結構。
lua同時採用了兩種方式來做到資料統一:
具體型別中有commonheader,用來存放所有資料型別都通用的字段;
tvalue作為統一表示所有資料的資料結構,內部使用了聯合體value將所有資料都包起來。
查詢:
插入:涉及重新分配表中陣列和雜湊表部分的流程。
其實就是計算整數陣列長度在2的階數中,找到乙個最大的可以容納50%索引的值。然後符合的就放在連續的陣列中,不符合的就放在雜湊表中,主要是為了陣列的長度中不要浪費太多的空間。
迭代:
取長度:
總結:
指令碼語言通常都是解釋執行的,每一門指令碼語言都會有自己定義的opcode(operation code,也稱為bytecode,一般叫"操作碼"或者"位元組碼")。即為門程式定義的"組合語言",一般的編譯型語言,比如c等,經編譯後,生成是與當前硬體環境匹配的彙編**;而指令碼型語言編譯器處理後,生成的就是位元組碼,再將該位元組碼放在這門語言的虛擬機器中逐個執行。
指令碼語言和編譯語言區別:
虛擬機器實現方式:
棧操作:
暫存器操作:
實現指令碼語言直譯器:
虛擬機器主要扮演的是cpu和記憶體的角色,cpu用來執行指令,記憶體負責資料的訪問讀寫。
引用計數:引用加一,反之減一。優點:不需要掃瞄每個物件;缺點:會有迴圈引用問題。
標記清除演算法(白、黑(使用)):每一次做gc的時候,首先掃瞄並且標記系統中的所有物件,被掃瞄並且標記到的物件認為是可達的,不會被**;反之沒有被標記的物件認為可以**。
雙色標記清除演算法(白(待訪問)、黑(使用)、灰(待掃瞄)):缺點:每個物件的狀態是「二元」的,只能有一種狀態,所以要求這個演算法每次做gc操作時不可被打斷地一次性掃瞄並清除完所有物件。
三色標記清除演算法:乙個「雙白色」,第一次gc和後面gc,每次都交替使用。
能不重啟程式或者發布新版本的情況更新指令碼,給除錯和線上解決問題帶來很大便得,對開發效率有很大的提公升。
require函式來實現模組的載入,如果載入過則返回,避免重複載入某個模組**,package.loaded = nil,動態更新某個模組的**。
不同程序之間的資源是隔離的,導致程序間的通訊非常複雜,於是有了執行緒的概念。
程序和執行緒,其排程都是由作業系統核心來完成的,建立成本很大。
協程更輕量,可以由使用者態的程度來排程。
協程可以讓出自己的執行權,當重新獲得執行權時從上一次暫停的位置繼續執行。
協程不能像程序、執行緒那樣復用其多核,多個協程只能跑在同乙個cpu上。
Lua中的表 讀《Lua設計與實現》筆記
1.lua語言用表來表示一切資料結構。2.lua表分為陣列和雜湊表部分。陣列部分索引從1開始。雜湊表部分可以儲存任何不能儲存在陣列部分的資料,唯一的要求是鍵值不能為nil lobject.h typedef struct table node value型別定義 typedef struct lua...
《Redis設計與實現》學習筆記 Lua指令碼
redis從2.6開始支援lua指令碼,和事務的功能類似,可以通過lua指令碼原子的執行多個redis命令。redis提供了eval和evalsha命令執行lua指令碼。redis在伺服器內嵌了乙個lua壞境,並進行了一系列的修改,從而確保這個lua壞境可以滿足redis伺服器的需要,通過下列步驟建...
Lua 筆記 型別與值
lua是一種動態型別的語言。在lua中有8種基礎型別 nil 空 boolean 布林 number 數字 string 字串 userdata 自定義型別 function 函式 thread 執行緒 和table 表 print type hello world string print typ...