Lua程式設計(二十八)

2021-09-06 17:07:10 字數 1797 閱讀 4502

lua語言會在執行源**之前先對其進行預編譯。生成預編譯檔案(也被稱為二進位制檔案,binary chunk)的最簡單方式是,使用標準發行班中附帶的luac程式。

$ luac -o prog.lc prog.lua
上述命令會建立檔案prog.lua的預編譯版本prog.lc

lua解析器會像執行普通lua**一樣執行這個新檔案,完成與原來**一致的動作。

我們可以直接在lua語言中實現乙個最簡單的luac:

p = loadfile(arg[1])

f = io.open(arg[2], "wb")

f:write(string.dump(p))

f:close()

關鍵函式是string.dump,該函式的傳入引數是乙個lua函式,返回值是傳入函式對應的字串形式的預編譯**(已被正確格式化,可以由lua語言直接載入)。

luac程式提供了一些有意思的選項。特別地,選項-l會列出編譯器為指定**段生成的操作碼(opcode)。

預編譯形式的**不一定比源**更小,但是卻載入得更快。預編譯形式的**的另乙個好處是,可以避免由於意外而修改原始碼。

除了必需的第乙個引數外,函式load還有3個可選引數。第二個引數是程式段的名稱,只在錯誤資訊中被用到。第四個引數是環境。第三個引數它允許了載入的**段的型別。如果該引數存在,則只能是如下的字串:字串"t"允許載入文字(普通)型別的**段,字串「b」只允許載入二進位制(預編譯)型別的**段,字串"bt"允許同時載入上述兩種型別的**段,同時也是預設情況。

人人都難免犯錯誤, 因此lua語言就必須提供處理錯誤的方式。lua語言在遇到非預期的情況時引發錯誤。我們也可以通過呼叫函式error並傳入乙個錯誤資訊作為引數來引發乙個錯誤。

print "enter a number:"

n = io.read("n")

if not n then error("invalid input") end

lua語言提供了乙個內建的函式assert來完成呼叫函式error的工作。函式assert見檢查其第乙個引數是否為真,如果該引數為真則返回該引數;如果該引數為假則引發乙個錯誤。該函式的第二個引數是乙個可選的錯誤資訊。需要注意的是函式assert只是乙個普通的函式,所以lua語言在呼叫該函式前先對引數進行求值。

當乙個函式發現某種意外情況發生時(即異常exception),在進行異常處理(exception handling)時可以採取兩種基本的方式:一種是返回錯誤**(通常是nil或者false),另一種則是通過呼叫函式error引發乙個錯誤。一般秉承的原則是:容易避免的異常應該引發錯誤,否則應該返回錯誤碼。

二十八 模組

模組 在電腦程式的開發過程中,隨著程式 越寫越多,在乙個檔案裡 就會越來越長,越來越不容易維護。為了編寫可維護的 我們把很多函式分組,分別放到不同的檔案裡,這樣,每個檔案包含的 就相對較少,很多程式語言都採用這種組織 的方式。在python中,乙個.py檔案就稱之為乙個模組 module 使用模組有...

CUDA學習(二十八)

多處理器級別 在更低層次上,應用程式應該最大化多處理器內各個功能單元之間的並行執行 如 硬體多執行緒 中所述,gpu多處理器依賴於執行緒級並行性來最大限度地利用其功能單元。因此利用率與駐留經線的數量直接相關。在每個指令發布時間,乙個warp排程器選擇乙個準備好執行下乙個指令的warp 如果有的話 然...

Linux基礎(二十八)

進入linux字元介面方式有字元介面 圖形介面下的終端以及虛擬控制台等方式。在字元介面下,虛擬控制台的選擇可以通過按下 alt 鍵和1個功能鍵來實現,功能鍵通常為f1 f6鍵。比如使用者登入後,按下 alt f2 鍵,使用者可以看 login 提示符,說明使用者進入了第2個虛擬控制台。然後只需利用按...