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