罗剑锋的 C++ 实战笔记
罗剑锋
前奇虎 360 技术专家,Nginx/OpenResty 开源项目贡献者
35514 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 32 讲
结束语 (1讲)
罗剑锋的 C++ 实战笔记
15
15
1.0x
00:00/00:00
登录|注册

17 | 脚本语言:搭建高性能的混合系统

调用Lua功能
LuaRef类
Lua虚拟机
导出函数、类
编译
定义Python模块
安装
嵌入Lua
调用C++功能
下载
使用方法
简化扩展模块的工作
基于现代C++
思考题
选择依据
嵌入方式
LuaJIT速度快
pybind11和LuaBridge简化导入
C++辅助其他语言
使用方法
用于C++项目
速度接近原生C/C++代码
使用JIT技术
小而美
游戏开发
类转换到Python
参数、返回值使用标准容器
pybind11
用C++编写扩展模块
大数据、人工智能、科学计算
课下作业
区别
优势
LuaBridge
LuaJIT
设计目标
应用领域
支持的功能
C接口
应用领域
扬长避短
提供扩展功能
退到后端、底层领域
适应快速开发和迭代的节奏
高效、灵活、强大
总结
Lua
Python
辅助其他语言
C++的特性
脚本语言:搭建高性能的混合系统

该思维导图由 AI 生成,仅供参考

你好,我是 Chrono。
经过了前面这么多节课的学习,相信你已经认识到了 C++ 的高效、灵活和强大。使用现代特性,再加上标准库和第三方库,C++ 几乎“无所不能”。
但是,C++ 也有自己的“阿喀琉斯之踵”,那就是语言复杂、学习曲线陡峭、开发周期长、排错 / 维护成本高。
所以,C++ 不能完全适应现在的快速开发和迭代的节奏,最终只能退到后端、底层等领域。要想充分发挥 C++ 的功力,就要辅助其他的语言搭建混合系统,尽量扬长避短,做好那最关键、最核心的部分,这样才能展现出它应有的价值。
由于当前的操作系统、虚拟机、解释器、引擎很多都是用 C 或者 C++ 编写的,所以,使用 C++,可以很容易地编写各种底层模块,为上层的 Java、Go 等语言提供扩展功能。
不过,今天我不去说这些大型语言,而是讲两种轻便的脚本语言:Python 和 Lua,看看 C++ 怎么和它们俩实现无缝对接:以 C++ 为底层基础,Python 和 Lua 作为上层建筑,共同搭建起高性能、易维护、可扩展的混合系统。

Python

Python 应该是除了 JavaScript 以外最流行的一种脚本语言了,一直在 TIOBE 榜单里占据前三名的位置。而且,在新兴的大数据、人工智能、科学计算等领域,也都有着广泛的应用。很多大公司都长期招聘 Python 程序员,就是看中了它的高生产率。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何基于C++搭建混合系统,并介绍了Python和Lua这两种脚本语言。Python通过pybind11工具实现与C++的无缝对接,提升性能,而Lua则以小巧高效著称,尤其在游戏开发领域有广泛应用。文章详细介绍了如何使用pybind11和LuaJIT,以及LuaBridge库将C++函数、类导入Python和Lua,并展示了如何在C++中嵌入Lua。总结来看,C++在混合系统中具有高效、灵活的特点,而Python和Lua分别适用于不同的场景。读者可根据实际需求选择合适的脚本语言。文章内容丰富,涵盖了技术细节和实际应用,对于想要了解混合系统搭建的读者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《罗剑锋的 C++ 实战笔记》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(27)

  • 最新
  • 精选
  • 有学识的兔子
    1. 我想这种方式可以利用脚本语言的高产的优势,例如老师说的python; 2. 把C++嵌入到脚本语言可以有效提升脚本语言的执行效率;而把脚本语言嵌入到C++,有点通过利用脚本语言特性的优势来弥补相对C++的弱项,使得C++开发变得更灵活和开放。

    作者回复: 说的很好。

    2020-06-14
    10
  • IT老兵重开始
    一个C++零基础的初学者,正在看一个C++开源库,这章很有启发,因工作需要改造一下开源库代码

    作者回复: 从零开始学C++,真是很佩服。 我的建议是不要去抠那些内存管理、指针、构造/析构等细枝末节,先把C++当做java、Python来用,有了一些实际经验体会后再了解底层机制。

    2020-09-09
    2
    5
  • нáпの゛
    老师,我复制C++ 的 string、tuple 和 vector 用于 Python 的示例代码,编译报错了,没识别到类型。 下面是部分错误信息: pybind.cpp: In function ‘void pybind11_init_videoparser(pybind11::module&)’: pybind.cpp:15:14: error: ‘string’ does not name a type [](const string& str) // 入参是string ^ pybind.cpp:19:5: error: ISO C++ forbids declaration of ‘parameter’ with no type [-fpermissive] } ^ pybind.cpp: In lambda function: pybind.cpp:20:4: error: expected ‘{’ before ‘;’ token ); ^ pybind.cpp: In function ‘void pybind11_init_videoparser(pybind11::module&)’: pybind.cpp:20:4: error: expected ‘)’ before ‘;’ token pybind.cpp:23:8: error: ‘tuple’ has not been declared [](tuple<int, int, string> x) // 入参是tuple ^ pybind.cpp:23:13: error: expected ‘,’ or ‘...’ before ‘<’ token [](tuple<int, int, string> x) // 入参是tuple ^ pybind.cpp: In lambda function: pybind.cpp:25:9: error: ‘get’ was not declared in this scope get<0>(x)++; ^ pybind.cpp:25:9: note: suggested alternative:

    作者回复: 看样子好像是没识别出string、tuple等类型,应该是没打开std名字空间吧。 示例里的代码为了简单都省略了using namespace std,也许给你造成了误解,抱歉。

    2020-07-21
    4
    4
  • reverse
    老师,能增加一部分内容讲讲 jsBridge吗 我正常的研发都要和nodejs打交道 但是经验不足

    作者回复: 没用过jsBridge,不好讲,抱歉了。 如果是单纯地用C/C++写native接口让js调,那还是比较简单的。

    2020-06-15
    2
    3
  • Stephen
    1.脚本语言实现业务比较方便,开发周期短,而C++作为底层库,运算效率高,相当于优势互补吧. 2.关于脚本语言嵌入到C++语言中,我特意查了下,网上说"游戏开发中,如果要修改C++为主体的代码逻辑,使用Lua可以不重启服务器就能做到".我平常接触比较多的是C++作为底层库嵌入到脚本语言中.感觉各有千秋,适合不同的场景吧,说不出来哪个更好

    作者回复: 1.说的很好。 2.对,多语言混合编程就看应用场合,有的需要运行速度,有的需要开发效率,比重可以任意调整。

    2021-07-13
    2
  • 无为而立
    之前用swig,再尝尝pybind11,感谢大佬提供思路

    作者回复: pybind11比较现代,用C++11的特性简化了很多原来的操作,非常推荐。

    2020-06-13
    2
  • 浑浑噩噩cium
    以前遇到过升级软件就是lua和c++配合,业务流程就是lua脚本里面控制,c++调用lua脚本。

    作者回复: 对,这是一种很好的混合编程方式。

    2020-06-13
    2
  • 奋斗
    老师,请教您三个问题: 1、除了 python 和 lua , perl 可以吗? 2、有没有 pybind11 的教程资料? 3、如果学习 c++ 必须掌握一门脚本语言,那个是首选?

    作者回复: 1.perl应该也可以,不过我没研究过,不熟。 2.pybind11的GitHub上的readme就已经很详细了。 3.我觉得最好不要做选择题,而是全都要,都有各自合适的应用场合。

    2021-05-26
    1
  • 易轻尘
    把 C++ 嵌入脚本语言:适用于脚本语言运行速度满或者和操作系统底层交互不方便的时候; 把脚本语言嵌入 C++:C++开发需要注意的点多,开发效率较低,可以使用脚本语言方便开发者

    作者回复: great.

    2021-04-14
    1
  • hao
    C++和python配合适合实现大型高并发高性能服务端吗?

    作者回复: C++和python混合编程没问题,但要实现“大型高并发高性能服务端”,可能就没那么简单了。 因为C++偏向在底层写高性能组件,Python实现业务逻辑,而服务器应用一般业务比较多,这样就难以发挥C++的高性能优势,可能需要仔细划分两者的功能区。 我个人推荐用Nginx+Lua,或者是OpenResty。

    2020-07-02
    3
    1
收起评论
显示
设置
留言
27
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部