lua的編譯、調試、運行

我們把Lua當作解釋型語言,但是Lua會首先把代碼預編譯成中間碼然後再執行(很多解釋型語言都是這麼做的)。在解釋型語言中存在編譯階段聽起來不合適,然而,解釋型語言的特徵不在於他們是否被編譯,而是編譯器是語言運行時的一部分,所以,執行編譯產生的中間碼速度會更快。我們可以說函數dofile的存在就是說明可以將Lua作爲一種解釋型語言被調用。
dofile實際上是一個輔助的函數。真正完成功能的函數是loadfile;與dofile不同的是loadfile編譯代碼成中間碼並且返回編譯後的chunk作爲一個函數,而不執行代碼;另外loadfile不會拋出錯誤信息而是返回錯誤代。.我們可以這樣定義dofile

loadfile——只編譯,不運行
loadfile故名思議,它只會加載文件,編譯代碼,不會運行文件裏的代碼。
比如,我們有一個hellofile.lua文件

print(“hello”);
function hehe()
    print(“hello”);
end

這個文件裏有一句代碼,和一個函數。試試用loadfile加載這個文件,如下代碼

loadfile("hellofile.lua");
print("end");  --結果只是輸出end,故說明它是不會執行代碼的

dofile——執行
很明顯,dofile就是會執行代碼的傢伙了,如下代碼

 dofile("E:/Android/wordspace_cocosIDERc0/CocosLuaTest/src/hellofile.lua");
 print("end"); --結果輸出hellofile.lua中的代碼和end

require函數
Lua提供高級的require函數來加載運行庫。粗略的說require和dofile完成同樣的功能但有兩點不同:
1. require會搜索目錄加載文件
2. require會判斷是否文件已經加載避免重複加載同一文件。由於上述特徵,require在Lua中是加載庫的更好的函數。require在第一次加載文件的時候,會執行裏面的代碼。第二次之後,再次加載文件,則不會重複執行了。換句話說,它會保存已經加載過的文件,不會重複加載
測試代碼如下:

   for i = 1, 2, 1 do
        require("hellofile.lua");
    end
    print("end");
//爲了說明這種情況,我刻意調用了兩次require,輸出結果只是hello和end
發佈了46 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章