为什么我应该嵌入脚本语言?
我现在正在学习C++,听说了很多关于嵌入式脚本语言的知识。但我一直以为这是另外一回事。
我原本想用C++编写所有性能要求高的代码,并从Lua或Python等脚本语言中调用它们。
但现在好像是相反的,也就是用Lua/Python编写代码,然后在C语言中调用。
在C++中嵌入语言的优势是什么,而不是在C++中编写API并在另一种语言中调用那些函数?
例如:
// C++中的函数
int expensiveFunction(){
return 1;
}
然后我可以在Python中调用这个函数,从C++中获得性能,但又能依靠Python的运行时解释器在运行时进行修改。
实际上,很多游戏引擎都喜欢通过嵌入 Lua 或 Python 来构建引擎界面。这样做有以下优点:
- 非程序员也可以与引擎交互。
- 即使进行轻微的脚本更改,也不需要重新编译。
- 脚本中的错误可能不会导致整个系统崩溃。
C++ 对于希望具备脚本语言灵活性的项目以及想要 C++ 性能的项目的后端非常有用。我没有听说过使用 C++ 作为前端,脚本语言作为后端的项目。
API 样式
我们在公司的软件中使用此样式。我们通过一个可以被大多数语言轻松调用的 Windows DLL 公开一个 API。我们特别支持 VB 和 VBA。当后端来自脚本制作者无法控制的外部时,这样做很好。然而,从脚本制作者的角度来看,调试问题很难。
优点
- 强耦合度
- 可以从不同的编程语言中访问
缺点
- 很难为 2 个进程调试问题
嵌入式样式
软件实际上将脚本解释器嵌入到软件中。这样,你就可以将功能公开为本机函数。在这种样式中,脚本制作者和后端程序员通常在同一家公司。它也可以被传统软件用来允许其他人扩展应用程序的功能。如果他们共享源代码,你就可以更容易地调试由脚本引起的问题。应用程序还会负责何时以及如何启动你的脚本。但是,为了支持其他语言,应用程序开发人员必须嵌入其他解释器。
优点
- 更强的耦合度
- 更容易调试一个进程
缺点
- 只能通过特定的编程语言访问
原文
One reason could be that you want to use a C++ framework which bring it's own main function (and forces you to use that as the main function of your program).
In my opinion, that's often a bad design of the framework - it's not easy to use more than one such framework in a program...
The same applies for multiple scripting languages in one program: Only one language can provide the main function. All other languages must be embedded.
Note: With threads, you can get something like "multiple main functions". Well, not really multiple main functions. But multiple event handling loops.
翻译
可能的原因之一是您想使用一个C++框架,该框架带有自己的主函数(并强制您将其用作程序的主函数)。
在我看来,这通常是框架的糟糕设计 - 在一个程序中使用多个这样的框架并不容易...
同样,对于一个程序中的多个脚本语言,只有一种语言可以提供主函数。所有其他语言必须被嵌入。
注意:通过线程,您可以获得类似于“多个主函数”的东西。嗯,并不是真正的多个主函数,而是多个事件处理循环。
实际上,两种方法都可以正常工作。问题在于哪种方法更适合您特定的应用程序。
例如,将性能密集的代码作为语言扩展编写适用于希望其感觉像是使用脚本语言中较小库的应用程序。如果您想要为图形渲染提供高性能的 API 并将其包含在 Python 应用程序内部,则可以使用这种方法。
另一方面,如果您拥有一个几乎完全由 C++ 写成的引擎-如游戏引擎-并且希望提供一种简单的方式来连接到游戏引擎而不需要重新编译,那么您可以嵌入解释器。这就是为什么游戏引擎通常使用脚本语言编写 AI 或行为钩子的原因:例如更改机器人的“响应时间”,您就可以立即看到差异,有时甚至无需重新启动游戏。
一切都取决于意图,哪一方面更“大”,但我认为您可以使用 Lua 或 Python 进行两种方法。
我曾经将 Python 嵌入到一个机器人控制器中
该控制器管理着一个机器人,用于处理计算机芯片晶片,并且还控制着各种其他设备。客户可以编写 Python 程序来跟踪晶片的位置、打开门、开关灯、读取开关等等。或者,它可以从串行线或以太网读取指令并将它们转换为动作。当然,机器人的细致控制是在 C++ 级别上处理的,运行在实时操作系统上的最紧急的优先级。
除了性能、重新编译、可维护性等因素之外,另一个原因就是代码安全性。
像c/c++这样的编译语言相对于其他人来说更难(并非不可能)在没有源代码的情况下知道您的确切算法,而脚本则(表面上)更容易知道其逻辑,因为它们在运行时编译。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
Scripts在运行时编译,而main language则是在编译时编译。这使得处理大型代码库相对容易,因为您不必为了更新简单的脚本而编译整个项目。