跳到內容

Lua 程式設計/簡介

來自華夏公益教科書,開放的書籍,開放的世界

Lua(不是“LUA”,儘管很常見,但這是不正確的)是一種強大、快速、輕量級且可嵌入的程式語言。它被許多框架、遊戲和其他應用程式使用。雖然它可以獨立使用,但它被設計為易於嵌入到其他應用程式中。它使用 ANSI C 實現,這是 C 程式語言的一個子集,非常便攜,這意味著它可以在許多系統和許多裝置上執行,而大多數其他指令碼語言無法執行。本書的目的是向任何人都學習 Lua 程式設計,無論其之前的程式設計經驗如何。本書可以作為程式設計的入門教程,適用於從未程式設計過的人,也可以作為 Lua 的入門教程,適用於之前程式設計過但從未使用過 Lua 的人。由於有許多使用 Lua 的開發平臺和遊戲,因此本書也可以用來學習如何使用 Lua,然後在該開發平臺中使用它。

本書旨在教授最新版本的 Lua 的用法。這意味著它將嘗試定期更新,因為 Lua 的新版本會發布(Lua 的釋出頻率足夠低,這應該不會太難)。目前,本書的版本是 Lua 5.2。如果您在使用 Lua 的嵌入環境中使用 5.x 分支(Lua 5.0 和 Lua 5.1)的舊版本,本書的材料應該仍然對您足夠有用。

Lua 由巴西里約熱內盧天主教大學設計並維護。它的建立者是 Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。

“Lua”(發音為 LOO-ah)在葡萄牙語中是“月亮”的意思。因此,它既不是縮寫也不是縮寫,而是一個名詞。更確切地說,“Lua”是一個名字,是地球月球的名字,也是該語言的名字。像大多數名字一樣,它應該用小寫字母寫,開頭大寫,即“Lua”。請不要將其寫成“LUA”,這既難看又令人困惑,因為這樣它就變成了一個首字母縮略詞,對不同的人有不同的含義。所以,請正確地寫“Lua”!
—Lua 作者, 關於 Lua

Lua 來自兩種由 TeCGraf(里約熱內盧天主教大學的一個實驗室)設計的語言:DEL 和 Sol。DEL 意為“資料錄入語言”,而 Sol 意為“簡單物件語言”,在葡萄牙語中也意為“太陽”,這就是選擇 Lua 這個名字的原因,因為它在葡萄牙語中是“月亮”的意思。它是為巴西石油公司 Petrobras 建立的,但也用於 TeCGraf 的許多其他專案,現在在世界範圍內廣泛使用。Lua 是嵌入式遊戲開發領域領先的語言之一。

Lua 的主要優勢之一是它的簡單性。一些公司專門使用它是因為這個優勢:他們認為他們的員工如果可以使用程式語言來執行某些任務會工作得更好,但他們無力為員工提供關於複雜程式語言的完整課程。一些非常簡單的語言,如 Bash 或 Batch,在這裡不夠強大,無法執行這些任務,但 Lua 既強大又簡單。Lua 的另一個重要優勢是它可嵌入的能力,這是它在整個開發過程中最重要的特點之一。像 World of Warcraft 或 ROBLOX 這樣的遊戲需要能夠將其嵌入到他們的應用程式中,以便應用程式的使用者可以使用它。

程式設計,在嵌入式應用程式中執行的程式的情況下有時也稱為指令碼,是編寫計算機程式的過程。程式語言是一種語言,用於透過包含在計算機程式中的計算機程式碼向計算機發出指令。程式語言包含兩部分:語法,就像英語中的語法一樣,以及庫,由該語言提供的基本函式。這些庫可以與英語中的詞彙進行比較。

你好,世界!

[編輯 | 編輯原始碼]

Lua 可以嵌入到應用程式中,也可以獨立使用。本書不會描述在您的計算機上安裝 Lua 的過程,但您可以使用 codepadLua 演示 執行程式碼。本書中第一個 Lua 程式碼示例將是基本且傳統的“你好,世界”程式。

“你好,世界”程式是一個計算機程式,它在顯示裝置上輸出“你好,世界”。因為它通常是大多數程式語言中最簡單的程式之一,所以按照慣例,它通常用來向初學者說明程式語言中最基本的語法,或者驗證語言或系統是否正常執行。
—維基百科, 你好,世界程式
print("Hello, world!")

上面的程式碼將文字 你好,世界! 列印到輸出,列印是指在輸出中顯示文字,而不是在紙上列印。它透過使用字串“你好,世界!”作為引數呼叫 print 函式來實現。這將在關於函式的章節中解釋。

請注意,Lua 大多數時候是 嵌入 在更低級別的應用程式中的,這意味著 print 函式並不總是將文字顯示在使用者可見的區域。這些應用程式的程式設計介面文件通常會解釋如何將文字顯示給使用者。

註釋是程式語言忽略的程式碼註釋。註釋可以用來描述一行或多行程式碼,記錄程式,臨時停用程式碼,或任何其他原因。它們需要以兩個連字元為字首才能被 Lua 識別,並且可以放在單獨的行上,也可以放在另一行的末尾

print("This is normal code.")
-- This is a comment
print("This is still normal code.") -- This is a comment at the end of a line of code.

這些註釋稱為短註釋。也可以建立長註釋,它們以長括號開頭,可以繼續多行

print("This is normal code")
--[[Line 1
Line 2
]]

長括號由兩個括號組成,這兩個括號之間可以放置任意數量的等號。這個數字稱為長括號的級別。長括號將一直持續到下一個相同級別的括號,如果有的話。沒有等號的長括號稱為 0 級長括號。這種方法使在長註釋中使用閉合雙括號成為可能,方法是在兩個括號中間新增等號。在使用註釋停用程式碼塊時,這樣做通常很有用。

--[==[
This is a comment that contains a closing long bracket of level 0 which is here: ]]
However, the closing double bracket doesn't make the comment end, because the comment was opened with an opening long bracket of level 2, and only a closing long bracket of level 2 can close it.
]==]

在上面的示例中,0 級閉合長括號(]])不會關閉註釋,但 2 級閉合長括號(]==])會。

程式語言的語法定義瞭如何在該程式語言中編寫語句和表示式,就像語法定義瞭如何在英語中編寫句子和單詞一樣。語句和表示式可以分別與句子和單詞進行比較。表示式是可以計算的具有值的程式碼片段,而語句是可以執行的包含指令和一個或多個表示式的程式碼片段,以便使用該指令。例如,3 + 5 是一個表示式,而 variable = 3 + 5 是一個將 variable 的值設定為該表示式的語句。

Lua 的整個語法可以在擴充套件的巴科斯-諾爾正規化中找到 Lua 網站上,但如果你讀它,你什麼也看不懂。 擴充套件的巴科斯-諾爾正規化 是一種元語言,一種用來描述另一種語言的語言,就像元網站是一個關於網站的網站,就像元表一樣,在 Lua 中,是定義其他錶行為的表(你將在本書的後面學習關於元表和表的知識)。但是,你不需要在這本書中學習擴充套件的巴科斯-諾爾正規化,因為像 Lua 這樣的語言可以使用元語言進行描述,也可以使用英語中的單詞和句子進行描述,而這正是本書要做的。

由於英語可以用來描述另一種語言,那麼它本身一定是一種元語言(因為它符合元語言的定義)。事實確實如此。由於程式語言的目的是描述指令,而你可以用英語來做到這一點,因此英語也必須是一種程式語言。這,**在某種程度上**,也是事實。實際上,英語是一種可以用於多種用途的語言。但擴充套件的巴科斯-諾爾正規化是一種專門的語言,程式語言也是專門的語言。專門化是指在特定領域非常擅長,但在其他方面則無能為力。擴充套件的巴科斯-諾爾正規化非常擅長描述其他語言,但它不能用來編寫指令或傳遞資訊。程式語言非常擅長給出指令,但它們不能用來描述語言或傳遞資訊。

英語能夠做到所有事情:描述語言、給出指令和傳遞資訊。但它在做這些事情中並不擅長。事實上,它在給出指令方面非常糟糕,以至於如果用它來給計算機下達指令,計算機將無法理解任何內容。這是因為計算機需要指令非常精確和明確。

獲取 Lua

[編輯 | 編輯原始碼]

Lua 可以從官方 Lua 網站獲取,在下載頁面。那裡也有說明:下載按鈕是用於獲取原始碼的,這可能不是你想要的。你可能在尋找二進位制檔案,因此你應該在頁面上查詢有關這些檔案的資訊(你到底要找什麼取決於你正在使用的平臺)。本書的目的是教授 Lua 語言,而不是教授 Lua 工具的使用方法。一般假設讀者將在嵌入式環境中使用 Lua,但這對於本書的實用性來說並不必要,只是意味著本書不會描述將 Lua 作為獨立語言的使用方法。

有一些問題你可以回答,以驗證你是否理解本章中的內容。請注意,找到其中一些問題的答案可能需要你具備本章中沒有介紹的知識。這是正常的:測驗是學習過程的一部分,它們可以介紹本書其他地方沒有提供的資訊。

1 “Lua”在葡萄牙語中是什麼意思?

2 以下哪一項是 0 級長的註釋?

--Comment
[[Comment]]
--[[Comment]]
--[=[Comment]=]
[=[Comment]=]

3 擴充套件的巴科斯-諾爾正規化是什麼?

一種語言
一種程式語言
一種自然語言(或普通語言)
一種符號
一種元語言
一種標記語言

華夏公益教科書