我现在正在学习C ++,我听过很多关于嵌入式脚本语言的知识。我想象它完全不同。
我以为我会用C ++编写所有性能繁重的函数,并用Lua或Python等脚本语言调用它们。
但它似乎是另一种方式。 - >在Lua / Python中编写函数并用C代码调用它们。
在C ++中嵌入语言而不是在C ++中编写API并用另一种语言调用这些函数有什么好处?
示例:
// function in c++
int expensiveFunction(){
return 1;
}
然后在Python中我会调用这个函数,我会从C ++中获得性能,但是由于Python的运行时解释器,它可以在运行时进行更改。
答案 0 :(得分:5)
实际上,很多游戏引擎都喜欢通过嵌入Lua或Python来构建引擎接口。这样做有好处:
C ++作为需要脚本语言灵活性但希望获得C ++性能的项目的后端非常有用。我没有听说过使用C ++作为前端的项目,使用脚本语言作为后端。
API样式
我们在公司的软件中使用这种风格。我们通过Windows DLL公开API,可以很容易地被大多数语言调用。我们特别支持VB和VBA。当后端来自脚本制作者的控制之外时,这很好。但是,很难调整脚本制作者的观点所引起的问题。
优点
缺点
嵌入式
该软件实际上将脚本解释器嵌入到软件中。这样,您可以将功能公开,就像它们是本机功能一样。在这种风格中,脚本制作者和后端程序员通常都在同一家公司。传统软件也可以使用它来允许其他人扩展应用程序的功能。如果他们共享源代码,您可以更容易地调试脚本引起的问题。该应用程序还负责何时以及如何启动脚本。但是,为了支持其他语言,应用程序开发人员必须嵌入其他解释器。
优点
缺点
答案 1 :(得分:4)
真的,两种方法都可行。问题是哪种方法更适合您的特定应用。
例如,将性能较高的代码编写为语言的扩展,可以很好地适用于您希望某人使用脚本语言中较小的库的应用程序。如果您想为Python应用程序中包含的图形渲染提供高性能的API,那么这就是您的选择。
另一方面,如果你的引擎几乎完全是用C ++编写的 - 比如游戏引擎 - 并且你想提供一种简单的方法来挂钩游戏引擎而不需要重新编译,你可以嵌入翻译。这就是geme引擎经常写的例子。脚本语言中的AI或行为挂钩:例如,更改机器人的“响应时间”,您可以立即看到差异,有时甚至无需重新启动游戏。
这完全取决于哪一方“更大”的意图,但我相信你可以用Lua或Python做两种方法。
答案 2 :(得分:1)
脚本在运行时编译,而主语言将在编译时编译。这将使得使用大型代码库变得相对容易,因为您不必编译整个项目来更新简单的脚本。
答案 3 :(得分:1)
一个原因可能是您想要使用C ++框架,它带来了自己的主要功能(并强制您将其用作程序的主要功能)。
在我看来,这通常是框架的糟糕设计 - 在程序中使用多个这样的框架并不容易......
同样适用于一个程序中的多种脚本语言:只有一种语言可以提供主要功能。必须嵌入所有其他语言。
注意:使用线程,您可以获得类似“多个主要功能”的内容。好吧,不是真正的多个主要功能。但是多个事件处理循环。
答案 4 :(得分:1)
我曾经在机器人控制器中嵌入了Python。控制器管理着一个处理计算机芯片晶圆的机器人,它还控制着各种其他设备。客户可以编写一个Python程序,可以跟上晶圆的位置,打开门,打开和关闭灯,读取开关等等。或者它可以从串行线或以太网读取指令并将它们转换为动作。当然,机器人的精细控制是在C ++级别处理的,在实时操作系统上以最紧急的优先级运行。
答案 5 :(得分:1)
除了性能,重新编译,可维护性等考虑因素外,另一个原因是代码安全性。
像c / c ++这样的编译语言更难(并非不可能)让其他人知道你没有源代码的确切算法,而脚本(显然)更容易知道它逻辑因为它们是在运行时编译的。