国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

Lua中的源代碼預(yù)編譯淺析

2024-07-21 23:04:07
字體:
供稿:網(wǎng)友

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

 其實,dofile的核心功能是由loadfile完成的,可以這樣來定義dofile:

Lua,源代碼,預(yù)編譯

loadfile并不是執(zhí)行代碼,而只是編譯,返回一個函數(shù),由dofile執(zhí)行。
如果多次運(yùn)行一個文件,可以只調(diào)用一次loadfile,重復(fù)調(diào)用其返回的函數(shù)即可。
  
另外一個函數(shù),loadstring從字符串加載代碼:

復(fù)制代碼 代碼如下:

> f = loadstring('print "hello"')
> f()
hello

考察一下loadstring代碼的執(zhí)行域
復(fù)制代碼 代碼如下:

> i = 1
> f = loadstring('i = i + 1')
> =i
1
  
--不要完了交互式命令行中,一行代碼默認(rèn)一個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:
復(fù)制代碼 代碼如下:

function f()
i = i+1
end

但如果直接替換,其結(jié)果并不一致。
復(fù)制代碼 代碼如下:

> do
>> local i =1
>> function f()
>> i = i + 1
>> end
>> f()
>> print(i)
>> end
2

可以認(rèn)為,loadstring編譯出的函數(shù),會關(guān)聯(lián)global scope,因而不會表現(xiàn)出閉包的特性,故而,應(yīng)該盡量不使用這種方式!
  
另外,如果語法有誤,那么loadstring返回nil。
可以使用assert(loadstring(s))()的方式。
如果參數(shù)不是nil/false,返回參數(shù),否則assert error;
  
深究一下loadfile和loadstring就會知道,Lua中其實有一個load函數(shù),后者接收一個reader function,調(diào)用其讀取代碼;
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 封丘县| 历史| 鸡西市| 淮阳县| 武川县| 西充县| 环江| 辽阳市| 井研县| 昌黎县| 濮阳县| 青州市| 钟山县| 全州县| 镇平县| 唐海县| 屏山县| 漯河市| 黑龙江省| 汾西县| 思茅市| 怀柔区| 胶南市| 久治县| 福建省| 布拖县| 若羌县| 油尖旺区| 漯河市| 淳安县| 东乌珠穆沁旗| 托克托县| 佛坪县| 格尔木市| 稻城县| 阿合奇县| 进贤县| 宁乡县| 巧家县| 平塘县| 伊通|