我有一个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应用程序中)
Lua中.它占地面积非常小,速度相当快,我发现它(主观上)拥有最令人愉快的API与C交互.
如果你想从C触摸Lua对象 - 使用内置的API非常容易.如果你想从Lua触摸C数据 - 这需要更多的工作,通常你需要制作包装器方法来公开你想让Lua修改的内容.
小代码库和对嵌入式解释器中引入的默认库数量的严格控制也意味着您可以对安全性做出合理的假设.
唯一奇怪的部分是基于1的数组编号,但是,考虑到迭代器的存在,它与我的想法相比并不是那么大.
如何与C集成:Lua的分发tarball有一个目录"etc",其中包含一些非常有用的示例,应该可以让您快速入门.具体来说 - etc/min.c显示了如何启动解释器,使其解释文件,并使其调用C函数(在这种情况下为'print').从那里开始,您可以阅读Lua文档以及分发中包含的标准库的来源.
一些有用的链接:
嵌入Python
嵌入的Lua:http://www.lua.org/manual/5.1/manual.html#3,http://www.ibm.com/developerworks/opensource/library/l-embed-lua/index.html
嵌入Ruby
嵌入PLT计划
嵌入PERL
嵌入TCL
嵌入JavaScript
嵌入PHP
我熟悉Python.Python是一种非常丰富的语言,并且拥有大量可用的库.
Lua完全针对这种嵌入进行了优化.一个很好的出发点是Roberto Ierusalimschy的书" 在Lua编程" ; 你可以在线免费获得上一版.
您的脚本如何了解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操作比如查找字段,而不仅仅是函数调用.
最后要注意的:althought有可能使用痛饮或toLua或其他工具来尝试生成代码连接C和Lua的,我希望你自己写的代码,由专人.它实际上很容易,而且它是了解真实情况的唯一方法.
这是Python网站上嵌入Python 2.6的文档...
http://docs.python.org/extending/embedding.html