跳至內容

使用者:Woclass/Lua Programming/序言

維基教科書,自由的教學讀本

Lua 在巴西里約熱內盧(Rio de Janeiro)的 Pontifical Catholic 大學被設計和維護。它的創造者是:Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。

"Lua" (發音 LOO-ah) 在葡萄牙語裡是「月亮(moon)」的意思。因此,它既不是首字母縮寫詞也不是縮略詞,而是一個名詞。更具體地說,「Lua」是一個名字,地球的衛星——月亮的名字和一種語言的名字。像大多數名字一樣,它應該首字母大寫而其他部分小寫,即「Lua」。請不要將它寫成「LUA」。這種寫法既醜陋又令人感到困惑,因為它變成了對不同人有不同含義的首字母縮寫詞。所以,請正確的寫下「Lua」吧!

—Lua 的作者們, en: 關於 Lua

Lua 源自於兩種由 TeCGraf 設計的語言:DEL 和 Sol。TeCGraf 是位於里約熱內盧的 Pontifical Catholic 大學的實驗室。 DEL(data entry language) 的意思是「數據條目語言」,而 Sol(simple object language) 的意思是「簡單對象語言」,並且在葡萄牙語裡"Sol"的意思是太陽,這也是為什麼取 Lua 這個名字——因為它在葡萄牙語裡意思是「月亮(moon)」。Lua 是巴西石油公司 Petrobras 創造出來的,但它也用於 TeCGraf 的許多其他項目。現在 Lua 在世界各地的眾多項目中使用。Lua是嵌入式遊戲開發領域的主要語言之一。

Lua 的一個主要優點是簡單。有些公司完全是因為Lua具有這種優勢才使用它:他們認為如果公司的員工如果能夠使用程式語言來完成某些任務,員工的工作效率會更高。但他們承擔不起為公司的員工提供複雜程式語言課程的費用。像Bash和Batch這樣的語言又過於簡單,不足以完成這些任務。而Lua簡單又強大,能很好地滿足公司的需求。Lua的另一個巨大的優點是:可供嵌入使用。這也是Lua開發過程中的一個重要的特徵。像魔獸世界(WoW)或ROBLOX這樣的遊戲需要把Lua嵌入他們的程序,這樣用戶們就可以在程序中使用Lua。

編程,有時在嵌入式環境中也被稱為腳本編程,是一種編寫電腦程式的過程。程式語言是一種通過電腦程式中的代碼把指令傳遞給計算機的語言。程式語言由兩部分組成:語法和庫。語法就類似英語語法。庫可以類比英語的詞彙,能提供基本的函數。


Hello, world!

[編輯]

Lua既能獨立運行也能嵌入運行。本書不會涉及到如何在你的電腦上安裝Lua,但是你可以在 CodepadThe Lua demo 上運行Lua代碼. Lua代碼的第一個例子是經典的Hello world程序。

"Hello world" 程序是一個能輸出"Hello, world"到顯示設備上的電腦程式。因為它是大多數程式語言中最簡單的典型程序,它通常用來給新手展示最基本的語法,或者用於驗證一種語言或一個新系統是否正常工作。

—維基百科, Hello World 程序

print("Hello, world!")

以上代碼會輸出 Hello, world! 到指定輸出中。"print" 代表著輸出文本到指定輸出中,而不是列印在紙上。代碼以"Hello, world!"字符串為參數,調用了 print 函數。具體的函數調用原理見函數章節。

值得注意的是:Lua通常嵌入到一個以較低級別運行的程序中,這意味著 print 函數的輸出不一定能被用戶看到。這些程序的文檔中編程接口部分通常會解釋如何向用戶顯示文本。


注釋

[編輯]

注釋就是一段被程式語言忽略的代碼。注釋可以用來描述一行或多行的代碼、記錄程序的功能、臨時的注釋掉某段代碼或用作其他用途。注釋需要以兩個連詞符 -- 開頭,這樣Lua才知道它們是注釋。注釋可以獨立成行,也可以置於行尾:

print("正常的代码。")
-- 独立成行的注释.
print("依旧是正常的代码。") -- 行末的注释.

以上這些注釋叫做短注釋。我們也可以寫長注釋,只要在兩個連詞符後加兩個中括號 ]]

print("正常的代码。")
--[[第一行注释...
第二行注释...
]]

長括號由兩個中括號組成,兩個括號之間可以有任意數數量的等號。等號的數量成為長括號的級別(level)。長括號開頭的注釋會一直持續到遇到同級別的括號。沒有等號的長括號是0級長括號。通過在兩個括號間添加等號,這樣就可以在注釋中輸入連續的兩個中括號。要注釋代碼塊時這樣做十分方便。

--[==[

这是一行包含了0级闭合中括号 ]] 的注释。

但是,这两个闭合的中括号并没有结束注释,因为这一段长注释以2级的中括号开始,只有2级的闭合中括号才能结束它。

]==]

在這個例子裡,0級的閉合中括號 ]] 並不會結束注釋,而2級的 ]==] 可以。


句法

[編輯]

程式語言的句法定義了如何用該程式語言編寫語句和表達式,就像語法定義單詞如何組成句子一樣。語句和表達式可以類比為英語中的句子和單詞。表達式是一小段能被求值的代碼,而語句是由指令和參數組成的、可執行的代碼段。指令的參數可以由一個或多個表達式構成。舉個例子:3 + 5 是一個表達式,variable = 3 + 5 則是一個將表達式的值賦給變量 variable 的語句。

Lua的完整句法可以在Lua手冊的The Complete Syntax of Lua一節找到,手冊中使用了擴展巴克斯-諾爾範式(EBNF)來描述完整的句法,事實上你讀了這一節也很難理解它。擴展巴克斯-諾爾範式(EBNF, Extended Backus–Naur Form) 是一種用於描述其他語言的元語言,類似於原網頁是一個關於其他網頁的網頁、Lua里的原表格定義了其他表格的行為(稍後我們會介紹原表格)。但本書不會過多的涉及到EBNF,像Lua這樣的語言可以使用一種元語言來描述它,也可以用英語的詞和句子來描述它,這才是本書要做的事。

因為英語可以用來描述其他語言,所以它本身一定是一種元語言(因為它符合元語言的定義)。事實上的確如此。又因為程式語言的目的是描述指令,你用英語可以做到同樣的事情,那英語一定是一種程式語言。這在某種程度上也是如此。事實上英語是一種可以描述任何事情的語言。而EBNF是一種專用的語言,程式語言也是一種專用的語言。專用意味著特別適合於做某些事情,同時不能做另一些事情。EBNF 非常適合於描述另一種程式語言,但它不能用來撰寫指令或者傳達消息。程式語言擅長於傳遞指令,但它們不能用來描述其他語言或者傳達消息。

英語則能夠做所有的事情:描述另一門語言、給出指令或傳達消息。但它並不是每一項都很擅長。事實上英語不太適合給出指令,如果用英語像計算機發出一個指令,計算機將無法理解任何內容。這是因為計算機指令需要用非常精確且沒有歧義的方式給出。


獲得 Lua

[編輯]

Lua可以在官網的下載頁面得到。

一些下載說明:如果你直接點擊下載按鈕,事實上你下載的是源碼,估計這不是大多數人想要的。你可能在尋找編譯好的二進制文件,所以你應該在頁面上的其他部分尋找你想要的東西,具體你要下載什麼文件這取決於你使用的系統。本書的目的是教你如何使用這個語言,而不是怎樣使用Lua的各種工具。我們通常假定讀者會在嵌入式的環境中使用Lua,但這並不影響本書的實用性,只是在書中我們不會提到如何獨立的使用Lua。


小測驗

[編輯]

1 "Lua"在葡萄牙語裡意思是什麼?

可用中文(兩個字)或英文(一個單詞,全小寫)作答。

2 下列哪一個是lv0的注釋?

--注释(Comment)
[[注释(Comment)]]
--[[注释(Comment)]]
--[=[注释(Comment)]=]
[=[注释(Comment)]=]

3 擴展巴克斯-諾爾形式(extended Backus–Naur form)是什麼?

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