国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

腳本語言Lua與C++語言交互方法的研究

2018-11-26 09:33趙正旭申躍杰左宗成
電腦知識與技術(shù) 2018年23期
關(guān)鍵詞:腳本語言堆棧調(diào)用

趙正旭 申躍杰 左宗成

摘要:當(dāng)前,代價(jià)高和周期長是C++語言在開發(fā)大型程序中存在的主要問題。為了解決這一問題,提出C++語言與腳本語言Lua進(jìn)行交互的方法。利用Lua語言小巧簡單、動態(tài)靈活的特點(diǎn),達(dá)到降低公司開發(fā)代價(jià),縮短程序開發(fā)周期的目的。重點(diǎn)介紹了Lua與C++之間傳遞消息的中介-Lua堆棧,以及Lua與C++語言之間相互調(diào)用方法。

關(guān)鍵詞: Lua API;Lua 腳本;Lua/C++接口;Lua堆棧;Lua函數(shù)

中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2018)23-0135-03

Abstract: At present, high cost and long cycle are the problems of C++ language in developing large programs. To solve this problem, it is proposed to make the interaction between C++ and scripting language Lua. Using the simple, dynamic and flexible features of Lua language, it can reduce the development cost of the company and shorten the program development cycle. This paper focuses on the Lua stack, an intermediate for data exchange between Lua and C++ languages, and the method of calling each other between Lua and C++.

Key words:Lua API; Lua script; Lua/C++ interface; Lua stack; Lua function

1 引言

目前,軟件行業(yè)的競爭越發(fā)激烈。軟件開發(fā)效率作為一個(gè)影響企業(yè)競爭能力的重要因素,越來越受到行業(yè)的重視。傳統(tǒng)的C++語言,從編寫到編譯到鏈接再到最后的運(yùn)行,過程復(fù)雜。當(dāng)所要開發(fā)系統(tǒng)規(guī)模較大時(shí),就會出現(xiàn)開發(fā)效率低、成本高的問題。腳本語言Lua語法簡單,功能強(qiáng)大,易與C++語言進(jìn)行交互。在利用C++語言開發(fā)程序時(shí),嵌入Lua語言,可以大大降低軟件開發(fā)代價(jià)。

2 Lua語言的簡要介紹

1993年,在巴西里約熱內(nèi)盧天主教大學(xué),Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo組成的科研小組開發(fā)了腳本語言Lua。設(shè)計(jì)目的是為了嵌入應(yīng)用程序中,從而為應(yīng)用程序提供靈活的擴(kuò)展和定制功能。游戲《魔獸爭霸》的發(fā)行,讓Lua語言在游戲界變?yōu)樾聦?。游戲只是一個(gè)更容易被大多數(shù)人認(rèn)識到的領(lǐng)域,但Lua可被運(yùn)用的領(lǐng)域不止游戲。它也可以作為獨(dú)立應(yīng)用腳本、web應(yīng)用腳本進(jìn)行開發(fā)[1]。隨著計(jì)算機(jī)技術(shù)的發(fā)展和工業(yè)企業(yè)生產(chǎn)的競爭,產(chǎn)品的設(shè)計(jì)過程需要借助于計(jì)算機(jī)技術(shù)在虛擬環(huán)境中進(jìn)行[2]。產(chǎn)品設(shè)計(jì)往往多樣化,如果每一種設(shè)計(jì)都要重新開發(fā)的話,浪費(fèi)人力物力。而Lua靈活的擴(kuò)展和定制功能,正好滿足產(chǎn)品設(shè)計(jì)多樣化的特點(diǎn),為公司節(jié)省資源。這也促進(jìn)了Lua語言在虛擬現(xiàn)實(shí)技術(shù)中的推廣。

2.1 Lua語言的優(yōu)點(diǎn)

強(qiáng)移植性:Lua幾乎可以運(yùn)行在所有我們聽過的操作系統(tǒng)上。Lua不是通過使用條件編譯實(shí)現(xiàn)平臺無關(guān),而是因?yàn)長ua是一種由ANSI(ISO)C語言編寫而成的腳本語言。這意味著只要有ANSI C編譯器,就可以編譯并使用Lua。因此,Lua具有極強(qiáng)的移植性。

免費(fèi):Lua是開源免費(fèi)的,Lua官網(wǎng)上(http://www.lua.org/)可以下載Lua的各個(gè)版本,最新版本為Lua5.3.4[3]。

簡單:Lua本身小巧簡單,啟動速度快。Lua官網(wǎng)上Lua5.3.4源碼的壓縮包大小為297K[4]。

擴(kuò)展性:Lua是一種易于擴(kuò)展的可擴(kuò)展性語言。易于擴(kuò)展的意思是,Lua可以使用C、C++等語言做第三方庫來擴(kuò)展自己的功能;擴(kuò)展性語言的意思是,Lua可作為第三方庫來被其他語言調(diào)用,擴(kuò)展其他語言的功能[5]。

3 Lua與C++語言之間的交互方法

Lua與C/C++語言之間的通信,主要是通過一個(gè)虛擬堆棧進(jìn)行。Lua給C語言提供了API來對堆棧進(jìn)行操作,這些API就好比兩者之間通信的協(xié)議。要想理解Lua與C++是如何交互的,首先就要了解Lua堆棧。

3.1 Lua堆棧

Lua堆棧的使用解決了C和Lua語言之間兩個(gè)不協(xié)調(diào)的問題:第一,Lua會自動進(jìn)行垃圾收集,而C語言要求顯示的分配存儲單元;第二,Lua中的動態(tài)類型和C中的靜態(tài)類型 不一致引起的混亂[6]。

Lua的C API函數(shù)的參數(shù)中幾乎都存在堆棧索引一項(xiàng),如果對堆棧索引理解不清晰,對API理解將會有很大困難。堆棧的索引方式有兩種,一種正數(shù)索引,一種負(fù)數(shù)索引[7]。如圖1所示。

兩段代碼的輸出結(jié)果一致,均為2008。

兩種索引方式有各自的優(yōu)勢。正數(shù)索引,不需要知道棧的大小,就能知道棧底在哪兒,棧底索引永遠(yuǎn)為1;負(fù)數(shù)索引,不需要知道棧的大小,就能知道棧頂在哪兒,棧頂索引永遠(yuǎn)為-1[8]。當(dāng)棧中元素過多,我們可以利用正數(shù)索引來操作離棧底較近的元素,利用負(fù)數(shù)索引操作離棧頂較近的元素。

3.2 C++調(diào)用Lua

根據(jù)以上代碼可以看出,當(dāng)在C++中調(diào)用luaadd函數(shù)時(shí),就會觸發(fā)Lua文件中的add函數(shù)。真正的求和函數(shù)是由Lua語言編寫。求和函數(shù)雖然簡單,但是遇到復(fù)雜的函數(shù)時(shí),就可以通過在Lua中編寫代碼,而省去C++復(fù)雜的語法規(guī)則以及編譯過程。比如我們只需要在Lua文件中修改函數(shù)add,將符號“+”改為“-”“*”和“/”,就可以得到求差,求積和求商函數(shù),而省略漫長的編譯過程。以luaadd(20,10)為例,四次執(zhí)行結(jié)果如圖3所示:由上到下分別為加減乘除操作。

3.3 Lua調(diào)用C++

Lua調(diào)用C++的方式分為三種:一是將需要的功能模塊直接寫入Lua的源碼中;二是用靜態(tài)依賴的方式來實(shí)現(xiàn);三是使用dll動態(tài)鏈接的方式。方式一適用的情況是,在C++工程中,需要用Lua實(shí)現(xiàn)的額外功能比較單一。如果需要在Lua中實(shí)現(xiàn)的額外功能過多,那在實(shí)際工程中,每在Lua中添加一個(gè)新的功能模塊,就要重新編譯Lua。方式三的流程是,當(dāng)需要一個(gè)新的功能時(shí),新建一個(gè)dll工程,然后在該工程里實(shí)現(xiàn)所需的新功能。在Lua文件中通過require調(diào)用生成的dll文件,調(diào)用之前需要將dll文件與Lua文件放在同一目錄下。在C++工程,Lua調(diào)用C++以方式二為主,接下來以一個(gè)簡單的求均值函數(shù)來解釋方式二中Lua調(diào)用C++的過程。

在C++工程中,并不會像以上所述只是單方面的C++調(diào)用Lua,或Lua調(diào)用C++。而是C++與Lua互相調(diào)用。比如在C++中有一個(gè)函數(shù)CFunction,但該函數(shù)的邏輯實(shí)現(xiàn)是由Lua中的函數(shù)LuaFunction來實(shí)現(xiàn)。在Lua中函數(shù)LuaFunction的功能又是由函數(shù)LuaFunction1、LuaFunction2和LuaFunction3組合實(shí)現(xiàn)。而LuaFunction1、LuaFunction2和LuaFunction3的功能又是通過調(diào)用在C++中的函數(shù)CFunction1、CFunction2和CFunction3來實(shí)現(xiàn)。在整個(gè)交互過程中,Lua就好像膠水一樣,利用其特性,將用C++語言制作的各種模塊很輕松地聯(lián)結(jié)在一起。交互過程如圖5所示:

4 結(jié)論

Lua與C++語言交互的關(guān)鍵之處在于兩者之間的“中介”---Lua堆棧。要想掌握Lua與C++之間是如何交互,首先得了解兩者是如何通過Lua堆棧進(jìn)行數(shù)據(jù)交換。掌握兩者之間的交互后,即可在C++項(xiàng)目中嵌入Lua語言。從培養(yǎng)程序員掌握一門新的語言所要花費(fèi)的資源方面考慮,Lua語言小巧簡單易學(xué)習(xí),程序員容易上手,花費(fèi)的資源自然也就少。從軟件開發(fā)效率以及后期版本更新的難易程度方面考慮,將Lua嵌入C++之后,后期修改,添加功能均可以在Lua中進(jìn)行,不用再重新編譯C++項(xiàng)目。

由于軟件行業(yè)的競爭越發(fā)激烈,軟件產(chǎn)品更新迭代的速度也隨之加快 ,軟件開發(fā)公司越加重視軟件的開發(fā)效率。利用Lua語言小巧、簡單、易學(xué)習(xí)以及易二次編程的特點(diǎn),將Lua嵌入到C++工程中,可以縮短公司開發(fā)項(xiàng)目的時(shí)間,提高軟件開發(fā)效率,提升公司競爭力。

參考文獻(xiàn):

[1] 楊杰. Lua——以總統(tǒng)為名的移動開發(fā)語言新貴[J]. 電腦與電信, 2014(4):46-48.

[2] 趙正旭, 劉莉. FreeForm在虛擬產(chǎn)品設(shè)計(jì)中的應(yīng)用研究[J]. 電腦知識與技術(shù), 2013(25):5759-5764.

[3] The Programming Language Lua [EB/OL]. http://www.lua.org/.

[4] 王磊. 淺析游戲腳本語言Lua[J]. 電腦知識與技術(shù), 2010, 6(4):899-901.

[5] Ierusalimschy, Roberto.周惟迪譯, Lua程序設(shè)計(jì)[M]. 2版.北京:電子工業(yè)出版社, 2008.

[6] 王云澤. Lua——一種高效的腳本語言[J]. 科技廣場, 2010(1):205-207.

[7] 黃皓. VB與Lua交互調(diào)用的研究與實(shí)現(xiàn)[J]. 現(xiàn)代計(jì)算機(jī), 2015(20):68-72.

[8] Roberto Ierusalimschy. Luiz Henrique de Figueiredo, Waldemar Celes. Reference Manual of the Programming Language LUA [DB/OL]. http://www.lua.org.,2018

[9] 鄧正陽, 陳和平, 蘇鵬. 動態(tài)腳本語言Lua與C++交互方法的研究與實(shí)現(xiàn)[J]. 計(jì)算機(jī)系統(tǒng)應(yīng)用, 2010, 19(5):198-201.

【通聯(lián)編輯:代影】

猜你喜歡
腳本語言堆棧調(diào)用
核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
嵌入式軟件堆棧溢出的動態(tài)檢測方案設(shè)計(jì)*
一種面向SSC的電信增值業(yè)務(wù)的生成方法及實(shí)現(xiàn)
基于堆棧自編碼降維的武器裝備體系效能預(yù)測
基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
淺析計(jì)算機(jī)技術(shù)在flash動畫中的應(yīng)用
基于SiPESC平臺的Python擴(kuò)展模塊開發(fā)
利用RFC技術(shù)實(shí)現(xiàn)SAP系統(tǒng)接口通信
一種用于分析MCS-51目標(biāo)碼堆棧深度的方法
利辛县| 延安市| 涞水县| 图木舒克市| 甘南县| 陵水| 雅江县| 东山县| 阜新市| 水富县| 定远县| 贺州市| 格尔木市| 长沙县| 安康市| 大方县| 儋州市| 鹤山市| 湖北省| 蒙山县| 丹巴县| 高唐县| 新沂市| 额济纳旗| 阳原县| 波密县| 中山市| 荥阳市| 兴海县| 花垣县| 襄汾县| 喜德县| 逊克县| 临武县| 彩票| 怀宁县| 若尔盖县| 天镇县| 凌源市| 孝义市| 固安县|