Lua中的源代碼預(yù)編譯淺析
盡管Lua被稱為是一種解釋型的語言,但Lua確實(shí)允許在運(yùn)行源代碼之前,將源代碼預(yù)編譯成一種中間形式(類比Python的.pyc)。區(qū)別解釋型語言的主要特征在于編譯器是否是語言運(yùn)行時(shí)庫的一部分,即是否有能力執(zhí)行動(dòng)態(tài)生成的代碼(Lua可以通過dofile執(zhí)行Lua代碼)。
其實(shí),dofile的核心功能是由loadfile完成的,可以這樣來定義dofile:

loadfile并不是執(zhí)行代碼,而只是編譯,返回一個(gè)函數(shù),由dofile執(zhí)行。
如果多次運(yùn)行一個(gè)文件,可以只調(diào)用一次loadfile,重復(fù)調(diào)用其返回的函數(shù)即可。
另外一個(gè)函數(shù),loadstring從字符串加載代碼:
> f = loadstring('print "hello"')
> f()
hello
考察一下loadstring代碼的執(zhí)行域
> i = 1
> f = loadstring('i = i + 1')
> =i
1
--不要完了交互式命令行中,一行代碼默認(rèn)一個(gè)block
> f = loadstring('i=i+1')
> do
>> local i =1
>> f()
>> print(i)
>> end
1
> do
>> local i = 1
>> local f = loadstring('i=i+1')
>> f()
>> print(i)
>> end
1
兩次運(yùn)行,都是將global中的i加1.
可以這樣理解f:
function f()
i = i+1
end
但如果直接替換,其結(jié)果并不一致。
> do
>> local i =1
>> function f()
>> i = i + 1
>> end
>> f()
>> print(i)
>> end
2
可以認(rèn)為,loadstring編譯出的函數(shù),會(huì)關(guān)聯(lián)global scope,因而不會(huì)表現(xiàn)出閉包的特性,故而,應(yīng)該盡量不使用這種方式!
另外,如果語法有誤,那么loadstring返回nil。
可以使用assert(loadstring(s))()的方式。
如果參數(shù)不是nil/false,返回參數(shù),否則assert error;
深究一下loadfile和loadstring就會(huì)知道,Lua中其實(shí)有一個(gè)load函數(shù),后者接收一個(gè)reader function,調(diào)用其讀取代碼;
相關(guān)文章
Lua 操作 MongoDB 數(shù)據(jù)庫實(shí)例
這篇文章主要介紹了Lua 操作 MongoDB 數(shù)據(jù)庫實(shí)例,本文給出了修改后的lua-mongo API和具體的操作MongoDB 數(shù)據(jù)庫代碼,需要的朋友可以參考下2015-03-03
Golang使用ChatGPT生成單元測(cè)試實(shí)踐
這篇文章主要為大家介紹了Golang使用ChatGPT生成單元測(cè)試實(shí)踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

