9

我现在正在学习 C++,我听说过很多关于嵌入式脚本语言的知识。我想象的完全不同。

我想我会用 C++ 编写我所有的性能密集型函数,并用 Lua 或 Python 等脚本语言调用它们。

但似乎情况正好相反。-> 用 Lua/Python 编写函数并用 C 代码调用它们。

在 C++ 中嵌入一种语言而不是在 C++ 中编写 API 并用另一种语言调用这些函数有什么优势?

例子:

// function in c++
int expensiveFunction(){
  return 1;
}

然后在 Python 中,我将调用此函数,我将获得 C++ 的性能,但可以在运行时进行更改,这要归功于 Python 的运行时解释器。

4

6 回答 6

5

实际上,很多游戏引擎喜欢通过嵌入 Lua 或 Python 来构建引擎的接口。这样做有以下好处:

  • 非程序员可以与引擎交互。
  • 您不需要为较小的脚本更改重新编译。
  • 脚本中的错误可能不会使整个系统崩溃。

对于想要脚本语言的灵活性但又想要 C++ 的性能的项目,C++ 作为后端非常有用。我还没有听说过使用 C++ 作为前端,使用脚本语言作为后端的项目。

API 风格

我们在我公司的软件中使用这种风格。我们通过 Windows DLL 公开 API,大多数语言都可以轻松调用该 API。我们特别支持 VB 和 VBA。当后端不受脚本制作者的控制时,这非常棒。但是,很难从脚本制作者的角度调试出现的问题。

好处

  • 强解耦
  • 可从不同语言访问

缺点

  • 难以调试 2 个进程

嵌入式风格

该软件实际上将脚本解释器嵌入到软件中。通过这种方式,您可以公开功能,就好像它们是本机功能一样。在这种风格中,脚本制作者和后端程序员通常在同一家公司。传统软件也可以使用它来允许其他人扩展应用程序的功能。如果他们共享源代码,您可以更轻松地调试脚本引起的问题。该应用程序还负责何时以及如何启动您的脚本。但是,为了支持其他语言,应用程序开发人员必须嵌入其他解释器。

好处

  • 更强的耦合
  • 更容易调试一个进程

缺点

  • 只能通过批准的语言访问
于 2012-11-05T23:37:15.440 回答
4

真的,任何一种方法都可以正常工作。问题是哪种方法更适合您的特定应用。

例如,编写性能密集型代码作为语言的扩展非常适用于您希望它感觉就像有人正在使用脚本语言中的较小库的应用程序。如果您想为包含在 Python 应用程序中的图形渲染提供高性能 API,这就是您要走的路。

另一方面,如果您有一个几乎完全用 C++ 编写的引擎(例如游戏引擎),并且您想提供一种简单的方法来连接到游戏引擎而无需重新编译,您可以嵌入解释器。这就是为什么 geme 引擎经常用脚本语言编写例如 AI 或行为挂钩:例如,更改机器人的“响应时间”,您可以立即看到差异,有时甚至无需重新启动游戏

这完全取决于哪一方“更大”的意图,但我相信你可以使用 Lua 或 Python 来做这两种方法。

于 2012-11-06T02:00:09.533 回答
1

脚本在运行时编译,而主要语言将在编译时编译。这将使使用大型代码库变得相对容易,因为您不必编译整个项目来更新简单的脚本。

于 2012-11-05T23:33:29.770 回答
1

一个原因可能是你想使用一个 C++ 框架,它带来了它自己的主要功能(并迫使你将它用作程序的主要功能)。

在我看来,这通常是一个糟糕的框架设计——在一个程序中使用多个这样的框架并不容易......

这同样适用于一个程序中的多种脚本语言:只有一种语言可以提供主要功能。必须嵌入所有其他语言。

注意:使用线程,您可以获得“多个主要功能”之类的东西。好吧,并不是真正的多个主要功能。但是有多个事件处理循环。

于 2012-11-05T23:51:36.993 回答
1

我曾经将 Python 嵌入到机器人控制器中。控制器管理着一个处理计算机芯片晶片的机器人,它还控制着各种其他设备。客户可以编写一个 Python 程序来执行诸如跟上晶片位置、开门、开关灯、读取开关等操作。或者它可以从串行线路或以太网读取指令并将其转换为动作. 当然,机器人的精细控制是在 C++ 级别处理的,在实时操作系统上以最紧迫的优先级运行。

于 2012-11-06T02:11:52.133 回答
1

除了性能、重新编译、可维护性等考虑因素之外,另一个原因是代码安全性。

Compiled language like c/c++ is harder (not impossible) for others to know your exact algorithm without source code, while scripts are (apparently) easier to know its logic because they are there to compile at runtime.

于 2012-11-06T02:58:52.380 回答