關于Lua語言的概述
@作者:evandrolg, 翻譯:cloudfeng
我在2013年的時候才是玩Lua,是受到一個使用Lua有段時間,并且告訴我關于它好玩的事情的朋友影響。在那時,我已經有幾年的編程的經驗了,我已經與不同的語言模式都打過交道,比如Python、Ruby、JavaScript、Shell、C#和Java,并且使用它們有一定程度的專家水平。
從那以后,我使用經常使用Lua編程,并且在一定程度上把Lua當作工作之外最喜歡的語言來做開發。此外,我在周末的時間做了一個小應用程序:Pegasus.lua,在空余時間開發了以開源的http服務器,它完全是用Lua編寫的。
我不具備Lua開發者社區所具備的傳統技能。我只是一個web開發人員,主要是把Lua作為C/C++應用的嵌入腳本語言。而Lua開發者社區的焦點是因為Lua作為一種高層次的語言,它具有快速、輕量級的解釋器(Lua的解釋器大小小于200kB!),而不像其他的動態語言,比如Python和Ruby。
Lua語言中最讓我關注是它的簡單性。Lua的語法極其友好并且有一個干凈的核心,具有編程經驗的人(特別是對解釋型語言有一定了解的人),能夠在幾分鐘之內就能掌握Lua語言。實際上,我認為Lua是我學習編程語言中最為簡單的一種語言,主要是因為Lua沒有復雜的語法,而且我有JavaScript編程工作經歷(是的,Lua與JavaScript十分相似,但是這就是它的優點!)
下面列出Lua的優點和缺點是我在使用Lua所發現的:
優勢:
Lua實際上有8種類型:nil,string(字符串),number(數值類型),function(函數),boolean(布爾類型),thread(線程), userdata(用戶類型)和table(表) (表是此語言中最牛的魔術)
在Lua中你不能通過類實現面向對象編程,但是可以像Self,JavaScript和Io一樣通過原型實現面向對象技術。
元表是一個很棒的主意!盡管剛開始的時候我對它感到十分困惑,但是員表的概念在Lua中是十分棒的。它是一種顯示的技術實現操作符的重載,同時也可以擴展對象(表)的屬性。
在Lua中,函數是第一類值,與JavaScript十分相似。這意味著,Lua允許程序員可以把函數做為函數的參數、可以把它聲明為變量、可以把它存在數據結構中,在JavaScript中對函數的操作都可以應用到Lua中。我最為喜歡Lua中對函數如此方便操作。
支持閉包;
你可以通過return語句來導出模塊。Ok,詳細的說,當我第一眼看到Lua的這種語法的時候,我感覺到特別的自然。
Lua解釋器相比于其他動態類型語言,比如PHP、Python、Ruby,甚至Node.js都要快。
簡單的實現元編程技術(ok,它是一種動態語言...)
-
盡管Lua已經減少了核心特性的數目,但是它允許程序員使用簡單的方式擴展語言的特性,比如:
你想在你的原始類型中加入屬性么?Ok,你可以在你的代碼中插入[對象信息]
(http://lua-users.org/wiki/ObjectProperties)“我是一個Python程序員,并且我喜歡為文檔”。沒問題,可以把Decorators And Docstrings加入到Lua中。
- LuaJIT 是目前動態語言中最快的即時編譯器之一。
缺陷:
缺少debug工具的支持。我知道很多程序員并不使用debug工具,但是我真喜歡此類工具并且我一直通過print方式來debug我的代碼。
Lua沒有傳統的錯誤處理方式,比如
try
,catch
和finally
。事實上,你可以用pcall
函數來處理錯誤,但是我認為這種方式不是十分自然。每次我需要處理錯誤的時候,我經常使用下面try-catch方案:
-- try-catch.lua
function catch(what)
return what[1]
end
function try(what)
status, result = pcall(what[1])
if not status then
what[2](result)
end
return result
end
require "try-catch"
try {
function()
error('oops')
end,
catch {
function(error)
print('caught error: ' .. error)
end
}
}
- Lua 不支持三目條件運算符。我認為它并不是語言中很重要的特性,但是我必須承認我確實喜歡它,比如我需要某些簡短的檢測存儲在變量中的值。可以把它作為附加的特性,你可以創建相關的函數來擴展三元條件運算符。
可以直接使用
(cond and false-value or x)
,條件是cond必須為真才行。所以可以創建一個函數來實現?:運算符
-- T 和 F必須可以求值的
function ternary(cond, T, F)
if cond then
return T
else
return F
end
end
print("blah: " .. ternay(a == true, "blah", "nahblah"))
一種更為廣泛的方式是使用函數作為參數
function ternay (cond, T, F, ...)
if cond then
return T(...)
else
return F(...)
end
end
print("blah: " .. ternary(a == true ,function() return "blah" end ,function() return "nahblah" end))
- 在社區中沒有提供足夠的庫來解決編程領域中的常見問題。可以是這個社區的特征吧(在大的項目中打發小的解決方案,但是并不會將其開源)或表明Lua并不是很流行的語言。我碰到很多難題,比如找到一個可靠的XML解析庫(我已經找到一個很好的XML庫,但是它不是很流行。)
我所列出的Lua的缺陷是可以理解,畢竟Lua專注于一個輕、快的解釋器。Lua的優勢可以彌補其缺陷,是因為它提供了一種簡單的方式來擴展該語言的核心特性。
Lua作為其他編程工具,并非是“銀彈”。比如我并不認為它是web核心應用的理想工具。不僅是因為它自身的限制,而且也web環境中缺少成熟的項目來解決比較常見的問題--連接數據庫、緩存工具、MVC,等等。對于這些問題,Python和Ruby社區都提供成熟的庫和框架以及廣泛的測試。
然而,因為Lua是高層次的語言并且在動態語言中有一個最快的解釋器,它可以作為應用中出現語言性能問題比較好的選擇,比如通信、游戲、那些內存受限的嵌入式應用。
注意:本文遵守MIT 條款。