楊杰
(武漢職業(yè)技術(shù)學(xué)院電信學(xué)院,湖北 武漢 430074)
Lua
——以總統(tǒng)為名的移動(dòng)開(kāi)發(fā)語(yǔ)言新貴
楊杰
(武漢職業(yè)技術(shù)學(xué)院電信學(xué)院,湖北 武漢 430074)
本文為移動(dòng)設(shè)備編程人員介紹了一種簡(jiǎn)單、輕量的編程語(yǔ)言——Lua,介紹了這種編程語(yǔ)言的來(lái)歷,詳細(xì)分析了Lua語(yǔ)言的編程特點(diǎn),最后介紹了Lua語(yǔ)言在移動(dòng)設(shè)備開(kāi)發(fā)的應(yīng)用。
Lua;腳本語(yǔ)言
2014年3月,Tiobe公布了最新的編程語(yǔ)言前20位排行榜,和2012年榜單相比,Lua語(yǔ)言從21位升到19位有較大的升幅。
表1 2013年編程語(yǔ)言排行榜
Lua到底是什么編程語(yǔ)言呢?本文以Lua語(yǔ)言為主題,介紹這款以巴西總統(tǒng)的名字命名的移動(dòng)開(kāi)發(fā)語(yǔ)言新貴。
1993年在巴西里約熱內(nèi)盧天主教大學(xué)(Pontifical Catholic University of Rio de Janeiro in Brazil)誕生了一門編程語(yǔ)言,發(fā)明者是該校的三位研究人員,他們給這門語(yǔ)言取了個(gè)浪漫的名字——Lua,在葡萄牙語(yǔ)里代表美麗的月亮。事實(shí)證明它沒(méi)有糟蹋這個(gè)優(yōu)美的單詞,Lua語(yǔ)言正如它名字所預(yù)示的那樣成長(zhǎng)為一門簡(jiǎn)潔、優(yōu)雅且富有樂(lè)趣的語(yǔ)言,圖1為L(zhǎng)ua語(yǔ)言的標(biāo)識(shí)。
圖1Lua語(yǔ)言
當(dāng)初巴西里約熱內(nèi)盧天主教大學(xué)的師生為什么要給這款語(yǔ)言起名為“Lua”,很大程度上是向巴西著名政治家、前任總統(tǒng)路易斯·伊納西奧·盧阿·達(dá)席爾瓦致敬。盧阿總統(tǒng)是巴西歷史上學(xué)歷最低,但是支持率最高的總統(tǒng),深受人民愛(ài)戴。作為巴西國(guó)家電子領(lǐng)域最重要的人才培養(yǎng)基地的里約熱內(nèi)盧天主教大學(xué)計(jì)算機(jī)研究生院把他們?cè)谟?jì)算機(jī)世界中最重要成就“Lua”語(yǔ)言與他們總統(tǒng)同名,可見(jiàn)他們對(duì)Lua語(yǔ)言給予了多么大的希望。
Lua從一開(kāi)始就是作為一門方便嵌入(其它應(yīng)用程序)并可擴(kuò)展的輕量級(jí)腳本語(yǔ)言來(lái)設(shè)計(jì)的,因此它一直遵從著簡(jiǎn)單、小巧、可移植、快速的原則,官方實(shí)現(xiàn)完全采用ANSI C編寫(xiě),能以C程序庫(kù)的形式嵌入到宿主程序中。Lua的每個(gè)版本都保持著開(kāi)放源碼的傳統(tǒng),不過(guò)各版采用的許可協(xié)議并不相同。自5.0版(最新版是5.2)開(kāi)始,由于采用的是著名的MIT許可協(xié)議,Lua在游戲開(kāi)發(fā)、機(jī)器人控制、分布式應(yīng)用、圖像處理、生物信息學(xué)等各種各樣的領(lǐng)域中得到了越來(lái)越廣泛的應(yīng)用。其中尤以游戲開(kāi)發(fā)為最,許多著名的游戲,比如魔獸世界、博德之門、憤怒的小鳥(niǎo)、大話西游,都采用了Lua來(lái)配合引擎完成數(shù)據(jù)描述、配置管理和邏輯控制等任務(wù)。
Lua是一個(gè)被設(shè)計(jì)成用于擴(kuò)展C/C++編程的輕量級(jí)腳本語(yǔ)言[3],它的目標(biāo)是成為一個(gè)很容易嵌入其它語(yǔ)言中使用的語(yǔ)言。Lua讓C/C++編寫(xiě)的代碼調(diào)用Lua腳本,同時(shí)C/C++函數(shù)也能夠在Lua腳本中調(diào)用。與C/C++代碼的交互性,讓Lua在應(yīng)用程序開(kāi)發(fā)中有著廣泛的應(yīng)用基礎(chǔ)。很多應(yīng)用程序使用Lua作為自己的嵌入式腳本語(yǔ)言,以此來(lái)實(shí)現(xiàn)可配置性、可擴(kuò)展性。
2.1 可以和C/C++語(yǔ)言集成
很多種語(yǔ)言包括Lisp、Scheme、Python、Perl、Bash、VBA、SQL等等,它們沒(méi)有一個(gè)可以像Lua那樣可以和C語(yǔ)言混合使用。C語(yǔ)言的API非常干凈和直觀,程序員花很短的時(shí)間就可以上手。
為什么這個(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)。
可擴(kuò)展的Lua并不像其它許多“大而全”的語(yǔ)言那樣,包括很多功能,比如網(wǎng)絡(luò)通訊、圖形界面等。但是Lua提供了非常易于使用的擴(kuò)展接口和機(jī)制:由宿主語(yǔ)言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來(lái)就內(nèi)置的功能一樣。
2.2 快速、簡(jiǎn)潔
相比于其它語(yǔ)言,Lua的實(shí)現(xiàn)是非常高效的。也許是因?yàn)長(zhǎng)ua使用的是“基于寄存器的虛擬機(jī)”,而不是基于堆棧的虛擬機(jī)。你幾乎不需要顧慮Lua代碼的性能問(wèn)題。
輕量級(jí)Lua語(yǔ)言的官方版本只包括一個(gè)精簡(jiǎn)的核心和最基本的庫(kù)。這使得Lua體積小、啟動(dòng)速度快,從而適合嵌入在別的程序里。5.0.2版的Lua的內(nèi)核小于120KB,而Python的內(nèi)核大約860KB,Perl的內(nèi)核大約1.1MB[4]。
Lua的語(yǔ)法類似PASCAL和Modula,但更加簡(jiǎn)潔,所有的語(yǔ)法產(chǎn)生式規(guī)則(EBNF)不過(guò)才60幾個(gè)。熟悉C和PASCAL的程序員一般只需半個(gè)小時(shí)便可將其完全掌握。而在語(yǔ)義上Lua則與Scheme極為相似,Scheme的continuation與協(xié)程也基本相同,只是自由度更高。最引人注目的是,兩種語(yǔ)言都只提供唯一一種數(shù)據(jù)結(jié)構(gòu):Lua的表和Scheme的列表(list)。正因?yàn)槿绱耍腥松踔练QLua為“只用表的Scheme”。
2.3 教育作用
雖然這不是一個(gè)編程語(yǔ)言的功能,但是使用Lua可以使得程序員對(duì)計(jì)算機(jī)科學(xué)的整體了解有所提高,使程序員對(duì)虛擬機(jī)是如何實(shí)現(xiàn)的有了一個(gè)了解。這一切都得益于Lua有條不紊的改進(jìn)。
2.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è)方法。
2.5 任何東西都是一張表
在Lua中,任何一個(gè)變量類型都是一張表,例如Array,Hash,“module”或者全局變量等等。也就是說(shuō)你可以“require”一些模塊(類似Python的import語(yǔ)句)并且把結(jié)果當(dāng)作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更容易使用。
2.6 一致性
Lua是非常一致的語(yǔ)言。它的很多功能都是做得恰到好處。比如說(shuō),Lua沒(méi)有“for”循環(huán)。直到Lua 4.0,也就是Lua語(yǔ)言發(fā)布7年以后才有“for”循環(huán)。這是因?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)。
2.7 可移植性
Lua基本上可以在任何環(huán)境中運(yùn)行。Lua的代碼是按照“Clean ANSI C”的標(biāo)準(zhǔn)編寫(xiě)的,所以如果你有一個(gè)C的運(yùn)行環(huán)境,你就可以運(yùn)行Lua。
2011年一個(gè)小鳥(niǎo)保衛(wèi)鳥(niǎo)蛋的游戲——《憤怒的小鳥(niǎo)》讓Lua語(yǔ)言風(fēng)靡開(kāi)發(fā)者的世界。以快速小巧著稱的Lua擁有在目前所有腳本引擎中最快的運(yùn)行速度,這樣的特性讓Lua成為用作嵌入式腳本的最佳選擇。但是,Lua語(yǔ)言被人們所熟知還要追述到2010年喬布斯的蘋果將Lua語(yǔ)言引進(jìn)iOS平臺(tái),直到現(xiàn)在已經(jīng)有很多iPhone的應(yīng)用寫(xiě)入到Lua中。而Lua語(yǔ)言憑借其代碼幾乎能在所有操作系統(tǒng)和移動(dòng)終端上編譯運(yùn)行的這一特性,不但可以在iOS這一移動(dòng)平臺(tái)開(kāi)發(fā),同樣也可以在Android等其它平臺(tái)上開(kāi)發(fā)。有了Corona SDK以后Lua語(yǔ)言不但可以支持iOS,還可以支持Android平臺(tái)。以上這些原因使Lua語(yǔ)言在Tiobe編程語(yǔ)言排行榜上迅速攀升,成為移動(dòng)開(kāi)發(fā)領(lǐng)域的新貴。
Lua是一種非常簡(jiǎn)單但是強(qiáng)大的編程語(yǔ)言。隨著應(yīng)用程序的需求不斷增加,程序員需要不斷改變程序的結(jié)構(gòu)。如今,許多程序員在用兩種不同的語(yǔ)言編程:一種是用于編寫(xiě)一個(gè)功能強(qiáng)大的“虛擬機(jī)”,另一種是用于基于單機(jī)的程序。Lua作為一種優(yōu)秀的編程語(yǔ)言,專為后者服務(wù)。Lua語(yǔ)言適用平臺(tái)小到PC-DOS大到CRAY大型機(jī)。它的語(yǔ)法簡(jiǎn)單、語(yǔ)義簡(jiǎn)單,是一種靈活的編程語(yǔ)言。
[1]TIOBE Programming Community Index.TIOBE Programming,2014.
[2]lua官方網(wǎng)站.
[3]LuaJIT 2.0正式版發(fā)布. Lua編譯器.中國(guó)Linux聯(lián)盟,2012.
[4]Paul Schuytema,Mark Manyen.Lua游戲開(kāi)發(fā)實(shí)踐指南(Game Development with Lua)[M].北京:機(jī)械工業(yè)出版社,2013.
[5]姚蕾.基于LUA語(yǔ)言的趣味游戲設(shè)計(jì)[J].?dāng)?shù)字技術(shù)與應(yīng)用.2013,(6).
Lua——The Upstart Mobile Development Language In the Name of the President
Yang Jie
(Wuhan Polytechnic,Wuhan 430074,Hubei)
This article describes a kind of mobile device programmer language-Lua.Lua is simple and lightweight.This article describes its origin,and analyzes its programming features.Finally,it describes its application in mobile device development.
Lua;scripting language
楊杰,男,湖北潛江人,碩士,講師。研究方向:電子信息技術(shù)。