漫話Lua:在游戲中崛起之后 這個(gè)熱門語(yǔ)言何去何從?
原創(chuàng)我其實(shí)是非常不想討論編程語(yǔ)言的好壞的,一個(gè)是因?yàn)檫@本身無(wú)法定論,就好像非要爭(zhēng)論到底是中文好還是英文好一樣;另一個(gè)是一旦有人談?wù)摮绦蛘Z(yǔ)言,必然各種聲音四起,導(dǎo)致沒(méi)完沒(méi)了的“戰(zhàn)爭(zhēng)”。把以前關(guān)于語(yǔ)言的爭(zhēng)論打印出來(lái),恐怕可以蓋一座摩天大樓了。以下內(nèi)容只是我個(gè)人觀點(diǎn),存在偏見(jiàn)和誤解還請(qǐng)?jiān)?,如果有不同觀點(diǎn),可以討論,我保留態(tài)度。
既然要聊Lua,那么首先需要介紹一下它,Lua是一門設(shè)計(jì)優(yōu)雅,輕量、易擴(kuò)展的可嵌入式腳本語(yǔ)言。提起它,但凡使用過(guò)的朋友都會(huì)聯(lián)想到這么幾個(gè)關(guān)鍵詞:輕量、快速、可嵌入等等。
一門語(yǔ)言想要流行,很大程度上并不取決于語(yǔ)言本身,而是由行業(yè)決定的。近年來(lái)Lua的流行,不得不承認(rèn),很大程度上是因?yàn)槟ЙF世界使用它所帶來(lái)的影響,但是這也只是達(dá)成了大家使用它的前提,如果不是Lua自身的一些特點(diǎn)讓大家覺(jué)得值得用它,Lua也不會(huì)有現(xiàn)在這么火爆。
我覺(jué)得Lua在游戲領(lǐng)域以及嵌入式設(shè)備上能夠獲得那么多人的支持,最主要的原因有3點(diǎn):
首先是Lua足夠的小。有人說(shuō)小也能夠成為用它的理由嗎?在別的領(lǐng)域可能很難讓人信服,但是在編寫程序上,這絕對(duì)有說(shuō)服力。Lua官網(wǎng)發(fā)布的版本,比如Lua5.1,實(shí)現(xiàn)的內(nèi)容包括整個(gè)Lua的核心加上幾個(gè)基本的庫(kù),整個(gè)實(shí)現(xiàn)也就只有2萬(wàn)多行代碼,代碼量如此的精簡(jiǎn),讓人不得不佩服Lua作者在追求語(yǔ)言的簡(jiǎn)練性上所做出的努力。Lua源碼采用C語(yǔ)言實(shí)現(xiàn),能夠非常容易地嵌入到C\C++的程序中,因?yàn)長(zhǎng)ua的小巧,你可以根據(jù)自己需要來(lái)調(diào)整Lua的源碼,讓它滿足自己程序的要求,在閱讀源碼的時(shí)候,可以非常清楚得弄明白,語(yǔ)言的內(nèi)部到底在做些什么,而不必去擔(dān)心因?yàn)橐胨霈F(xiàn)一些意想不到的bug。
第二個(gè)使用Lua的原因是它極佳的可移植性。因?yàn)長(zhǎng)ua使用ANSI C編寫而成,這使得它天生就具備極佳的可移植性,我們能夠在各種設(shè)備的開發(fā)上使用它,比如目前最火的手機(jī)軟件的開發(fā),國(guó)內(nèi)流行的手游開發(fā)模式cocos2dx + Lua也證明了這一點(diǎn)。相信在不久的將來(lái),我們能夠在更多的設(shè)備開發(fā)中發(fā)現(xiàn)Lua的身影。
另一個(gè)重要的原因我認(rèn)為是Lua從5.0版本后使用了MIT協(xié)議進(jìn)行發(fā)布,這使得幾乎所有人都可以把它放進(jìn)自己的產(chǎn)品中,而不用去擔(dān)心版權(quán)的問(wèn)題,至少對(duì)于商業(yè)軟件來(lái)說(shuō),這一點(diǎn)屬于必須考慮的問(wèn)題之一。使用它會(huì)不會(huì)有法律糾紛,修改它有沒(méi)有那么自由,這些也是一個(gè)有責(zé)任的程序員所必須面對(duì)的問(wèn)題。
Lua語(yǔ)言受到這么多開發(fā)者的擁戴,在我看來(lái)也是十分正常的。一門程序語(yǔ)言能不能得到使用者的喜愛(ài),最重要的一個(gè)標(biāo)準(zhǔn)就是能否拿它實(shí)現(xiàn)自己想要的目標(biāo)。Lua的小巧,代碼的精煉,使得它相對(duì)于其他龐大的腳本語(yǔ)言來(lái)說(shuō)有著極大的優(yōu)勢(shì),這門語(yǔ)言是否剔除了不必要的冗余結(jié)構(gòu),是否干凈、整潔、KISS,這都是非常重要的,它內(nèi)部實(shí)現(xiàn)的各個(gè)模塊是否邏輯正交,是否已經(jīng)達(dá)到最簡(jiǎn)。作為一名程序員,我當(dāng)然希望我所使用的語(yǔ)言如同數(shù)學(xué)公理系統(tǒng)一樣完美,滿足相容、獨(dú)立、完備的性質(zhì)。當(dāng)然,我不是說(shuō)Lua達(dá)到了這樣的標(biāo)準(zhǔn),在我使用過(guò)的所有語(yǔ)言當(dāng)中,我也找不到滿足這樣標(biāo)準(zhǔn)的語(yǔ)言,但是Lua精簡(jiǎn)的源碼,卻是讓人眼前一亮。
不得不說(shuō)目前Lua用的最火的地方,還是在游戲開發(fā)上(當(dāng)然,像Adobe Photoshop Lightroom這樣大量使用Lua的軟件也不在少數(shù))。我們看到除了《魔獸世界》、《孤島危機(jī)》這樣的PC端大作使用它以外,像《憤怒的小鳥》以及網(wǎng)上流行的開源版本的《Flappy Bird》也使用Lua作為腳本來(lái)處理從邏輯到UI的各種工作。在我自己的項(xiàng)目當(dāng)中,也大量的使用到了Lua,無(wú)論是作為服務(wù)端的邏輯,還是客戶端的UI處理,Lua的優(yōu)勢(shì)都顯而易見(jiàn),它的各種語(yǔ)言特性讓人處處驚喜。Lua的語(yǔ)法雖然談不上極為簡(jiǎn)潔,但是寫起來(lái)是十分舒服的,而且讓看代碼的人也不會(huì)很痛苦,心理負(fù)擔(dān)相對(duì)較小;Lua中最重要的數(shù)據(jù)類型table類型,也讓人在使用的時(shí)候有一種發(fā)現(xiàn)寶藏的感覺(jué),table的實(shí)現(xiàn)方式采用數(shù)組和散列表的組合,無(wú)論是查詢效率還是插入效率,都讓人滿意,至少在處理一般邏輯問(wèn)題上,table的描述能力和性能是十分強(qiáng)大的;作為一門動(dòng)態(tài)類型語(yǔ)言,Lua的gc處理以及弱引用機(jī)制也讓人印象深刻;在面向?qū)ο蠓矫?,Lua自身所具備的機(jī)制(比如元表)提供了實(shí)現(xiàn)面向?qū)ο缶幊痰亩喾N途徑;還有Lua的協(xié)程機(jī)制,對(duì)于編寫并行邏輯是非常有用的,它讓我們可以用同步的方式寫出異步回調(diào)的邏輯,減少學(xué)習(xí)的時(shí)間,降低使用的成本。Lua的性能也是它的一大亮點(diǎn),基于寄存器的虛擬機(jī)本來(lái)是Lua作者的一次嘗試,但是結(jié)果證明,這是成功的。Lua還有各種各樣的特點(diǎn),比如優(yōu)秀的C API等等,所以我覺(jué)得,在未來(lái),Lua將會(huì)繼續(xù)在各個(gè)設(shè)備和領(lǐng)域得到廣泛的運(yùn)用。
因?yàn)樽罱麹ua的火爆,有人拿它和Javascript做對(duì)比,既然編輯也問(wèn)到這個(gè)問(wèn)題,我也說(shuō)一下我的看法,Javascript的火爆是有目共睹的,在github上,js的代碼項(xiàng)目無(wú)疑是最多,自從存在Web應(yīng)用以來(lái),js就一直被人們所關(guān)注,并在不斷的發(fā)展壯大當(dāng)中,現(xiàn)在越來(lái)越多的非Web應(yīng)用也采用了js來(lái)編寫,它無(wú)疑是一種被大家認(rèn)可且喜愛(ài)的語(yǔ)言,它已經(jīng)被證明擁有構(gòu)建大規(guī)模復(fù)雜程序的能力。它和Lua有許多相似之處,也有大量的不同,這源于js的設(shè)計(jì)目的本來(lái)就和Lua是有所差異的,Lua的作者也曾說(shuō)過(guò),Lua并非是為了設(shè)計(jì)成為主流的編程語(yǔ)言,但在嵌入C\C++程序,或者是作為API的封裝以及作為宿主程序和邏輯層之間的粘合劑,Lua有著天然的優(yōu)勢(shì)。到底是使用js還是選擇Lua則要根據(jù)它們自身的特點(diǎn)以及自己所面對(duì)的應(yīng)用場(chǎng)景來(lái)定。
前面談的,其實(shí)在各種資料和業(yè)內(nèi)新聞以及博客中都能夠看到,為了表示我沒(méi)有敷衍了事,下面說(shuō)點(diǎn)我對(duì)Lua未來(lái)的想法。
Lua目前被大家廣泛使用,有一部分原因是因?yàn)樗鼜?qiáng)大的性能,我們可以在網(wǎng)上看到各種語(yǔ)言和Lua比速度、比性能的報(bào)告,但是在未來(lái),隨著計(jì)算機(jī)運(yùn)算速度的提升,我相信我們考慮性能問(wèn)題會(huì)越來(lái)越弱化,這并不是說(shuō)性能問(wèn)題不重要,在任何時(shí)候,追求性能的卓越都是值得鼓勵(lì)的,而且在某些方面,性能是越快越好,比如一些數(shù)值運(yùn)算或者是圖形的渲染處理等等。但是作為程序員,更多的去關(guān)注程序的邏輯,把性能問(wèn)題交給編譯器才是我理想中的情況。在這種弱化性能問(wèn)題的情況下,Lua能否繼續(xù)被廣泛使用呢?這是我的第一個(gè)考慮。
其次,在未來(lái),我相信大多數(shù)語(yǔ)言的核心都會(huì)被設(shè)計(jì)的精簡(jiǎn)、強(qiáng)壯,而各種各樣的庫(kù)才是我們大家關(guān)注的焦點(diǎn),當(dāng)程序庫(kù)成為比語(yǔ)言核心更為重要的東西的時(shí)候,一個(gè)很明顯的例子就是python語(yǔ)言,python有著各種各樣豐富多彩的程序庫(kù),我身邊的朋友使用python的時(shí)候,從來(lái)就不操心有功能沒(méi)辦法實(shí)現(xiàn),因?yàn)橐呀?jīng)有大量可用的程序庫(kù)可以選擇,而相比下來(lái),Lua的程序庫(kù)就要少了許多,Lua的能力更多的是依靠它的宿主語(yǔ)言賦予的,那么將來(lái)Lua能否擁有一些可供選擇,不需要重新造輪子,完善的程序庫(kù)供我們使用呢?這是我的第二個(gè)考慮。
第三個(gè)考慮是,在Lua廣泛使用之前,使用者的人數(shù)比較少,Lua的作者可以對(duì)語(yǔ)言進(jìn)行大刀闊斧的修改,而不會(huì)引起大規(guī)模的恐慌或不滿,每個(gè)用戶都可以向作者提出自己的意見(jiàn)和方案,就好像拍美劇一樣,每一集都由不同的編劇來(lái)寫,但是最終由總編劇來(lái)把握整個(gè)劇情的發(fā)展,Lua的一切修改,最終都由Lua的作者來(lái)決定并實(shí)現(xiàn),用戶數(shù)少的時(shí)候這沒(méi)有問(wèn)題,但是當(dāng)用戶數(shù)量增多之后,這種發(fā)布方式能否跟得上現(xiàn)代開源軟件的發(fā)展趨勢(shì)呢?比如Lua5.2和LuaJIT的分裂就讓我們痛心疾首,而Lua各個(gè)版本之間的不兼容也讓我們寢食難安,我懷著良好的心態(tài)相信這最終會(huì)得到解決。
最后我希望Lua的社區(qū)能夠更加活躍,更加團(tuán)結(jié)一些,由于Lua的核心非常精簡(jiǎn),而且提供了強(qiáng)大的可擴(kuò)展性,目前很難統(tǒng)一或者是規(guī)劃Lua的方方面面,舉個(gè)例子,比如用Lua實(shí)現(xiàn)面向?qū)ο蟮姆椒?,就有好多個(gè)不同的版本,這些風(fēng)格分裂的代碼根本無(wú)法統(tǒng)一起來(lái),這讓Lua的初學(xué)者比較苦惱,當(dāng)然這也會(huì)激發(fā)各種各樣的靈感,畢竟語(yǔ)言定要處在發(fā)展當(dāng)中才有生命力。
在新的一年中,我相信Lua的使用度會(huì)越來(lái)越高,而且隨著可穿戴式設(shè)備的火熱,我們將會(huì)在這些領(lǐng)域也能看到Lua的身影。當(dāng)然,在游戲行業(yè),Lua天生可擴(kuò)展和性能良好的語(yǔ)言特性,讓它成為C\C++編寫的游戲程序,去選擇腳本語(yǔ)言的首要考慮,今年這個(gè)趨勢(shì)應(yīng)該不會(huì)改變,而且隨著移動(dòng)端游戲的火熱開發(fā),使用Lua的人數(shù)將會(huì)越來(lái)越多,我想Lua的作者恐怕是想象不到,有一天,這門語(yǔ)言會(huì)受到如此大范圍的關(guān)注。