【问题标题】:Embedding a Ruby interpreter in a C++ app在 C++ 应用程序中嵌入 Ruby 解释器
【发布时间】:2017-06-20 09:25:06
【问题描述】:

我希望使用 Ruby 作为我的游戏引擎的脚本语言。我找到了描述如何从 C++ 代码调用 Ruby 类的常用文章,反之亦然(例如 here),但我不太明白如何使用这种工作方式来做我想做的事......

我的引擎目前使用一种我自己用 Flex 和 Bison 编写的小语言,以及一个基于堆栈的小虚拟机。脚本并不总是从头到尾运行,例如它们有时包含诸如“睡眠 2 秒”或“等待角色完成行走”之类的命令,因此调度程序会密切关注每个脚本的状态和指令指针,并知道何时恢复它们,等等。

看来我真的需要某种嵌入式 Ruby 解释器,我可以对其进行一定程度的控制,而不是简单地调用 Ruby 方法。还是我只是迟钝而遗漏了什么?

我在 Microsoft Visual C++ 中工作,因此理想情况下,任何解决方案都可以很好地轻松编译。

【问题讨论】:

  • 如果有人好奇我最终做了什么……我用 Lua 代替了它,它有协程并且似乎工作得很好。

标签: c++ ruby scripting


【解决方案1】:

这是一个包含错误处理的示例。

#include <iostream>
#include <ruby.h>

using namespace std;

int main(void)
{
  ruby_init();
  ruby_init_loadpath();
  int status;
  rb_load_protect(rb_str_new2("./test.rb"), 0, &status);
  if (status) {
    VALUE rbError = rb_funcall(rb_gv_get("$!"), rb_intern("message"), 0);
    cerr << StringValuePtr(rbError) << endl;
  };
  ruby_finalize();
  return status;
}

【讨论】:

  • 这是部分答案,但据我所知,这仍然不涉及暂停脚本的问题?
【解决方案2】:

你在正确的轨道上。关键是在您发布的链接中执行类似于Embedding Concepts 部分的操作。简单来说就是:

ruby_init();
ruby_script("some_script");

您可能需要复制 main.c 中的所有 #ifdef 内容才能使一切正常运行。从那时起,就是为您想要公开的 C++ 函数构建一个 API,并根据您的设计对事物进行多线程处理。

【讨论】:

  • 这似乎仍然没有解决如何让其中一个脚本进入睡眠模式的问题,例如 - 事情的调度方面。
  • 链接404请修复
【解决方案3】:

您总是可以重新设计脚本的工作方式以适应脚本引擎,而不是试图让引擎与原始脚本范例一起工作。

所以,如果你有这个:

proc:
  action 1
  action 2
  sleep a bit
  action 3
end

这需要脚本在睡眠线上暂停,请执行以下操作:

proc
  action1
  action2
  set timer (time, callback_proc)
end

callback_proc
  action3
end

这让脚本引擎可以巧妙地完成每个方法。它不需要对托管方进行太多更改 - 每个版本都需要某种形式的事件系统,可以重新启动脚本引擎。

【讨论】:

    【解决方案4】:

    有一个guide 关于如何将 ruby​​ 嵌入到 C++ 应用程序中。这可能会有所帮助。否则转到Ruby documentationEmbed Ruby in C 文章也可能会有所帮助。

    【讨论】:

    【解决方案5】:

    我认为您想要做的是使用 Ruby 的线程。我已经对 Ruby 线程代码进行了相当多的挖掘,并且我知道(在 pthreads 可用的地方)睡眠是使用 pthread_cond_timedwait 以非阻塞方式实现的。这会解除对解释器的阻塞,以便其他线程可以继续执行。

    在与 Ruby 解释器交互时,您自己的代码必须尊重 Ruby 的线程。他们仍然有一个 Ruby 中的全局 VM 锁,这意味着您应该小心修改解释器中的任何内容,而不要自己拥有锁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      相关资源
      最近更新 更多