在C ++应用程序中嵌入Ruby解释器

我希望使用Ruby作为我的游戏引擎的脚本语言。 我发现通常的文章描述了如何从C ++代码调用Ruby类,反之亦然(例如这里 ),但我不太清楚如何用这种工作方式做我想做的事情……

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

所以我似乎真的需要某种嵌入式Ruby解释器,我可以对它进行一定程度的控制,而不是简单地调用Ruby方法。 或者我只是因为迟钝而错过了什么?

我正在使用Microsoft Visual C ++,所以理想情况下,任何解决方案都可以很好地编译。

这是一个包含error handling的例子。

#include  #include  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; } 

你走在正确的轨道上。 关键是在您发布的链接中执行类似于嵌入概念的部分。 简单来说,它只不过是:

 ruby_init(); ruby_script("some_script"); 

您可能需要从main.c复制所有#ifdef内容以使一切正常。 从那时起,您需要为要公开的C ++函数构建API,并根据您的设计,multithreading化。

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

所以,如果你有这个:

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

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

 proc action1 action2 set timer (time, callback_proc) end callback_proc action3 end 

这让脚本引擎整齐地完成了每个方法。 它不需要对主机端进行很多更改 – 每个版本都需要某种forms的事件系统,可以重新启动脚本引擎。

有一个关于如何将ruby嵌入到C ++应用程序中的指南。 这可能会有所帮助。 否则,请转到Ruby文档 。 嵌入Ruby in C文章也可能有所帮助。

我想你想要做的是使用Ruby的线程。 我已经完成了一些挖掘Ruby线程代码的工作,我知道(在pthreads可用的地方),使用pthread_cond_timedwait以非阻塞方式实现sleep。 这将解除对解释器的阻塞,以便其他线程可以继续执行。

在与Ruby解释器交互时,您自己的代码必须尊重Ruby的线程。 他们仍然在Ruby中使用Global VM Lock,这意味着你应该小心修改解释器中的任何内容而不需要自己锁定。