【问题标题】:Why should I embed a scripting language? [closed]为什么要嵌入脚本语言? [关闭]
【发布时间】:2012-10-25 21:05:08
【问题描述】:

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

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

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

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

例子:

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

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

【问题讨论】:

  • 另一个原因是您可以让用户编写自己的脚本来扩展程序。这就是 Unix 所做的。
  • 你在说什么?在视频游戏中,引擎在 C++ 中“关闭”,但通常通过脚本语言控制事物以允许修改。对于服务器之类的东西,或者您希望保持核心关闭但允许用户创建扩展的任何软件也是如此。但反过来说,在科学软件中,Python 之类的东西写起来很简单但速度很慢,所以核心函数应该在 C/Fortran 中。
  • @tpg2114:这正是我所说的。我什么时候应该考虑在 c++ 中嵌入一种语言,而不是在 c++ 中编写核心并在 python/lua 中使用它?也许你可以给我一些优点/缺点。

标签: c++ python lua


【解决方案1】:

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

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

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

API 风格

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

优势

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

缺点

  • 很难调试 2 个进程

嵌入式样式

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

优势

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

缺点

  • 只能通过批准的语言访问

【讨论】:

  • 我认为大多数python库都是用c++编写的。
  • 这就是我要说的。 C++ 作为其他语言的后端大放异彩。听起来他对使用脚本作为后端的 C++ 感到好奇。
  • 很抱歉,我误读了您的回答。因为我想用 c++ 编写一个简单的图形引擎,并在引擎之上构建一个框架(用“脚本语言”)。所以其他人可以用 python/lua 编写一些东西,但仍然可以获得 c++ 的性能。我只是感到困惑,因为我看到了嵌入在 c++ 中的代码。
  • 我编辑了我的答案,希望能更清楚地说明我的意思。至于具有脚本语言界面的图形框架,听起来正是这种模式适用的情况。对于脚本语言,我建议使用 Lua。有无数的教程告诉你如何做你想做的事。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我添加了一个例子。我也可以在运行时进行更改,但无需在 c++ 中添加语言。
    • @MaikKlein 我从未见过有人从 Python 调用 C++ 代码,通常情况正好相反,就像从 C++ 调用 Lua 脚本一样。
    • 是的,我只是想知道为什么?对我来说,用 C++ 编写 API 似乎更合理。
    • @Rapptz 大多数嵌入式脚本引擎以两种方式执行调用,通常 C++ 应用程序在某些事件上调用脚本,并提供一个接口,脚本可以在其中回调到 C++ 端以获取更多信息。
    • @Rapptz: youtube...他们将所有计算量大的代码都移到了 c/c++ 中。
    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        像 c/c++ 这样的编译语言更难(并非不可能)让其他人在没有源代码的情况下知道您的确切算法,而脚本(显然)更容易知道它逻辑,因为它们可以在运行时编译。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-10
          • 2011-10-09
          • 2014-06-30
          • 2010-09-13
          • 2011-03-12
          • 2011-04-07
          • 1970-01-01
          相关资源
          最近更新 更多