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