在C++项目中引入Lua(AlphaGo使用的方案)

最近大火的AlphaGo,其中的deepmind已经开源,可以到github中下载https://github.com/deepmind/lab·,网上还有一个基于Python开源AlphaGo,那个不是google的。通过看deepmind源码,我们可以知AlphaGo使用的是C++和Lua方案。当然语言不是AlphaGo的重点,但还是说明了c++和Lua方案能够完成大型的项目。
      从2009年开始在三维仿真项目中引入Lua,C++项目的开发效率得到了大幅度。在我们三维仿真这种对性能要求较高的项目中,Lua对性能并没有造成大的影响。我最早接触Lua是看到魔兽世界中的任务脚本,后来看了云风的博客,他在网易的网游中引入了Lua,这让我确定了在我的项目中引入这种脚本。当前还有很多应用程序和游戏也是使用LUA作为嵌入式脚本语言,以此来实现可配置性、可扩展性。这其中包括魔兽世界、博德之门、愤怒的小鸟、VOCALOID3、太阳神三国杀 等。你在玩游戏时看他的安装目录中,你会经常看到lua后缀的脚本文件。
      从2010年我公司开始进入视频处理领域,由于视频分析处理对性能要求和技术要求较高,所以开发成本也很高,一般一两年c++经验的开发人员很难做出成果,但是在引入了Lua之后,一些新人也可以参与到项目中去了,在核心架构搭建好后,通过引入Lua将部分业务逻辑放到Lua中开发,不仅提高了开发效率,对开发人员要求也降低了。
      在这多年项目开发中总结出来,对于c++项目不管多大,一定要引用一种脚本,Lua是其中比较成熟可靠的方案。Lua脚本源码非常小没有依赖,可以很容易在各个平台上编译,Lua源码不仅提供了执行代码,还提供了编译代码,也就是说你可以将你写过的Lua脚本进行编译以防止源码泄露,并提高执行效率。Lua脚本内部还提供了调试断点函数,所以你可以自己开发一个调试工具,当然也有第三方提供的开源断点调试工具,我们都知道写c++程序如果不能调试那开发效率一定会大幅度降低。这也是我使用Lua,暂时还没有使用node.js的原因。
下面介绍一下Lua:
      Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。
     Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。
      Lua还具有其它一些特性:同时支持面向过程(procedure-oriented)编程和函数式编程(functional programming);自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程 ,并非操作系统所支持的线程)支持;通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
我们做一个示例 lua调用c++函数
////////////////////////////////////////////////////////////////////////////
///C++代码部分
int LuaCallC(lua_State *L)
{
    //获取第一个参数
    int para1 = lua_tonumber(L, 1);

//获取第二个参数
    int para2 = lua_tostring(L, 2);
    return 0;
}
//注册这个C++函数给lua调用
lua_register(lua, "LuaCallC", LuaCallC);

-----------------------------------------------------
---Lua代码部分
---调用c++函数
LuaCallC(100,"teststring")

这个示例只是演示下调用过程,多类型参数、返回值、类型检查都没有加。但通过这个示例可以看出来C++与Lua交互的简单,同样C++调用Lua函数也比较简单。后面我会再来出一些详细教学文章。
也可以看我一个视频教程

C++与Lua联合编程实战(c++程序员必备技能)

http://edu.51cto.com/course/course_id-7559.html

时间: 2024-10-06 15:56:33

在C++项目中引入Lua(AlphaGo使用的方案)的相关文章

在Android项目中引入MuPdf

由于公司手机App要加入一个附件查看功能,需要查看PDF文件,在网上找了许多第三方工具,最后选择了MuPDF. 更多第三方工具可以查看大神总结的:http://www.cnblogs.com/pokeGame/archive/2011/06/02/2068575.html MuPDF介绍: Android 设备上轻量级.高品质的 PDF/XPS/CBZ 查看器. MuPDF 上的呈现器专为高质量的抗失真图像量身打造,它以像素级的精度高品质呈现文字和文字间的间距,从而获得最高级别的显示保真度,在设

在Java Web项目中引入Mondrian多维分析框架

一,Mondrian简介 Mondrian是一个开源项目,一个用Java写成的OLAP引擎.它用MDX语言实现查询,从关系数据库(RDBMS)中读取数据.然后经过Java API以多维的方式对结果进行展示. Mondrian的使用方式同JDBC驱动类似.可以非常方便的与现有的Web项目集成. Mondrian OLAP 系统由四个层组成,可分为从最终用户到数据中心, 顺序为: 1表现层(the presentation layer) 2维度层(the dimensional layer) 3集合

项目中引入composer

众所周知,composer可以自定义加载插件库和依赖,它也是用PHP写的,怎样在自己的项目中引入并使用composer呢?. 1.新建一个项目,在项目的根目录创建composer.json文件,用过一个大型框架的同学可以发现,框架的根目录总是有一个此文件,对,发现了吗?记住了吗? 2.在composer.json文件里把下面的json格式复制进去 { "require": { } } 3.在项目根目录下创建vendor目录 4.此时执行命令composer update 注意:如果你直

【vue】如何在 Vue-cli 创建的项目中引入 iView

根据vue项目的搭建教程,以下记录如何在Vue-cli创建的项目中引入iView. 1)iView的安装,在项目下使用 npm 安装iView cnpm install  iview  --save 2)在 webpack 入口页面 main.js   (E:\managerSys\manager-sys\src\main.js)中 添加 如下配置: import iView from 'iview'; // 导入组件库import 'iview/dist/styles/iview.css';

【vue】如何在 Vue-cli 创建的项目中引入iView

根据vue项目的搭建教程,一下记录下如何在Vue-cli创建的项目中引入iView. 1)安装iView,在项目下 cnpm install  iview  --save 2 ) 在 webpack 入口页面 main.js (E:\managerSys\manager-sys\src\main.js)中配置 import iView from 'iview'; // 导入组件库import 'iview/dist/styles/iview.css'; // 导入样式 Vue.use(iView

vue项目中引入Sass

Sass作为目前成熟,稳定,强大的css扩展语言,让越来越多的前端工程师喜欢上它.下面介绍了如何在vue项目 中引入Sass. 首先在项目文件夹执行命令 npm install vue-cli -g,安装vue-cli脚手架,若是已经安装了,则不必再次安装,直接 跳过这一步.接下来执行命令行vue init webpack mypro(注:mypro是项目名). 接下来安装Sass依赖包,使用以下命令行: npm install sass-loader --save-dev npm instal

在 Vue-cli 创建的项目中引入 Element-UI

Element-UI 是饿了么前端团队退出了一套基于 vue.js 开发的 UI 组件库,在与 Vue-cli 创建的项目结合时,需要做以下配置: 1. 安装 loader 模块 cnpm install style-loader -D cnpm install css-loader -D cnpm install file-loader -D 2. 安装 Element-UI 模块 cnpm install element-ui -S 3. 修改 webpack.base.conf.js 的配

转载 想要在项目中引入其他项目的方法为

有时候我们一个项目会依赖于另一个项目的类库和资源,如下图项目pds-prrs依赖于pds-fw和pds-srv中的类和包 想要在pds-prrs中引入其他两个项目的方法为: 右键pds-prrs->build path->configure build path->project选项卡->.点击add,将另外两个项目加入即可 效果如下 不过值得注意的是,即使这样,只能保证编译正确,如果在webserver部署运行依然会出错,这里我们还需要把另外两个项目加入部署环境方法为: 右键pd

在 Vue 项目中引入 tinymce 富文本编辑器

项目中原本使用的富文本编辑器是 wangEditor,这是一个很轻量.简洁编辑器 但是公司的业务升级,想要一个功能更全面的编辑器,我找了好久,目前常见的编辑器有这些: UEditor:百度前端的开源项目,功能强大,基于 jQuery,但已经没有再维护,而且限定了后端代码,修改起来比较费劲 bootstrap-wysiwyg:微型,易用,小而美,只是 Bootstrap + jQuery... kindEditor:功能强大,代码简洁,需要配置后台,而且好久没见更新了 wangEditor:轻量.