使用者: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)
一種元語言
一種標記語言