脚本语言Lua与C++语言交互方法的研究
2018-11-26赵正旭申跃杰左宗成
赵正旭 申跃杰 左宗成
摘要:当前,代价高和周期长是C++语言在开发大型程序中存在的主要问题。为了解决这一问题,提出C++语言与脚本语言Lua进行交互的方法。利用Lua语言小巧简单、动态灵活的特点,达到降低公司开发代价,缩短程序开发周期的目的。重点介绍了Lua与C++之间传递消息的中介-Lua堆栈,以及Lua与C++语言之间相互调用方法。
关键词: Lua API;Lua 脚本;Lua/C++接口;Lua堆栈;Lua函数
中图分类号:TP311 文献标识码: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 引言
目前,軟件行业的竞争越发激烈。软件开发效率作为一个影响企业竞争能力的重要因素,越来越受到行业的重视。传统的C++语言,从编写到编译到链接再到最后的运行,过程复杂。当所要开发系统规模较大时,就会出现开发效率低、成本高的问题。脚本语言Lua语法简单,功能强大,易与C++语言进行交互。在利用C++语言开发程序时,嵌入Lua语言,可以大大降低软件开发代价。
2 Lua语言的简要介绍
1993年,在巴西里约热内卢天主教大学,Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo组成的科研小组开发了脚本语言Lua。设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。游戏《魔兽争霸》的发行,让Lua语言在游戏界变为新宠。游戏只是一个更容易被大多数人认识到的领域,但Lua可被运用的领域不止游戏。它也可以作为独立应用脚本、web应用脚本进行开发[1]。随着计算机技术的发展和工业企业生产的竞争,产品的设计过程需要借助于计算机技术在虚拟环境中进行[2]。产品设计往往多样化,如果每一种设计都要重新开发的话,浪费人力物力。而Lua灵活的扩展和定制功能,正好满足产品设计多样化的特点,为公司节省资源。这也促进了Lua语言在虚拟现实技术中的推广。
2.1 Lua语言的优点
强移植性:Lua几乎可以运行在所有我们听过的操作系统上。Lua不是通过使用条件编译实现平台无关,而是因为Lua是一种由ANSI(ISO)C语言编写而成的脚本语言。这意味着只要有ANSI C编译器,就可以编译并使用Lua。因此,Lua具有极强的移植性。
免费:Lua是开源免费的,Lua官网上(http://www.lua.org/)可以下载Lua的各个版本,最新版本为Lua5.3.4[3]。
简单:Lua本身小巧简单,启动速度快。Lua官网上Lua5.3.4源码的压缩包大小为297K[4]。
扩展性:Lua是一种易于扩展的可扩展性语言。易于扩展的意思是,Lua可以使用C、C++等语言做第三方库来扩展自己的功能;扩展性语言的意思是,Lua可作为第三方库来被其他语言调用,扩展其他语言的功能[5]。
3 Lua与C++语言之间的交互方法
Lua与C/C++语言之间的通信,主要是通过一个虚拟堆栈进行。Lua给C语言提供了API来对堆栈进行操作,这些API就好比两者之间通信的协议。要想理解Lua与C++是如何交互的,首先就要了解Lua堆栈。
3.1 Lua堆栈
Lua堆栈的使用解决了C和Lua语言之间两个不协调的问题:第一,Lua会自动进行垃圾收集,而C语言要求显示的分配存储单元;第二,Lua中的动态类型和C中的静态类型 不一致引起的混乱[6]。
Lua的C API函数的参数中几乎都存在堆栈索引一项,如果对堆栈索引理解不清晰,对API理解将会有很大困难。堆栈的索引方式有两种,一种正数索引,一种负数索引[7]。如图1所示。
两段代码的输出结果一致,均为2008。
两种索引方式有各自的优势。正数索引,不需要知道栈的大小,就能知道栈底在哪儿,栈底索引永远为1;负数索引,不需要知道栈的大小,就能知道栈顶在哪儿,栈顶索引永远为-1[8]。当栈中元素过多,我们可以利用正数索引来操作离栈底较近的元素,利用负数索引操作离栈顶较近的元素。
3.2 C++调用Lua
根据以上代码可以看出,当在C++中调用luaadd函数时,就会触发Lua文件中的add函数。真正的求和函数是由Lua语言编写。求和函数虽然简单,但是遇到复杂的函数时,就可以通过在Lua中编写代码,而省去C++复杂的语法规则以及编译过程。比如我们只需要在Lua文件中修改函数add,将符号“+”改为“-”“*”和“/”,就可以得到求差,求积和求商函数,而省略漫长的编译过程。以luaadd(20,10)为例,四次执行结果如图3所示:由上到下分别为加减乘除操作。
3.3 Lua調用C++
Lua调用C++的方式分为三种:一是将需要的功能模块直接写入Lua的源码中;二是用静态依赖的方式来实现;三是使用dll动态链接的方式。方式一适用的情况是,在C++工程中,需要用Lua实现的额外功能比较单一。如果需要在Lua中实现的额外功能过多,那在实际工程中,每在Lua中添加一个新的功能模块,就要重新编译Lua。方式三的流程是,当需要一个新的功能时,新建一个dll工程,然后在该工程里实现所需的新功能。在Lua文件中通过require调用生成的dll文件,调用之前需要将dll文件与Lua文件放在同一目录下。在C++工程,Lua调用C++以方式二为主,接下来以一个简单的求均值函数来解释方式二中Lua调用C++的过程。
在C++工程中,并不会像以上所述只是单方面的C++调用Lua,或Lua调用C++。而是C++与Lua互相调用。比如在C++中有一个函数CFunction,但该函数的逻辑实现是由Lua中的函数LuaFunction来实现。在Lua中函数LuaFunction的功能又是由函数LuaFunction1、LuaFunction2和LuaFunction3组合实现。而LuaFunction1、LuaFunction2和LuaFunction3的功能又是通过调用在C++中的函数CFunction1、CFunction2和CFunction3来实现。在整个交互过程中,Lua就好像胶水一样,利用其特性,将用C++语言制作的各种模块很轻松地联结在一起。交互过程如图5所示:
4 结论
Lua与C++语言交互的关键之处在于两者之间的“中介”---Lua堆栈。要想掌握Lua与C++之间是如何交互,首先得了解两者是如何通过Lua堆栈进行数据交换。掌握两者之间的交互后,即可在C++项目中嵌入Lua语言。从培养程序员掌握一门新的语言所要花费的资源方面考虑,Lua语言小巧简单易学习,程序员容易上手,花费的资源自然也就少。从软件开发效率以及后期版本更新的难易程度方面考虑,将Lua嵌入C++之后,后期修改,添加功能均可以在Lua中进行,不用再重新编译C++项目。
由于软件行业的竞争越发激烈,软件产品更新迭代的速度也随之加快 ,软件开发公司越加重视软件的开发效率。利用Lua语言小巧、简单、易学习以及易二次编程的特点,将Lua嵌入到C++工程中,可以缩短公司开发项目的时间,提高软件开发效率,提升公司竞争力。
参考文献:
[1] 杨杰. Lua——以总统为名的移动开发语言新贵[J]. 电脑与电信, 2014(4):46-48.
[2] 赵正旭, 刘莉. FreeForm在虚拟产品设计中的应用研究[J]. 电脑知识与技术, 2013(25):5759-5764.
[3] The Programming Language Lua [EB/OL]. http://www.lua.org/.
[4] 王磊. 浅析游戏脚本语言Lua[J]. 电脑知识与技术, 2010, 6(4):899-901.
[5] Ierusalimschy, Roberto.周惟迪译, Lua程序设计[M]. 2版.北京:电子工业出版社, 2008.
[6] 王云泽. Lua——一种高效的脚本语言[J]. 科技广场, 2010(1):205-207.
[7] 黄皓. VB与Lua交互调用的研究与实现[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] 邓正阳, 陈和平, 苏鹏. 动态脚本语言Lua与C++交互方法的研究与实现[J]. 计算机系统应用, 2010, 19(5):198-201.
【通联编辑:代影】