在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,这意味着你应该小心修改解释器中的任何内容而不需要自己锁定。