為什么我選擇Lua?
在這篇文章中,我將向你解釋為什么要使用Lua。我寫(xiě)這篇文章最初的動(dòng)機(jī)是由于Lua郵件列表中的一則消息 “why isn't Lua more widely used?” 。針對(duì)這個(gè)消息的回復(fù)各種各樣,有的說(shuō)是因?yàn)槿鄙兕悗?kù),而我更贊同另外一個(gè)觀點(diǎn),那就是大部分人都不喜歡自己動(dòng)手 (do it yourself)的方式來(lái)解決問(wèn)題。我常常把Lua比作Arch Linux。這也就注定了Lua是一個(gè)小眾產(chǎn)品。下面我將列出幾條為什么我要使用Lua的理由:
1. 可以和 C/C++ 集成
我的編程經(jīng)歷不長(zhǎng),但是我已經(jīng)使用過(guò)很多種語(yǔ)言了,包括Lisp,Scheme,Python,Perl,Bash,VBA,SQL等等。但是它們沒(méi)有一個(gè)可以像Lua那樣可以和C混著使用。C語(yǔ)言的API非常的干凈和直觀,你花一個(gè)下午的時(shí)間就可以上手了。如果你對(duì)這個(gè)感興趣的話,你可以看看“PIL's section on the C API” 。
為什么這個(gè)特性很重要呢?首先,如果你有現(xiàn)成的C/C++類庫(kù)的話,你可以很容易的在Lua中調(diào)用這些API?;蛘吣阋部梢詫?xiě)一個(gè)腳本讓Lua在C中執(zhí)行。這也意味著Lua的程序不會(huì)有速度問(wèn)題。如果你還是覺(jué)得Lua不夠快的話,你可以用C完全重寫(xiě)這段代碼。雖然別的語(yǔ)言的程序也可以用C重寫(xiě),但是我還沒(méi)有發(fā)現(xiàn)誰(shuí)能比Lua更方便的做到這一點(diǎn)。
2. 快速、簡(jiǎn)潔
相比于其他語(yǔ)言,Lua的實(shí)現(xiàn)是非常高效的。也許是因?yàn)長(zhǎng)ua使用的是“基于寄存器的虛擬機(jī)” 而不是基于堆棧的虛擬機(jī)?;蛘哒f(shuō)使用Lua的開(kāi)發(fā)者都非常的牛逼。不管怎樣,你幾乎不需要顧慮Lua代碼的性能問(wèn)題。
但是如果你對(duì)性能還是不滿意的話,你可以嘗試使用LuaJIT:
“LuaJIT是公認(rèn)的運(yùn)行最快的動(dòng)態(tài)語(yǔ)言的實(shí)現(xiàn),并且對(duì)內(nèi)存的使用少,虛擬機(jī)占用低于125K,JIT編譯器占用不到85K (在x86環(huán)境中)。”
LuaJIT可以幾乎和C代碼餓速度媲美。不管怎樣,如果你還是對(duì)速度不滿意的話,你可以試試我在***點(diǎn)中提出的建議。
3. 教育作用
雖然這不是一個(gè)編程語(yǔ)言的功能,但是我發(fā)現(xiàn)使用Lua讓我對(duì)計(jì)算機(jī)科學(xué)的整體了解有所提高。比如說(shuō),這篇文章是關(guān)于 Lua 5.0 的實(shí)現(xiàn)的,讓我對(duì)虛擬機(jī)是如何實(shí)現(xiàn)的有了一個(gè)了解。閱讀源代碼讓我大開(kāi)眼界。我認(rèn)為這一切都得益于Lua有條不紊的改進(jìn)
4. 函數(shù)式編程
Lua提供了函數(shù)式編程的架構(gòu),讓編程更加的有趣。例如 anonymous functions, higher order functions, lexical closures,proper tail calls等等。這些特性不是語(yǔ)言的一些語(yǔ)法糖,而是Lua從底層就整合了這些特性。比如說(shuō),Lua的每一個(gè)方法都是一個(gè)值(比如數(shù)字2,或者字符串“ktr”),也就意味著每一個(gè)方法都是匿名的。你只要給它取個(gè)名字,然后你就可以調(diào)用它了。你可以給print重新賦值:
print = math.sin
你可以利用這個(gè)功能創(chuàng)建沙箱。如果print是一個(gè)危險(xiǎn)的操作,你可以替換成你自己的print方法或者從全局中刪除這個(gè)方法。
5. 任何東西都是一張表
在Lua中,任何一個(gè)變量類型都是一張表,例如Array,Hash,“module”或者全局變量等等。也就是說(shuō)你可以“require”一些模塊(類似Python的import語(yǔ)句)并且把結(jié)果當(dāng)錯(cuò)table來(lái)處理。在Python中,你可以 __import__('...') 一些模塊,然后返回值的變量就可以通過(guò)類似 var(module) 的方式來(lái)訪問(wèn)。在Lua中,你可以通過(guò) module[var] 的方式來(lái)訪問(wèn)模塊中的變量。我這里提到Python是為了強(qiáng)調(diào)不同之處,說(shuō)明Lua更容易使用。
這也讓你學(xué)習(xí)Lua的語(yǔ)法更加快速。你不用擔(dān)心list和dictionary、package有什么不同。
6. 一致性
不知你是否意識(shí)到,Lua是非常一致的語(yǔ)言。它的很多功能都是做的恰到好處。比如說(shuō),Lua沒(méi)有“for”循環(huán)直到Lua 4.0,也就是Lua語(yǔ)言發(fā)布7年以后。這是因?yàn)閣hile循環(huán)更為通用,而且語(yǔ)法更簡(jiǎn)潔。Lua的開(kāi)發(fā)團(tuán)隊(duì)相對(duì)來(lái)說(shuō)比較保守,他們不接受patch,所以Lua的進(jìn)化比較緩慢,但是比較平穩(wěn)。你知道所有的功能都是有規(guī)劃的在進(jìn)行,也就意味著你不能指望你所期待的功能可以被很快的實(shí)現(xiàn)。
7. 可移植性
關(guān)于這一點(diǎn)我不會(huì)講很多細(xì)節(jié),但是Lua基本上可以在任何環(huán)境中運(yùn)行。Lua的代碼是按照“Clean ANSI C”的標(biāo)準(zhǔn)編寫(xiě)的,所以如果你有一個(gè)C的運(yùn)行環(huán)境,你就可以運(yùn)行Lua。
總結(jié):Lua是一門非常簡(jiǎn)單但是強(qiáng)大的語(yǔ)言。
原文鏈接:http://www.oschina.net/news/26081/why-i-choose-lua
【編輯推薦】