如何将脚本语言实现到C应用程序中?

时间:2009-07-21 10:32:13

标签: python c scripting lua

我有一个C应用程序,我想要包含一个脚本语言来将某些功能放入脚本中。我对此没有任何经验,也不知道从哪里开始(仍在学习C并尝试理解应用程序)。

我的应用和脚本之间的嵌入和通信实际上如何工作?我想我需要脚本语言的解释器作为一个库(Windows上的.dll或可以编译到我的应用程序中的C源代码)?然后我可以做类似

的事情
interpreter->run("myscript", some_object);

脚本如何知道对象的属性?假设我的脚本想要阅读或修改some_object-> some_field?

是否有针对这种嵌入优化的脚本语言?我知道Lua在游戏开发中很受欢迎,而Python,Perl,PHP或Ruby这样的语言似乎更像是独立的应用程序,但我在深层架构中的知识不允许更多有根据的猜测:) (标记为Lua和Python因为它们是我的最爱,但只要它在x86 Windows,Linux和Mac OS X上运行,我就可以使用其他脚本语言,只要它们很容易实现到C应用程序中)< / p>

8 个答案:

答案 0 :(得分:17)

的Lua。它占地面积非常小,速度相当快,而且我(主观上)发现它具有最令人愉快的API与C交互。

如果你想从C触摸Lua对象 - 使用内置的API非常容易。如果你想从Lua触摸C数据 - 这需要更多的工作,通常你需要制作包装器方法来公开你想让Lua修改的内容。

小代码库和对嵌入式解释器中引入的默认库数量的严格控制也意味着您可以对安全性做出合理的假设。

唯一奇怪的部分是基于1的数组编号,但是,考虑到迭代器的存在,它与我的想法相比并不是那么大。

如何与C集成:Lua的分发tarball有一个目录“etc”,其中包含一些非常有用的示例,可以让您快速入门。具体来说 - etc / min.c显示了如何启动解释器,使其解释文件,并使其调用C函数(在这种情况下为'print')。从那里开始,您可以阅读Lua文档以及分发中包含的标准库的来源。

答案 1 :(得分:16)

答案 2 :(得分:8)

Lua完全针对这种嵌入进行了优化。一个很好的起点是Roberto Ierusalimschy的书在Lua编程;你可以得到previous edition free online

您的脚本如何了解C对象的属性?

想象一下,您的对象定义如下:

typedef struct my_object *Object;
Object some_object;

您的C代码对该对象的属性有何了解?几乎没有,那是什么。你所能做的只是

  • 传递指向对象的指针,将它们放在数据结构中等。

  • 调用实际知道struct my_object内部内容的函数。

Lua以完全相同的方式访问C对象:间接通过函数:

  • 您进行API调用以将指针放到Lua堆栈上的对象中,从中可以进入Lua数据结构,变量或Lua Universe中的任何其他位置。

  • 您定义了解对象内部的函数,然后将这些函数导出到Lua。

  • “辅助库”中有很多东西可以帮到你。不要忽视它!

所有这些都在罗伯托的书的第三部分中以清晰的方式解释,其中包括例子。一个好点是

  • 您可以选择自己分配内存(“轻用户数据”)或让Lua分配内存。 Lua分配内存通常更好,因为它可以在不再需要时自动释放对象,并且还可以关联Lua metatable ,这允许您(以及其他技巧)允许对象参与标准的Lua操作,比如查找字段,而不仅仅是函数调用。

最后一点:虽然可以使用SWIG或toLua或其他工具来尝试生成连接C和Lua的代码,但我建议您自己手动编写代码。它实际上很容易,而且它是了解真实情况的唯一方法。

答案 3 :(得分:7)

以下是Python网站上嵌入Python 2.6 ...

的文档

http://docs.python.org/extending/embedding.html

答案 4 :(得分:3)

Lua专为此目的而设计,并且相当容易使用。

值得关注的另一件事是QtScript,这是基于Javascript的,虽然这会涉及一些工作“qt-ify”你的应用程序。

答案 5 :(得分:3)

您可能还想查看SWIG,Simplified Wrapper和Interface Generator。正如人们所猜测的那样,它会产生大量的锅炉板代码,以便将您的C / C ++代码与脚本引擎相连接(手动操作非常麻烦)。

它支持Python和Lua(您的偏好)和许多其他语言。生成扩展脚本语言的模块非常容易。扩展嵌入,这是您想要的,需要更多的努力。

答案 6 :(得分:2)

您可以查看Game Scripting Mastery。因为我对计算机游戏的高级方面感兴趣,所以这本书经常被推荐给我。

不幸的是,这本书似乎绝版了(至少在欧洲)。

答案 7 :(得分:1)

大多数脚本语言都允许嵌入C语言,通常允许您将C代码中的某些对象甚至函数暴露给脚本,以便它可以操作对象并调用函数。

正如所说的Lua是为此目的嵌入而设计的,使用解释器你可以将对象暴露给脚本并从C调用lua函数,搜索在C中嵌入lua 你会发现很多信息,也不要错过lua手册部分"The Application Programming Interface"

尽管Python更适合独立使用,但它也可以嵌入,如果您的脚本使用Python提供的大量库,它可能很有用。