Lua

Lua（，葡萄牙語 “月亮”）是一個簡潔、輕量、可擴充套件的指令碼語言。Lua 有著相對簡單的 C 語言 API 而很容易嵌入應用中。很多應用程式使用 Lua 作為自己的嵌入式指令碼語言，以此來實現可配置性、可擴充套件性。

歷史

Lua 是在 1993 年由羅伯託・耶魯薩林斯希、Luiz Henrique de Figueiredo 和 Waldemar Celes 建立的，他們當時是巴西的里約熱內盧天主教大學的計算機圖形技術組（Tecgraf）成員。Lua 的先驅是資料描述 / 配置語言 “SOL”（簡單物件語言）和 “DEL”（資料錄入語言）。他們於 1992 年–1993 年在 Tecgraf 獨立開發了需要增加靈活性的兩個不同專案（都是用於工程應用的互動式圖形程式）。在 SOL 和 DEL 中缺乏很多控制流結構，需要向它們增加完全的程式設計能力。

在《The Evolution of Lua》中，這門語言的作者寫道：

Lua 主要受到了下列前輩語言的影響：

Modula-2：從中引入了大部份控制結構，if、while、repeat/until。
CLU：多賦值和從函式呼叫的多個返回值，這是對引用引數或顯式指標的更簡單的替代。
C++：“允許區域性變數只在需要的地方宣告的靈巧想法”。
SNOBOL 和 AWK：關聯陣列。
LISP 和 Scheme：在發表於《》的文章中，Lua 的創立者還聲稱，有著單一且無所不在的資料結構機制（列表）的 LISP 和 Scheme，對他們決定將表格開發為 Lua 的主要資料結構起到了主要影響。Lua 的語義久而久之日趨受到 Scheme 的影響，特別是介入了匿名函式和完全的詞法作用域。

Lua 在版本 5.0 之前在類似 BSD 許可證之下發行。自從版本 5.0 以來，Lua 採用了 MIT 許可證。

特性

Lua 是一種輕量語言，它的官方版本只包括一個精簡的核心和最基本的庫。這使得 Lua 體積小、啟動速度快。它用 ANSI C 語言編寫，並以原始碼形式開放，編譯後的完整參考直譯器只有大約 247kB，到 5.4.3 版本，該體積變成 283kB（Linux,amd64），依然非常小巧，可以很方便的嵌入別的程式裡。和許多 “大而全” 的語言不一樣，網路通訊、圖形介面等都沒有預設提供。但是 Lua 可以很容易地被擴充套件：由宿主語言（通常是 C 或 C++）提供這些功能，Lua 可以使用它們，就像是本來就內建的功能一樣。事實上，現在已經有很多成熟的擴充套件模組可供選用。

Lua 是一個動態型別語言，支援增量式垃圾收集策略。有內建的，與作業系統無關的協作式多執行緒支援。Lua 原生支援的資料型別很少，只提供了數值（預設是雙精度浮點數，可配置）、布林量、字串、表格、函式、執行緒以及使用者自定義資料這幾種。但是其處理表和字串的效率非常之高，加上元表的支援，開發者可以高效的模擬出需要的複雜資料型別（比如集合、陣列等）。

語法和語義

Lua 是一種多重程式設計範型的程式設計語言：它只提供了很小的一個特性集合來滿足不同程式設計範型的需要，而不是為某種特定的程式設計範型提供繁雜的特性支援。例如，Lua 並不提供繼承這個特性，但是你可以用元表格來模擬它。諸如名稱空間、類這些概念都沒有在語言基本特性中實現，但是我們可以用表格結構（Lua 唯一提供的複雜資料結構）輕易模擬。正是提供了這些基本的元特性，我們可以任意的對語言進行自需的改造。

Lua 實現了少量的高階特徵比如頭等函式、垃圾回收、閉包、正當尾呼叫、型別轉換（於執行時間在字串和數值之間自動轉換）、協程（協作多工）和動態模組裝載。

3.1 詞法

經典的 Hello World! 程式可以寫為如下：

print ("Hello World!")

或者如下：

print 'Hello World'

print Hello World

在 Lua 中註釋可以於雙連字元並行至此行的結束，類似於 Ada、Eiffel、Haskell、SQL 和 VHDL。多行字串和註釋用雙方括號來裝飾。

下例中實現了一個階乘函式：

function factorial (n)

local x = 1

for i = 2, n do

x = x * i

end

return x

end

3.2 控制流

Lua 有一種型別的條件測試：if then end，它具有可選的 else 和 elseif then 執行控制構造。

通用的 if then end 語句需要三個關鍵字:

if condition then

	--statement body

end

可以增加 else 關鍵字來控制執行，它隨同著在 if 條件求值為 false 之時執行的語句塊：

if condition then

	--statement body

else

	--statement body

end

還可以使用 elseif then 關鍵字依據多個條件來控制執行：

if condition then

	--statement body

elseif condition then

	--statement body

else -- optional

	--optional default statement body

end

Lua 有四種類型的迴圈：while 迴圈、repeat 迴圈（類似於 do while 迴圈）、數值 for 迴圈和通用 for 迴圈。

--condition = true

while condition do

--statements

end

repeat

--statements

until condition

for i = first, last, delta do --delta 可以是負數，允許計數增加或減少的迴圈

--statements

--example: print (i)

end

通用 for 迴圈：

for key, value in pairs (_G) do

print (key, value)

end

將在表格_G 上使用標準迭代器函式 pairs 進行迭代，直到它返回 nil。

可以有巢狀的迴圈，就是在其他迴圈中的迴圈。

local grid =

在影片遊戲開發中，Lua 被程式設計師廣泛的用作指令碼語言，主要由於它的可感知到的易於嵌入、快速執行，和短學習曲線。

在 2003 年，GameDev.net 組織的一次投票，說明了 Lua 是遊戲程式設計的最流行指令碼語言。在 2012 年 1 月 12 日，Lua 被《》宣佈為程式設計工具範疇的 Front Line 獎 2011 年度獲獎者。

大量非遊戲應用也出於可擴充套件性而使用 Lua，比如 TeX 排版設定語言實現 LuaTeX、鍵 - 值資料庫 Redis、文字編輯器 Neovim 和 web 伺服器 Nginx。

透過 Scribunto 擴充套件，Lua 可獲得為 MediaWiki 軟體中的伺服器端指令碼語言，Wikipedia 和其他 wiki 都基於了它。它的應用包括允許從 Wikidata 整合資料到文章中，和助力於。

Lua 可以用於嵌入式硬體，不僅可以嵌入其他程式語言，而且可以嵌入微處理器中，例如 NodeMCU 開源硬體專案將 Lua 嵌入到 Wi-Fi SoC 中，另外，遊戲平臺 Roblox 所有遊戲都是利用 Lua 進行程式設計的。另外，還有中國大陸發起的開源 LuatOS 專案，也是將 Lua 應用到嵌入式領域，但不僅限於 Wifi，它包含 2G/4G/NBIOT 等通訊模組，也包含 stm32/w800 等嵌入式 mcu，同時也支援在 windows/linux 平臺上執行的模擬器。

派生語言

8.1 編譯成 Lua 的語言

以 Lua 作為編譯目標輸出的程式語言：

Moonscript，是動態、空白敏感的指令碼語言，它受到 CoffeeScript 的啟發，編譯成 Lua。
Haxe，支援編譯成 Lua 目標，支援 Lua 5.1-5.3 還有 LuaJIT 2.0 和 2.1。
Fennel，目標為 Lua 的 Lisp 方言。
Urn，建造在 Lua 之上的 Lisp 方言。
Amulet，類 ML 的函式式語言，其編譯器輸出 Lua 檔案。
LunarML，產生 Lua/JavaScript 程式碼的 Standard ML 編譯器。

8.2 方言

，Lua 5.1 的即時編譯器。
，由 Roblox 公司開發，派生自 Lua 5.1，具有，補充特徵並關注於效能。
Ravi，啟用了 JIT 的 Lua 5.3 語言並具有可選的靜態型別。JIT 由型別資訊來指導。
Shine，既有很多擴充套件的 LuaJIT 分叉，包括了模組系統和宏系統。
Glua，嵌入到遊戲蓋瑞模組中作為其指令碼語言的一個 Lua 修改版本。
Teal，用 Lua 編寫的靜態型別的 Lua 方言。

此外，Lua 使用者社群在參考 C 語言實現之上提供了一些 “能力補丁”。