Python 如何在C应用程序中实现脚本语言?

Python 如何在C应用程序中实现脚本语言?,python,c,scripting,lua,Python,C,Scripting,Lua,我有一个C应用程序,我想包括一种脚本语言,将某些功能放入脚本中。我只是没有这方面的经验,也不知道从哪里开始(仍在学习C并试图理解应用程序) 我的应用程序和脚本之间的嵌入和通信实际上是如何工作的?我想我需要脚本语言的解释器作为库(可以编译到我的应用程序中的Windows或C源代码上的(.dll))?然后我能做些类似的事情吗 interpreter->run("myscript", some_object); 脚本如何知道对象的属性?假设我的脚本想要读取或修改某个\u对象->某个\u字段 有

我有一个C应用程序,我想包括一种脚本语言,将某些功能放入脚本中。我只是没有这方面的经验,也不知道从哪里开始(仍在学习C并试图理解应用程序)

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

interpreter->run("myscript", some_object);
脚本如何知道对象的属性?假设我的脚本想要读取或修改某个\u对象->某个\u字段


有没有针对这种嵌入优化过的脚本语言?我知道在游戏开发中有流行的Lua,还有像Python、Perl、PHP或Ruby这样的语言,它们似乎更适合作为独立应用程序,但我对deep架构的了解不允许更多有根据的猜测:)(标记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文档和发行版中包含的标准库的源代码。

Lua正是为此目的而设计的,并且非常容易使用


另一件值得一看的事情是,它是基于Javascript的,尽管这需要一些工作来“qt化”你的应用程序。

这是Python网站上关于嵌入Python 2.6的文档


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

如前所述,Lua是为嵌入而设计的,使用解释器,您可以将对象公开到脚本中,并从C调用Lua函数,在C中搜索嵌入Lua,您应该可以找到很多信息,也不要错过Lua手册部分

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

一些有用的链接:

  • 嵌入Lua:

我熟悉Python。Python是一种非常丰富的语言,有大量可用的库。

您可能还想看看简化的包装器和接口生成器。正如人们猜测的那样,它会生成大量的锅炉板代码,将您的C/C++代码连接到脚本引擎(手动操作可能非常麻烦)

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

您可以看一看。由于我对电脑游戏的高级方面也感兴趣,所以经常向我推荐这本书


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

Lua完全针对这种嵌入进行了优化。Roberto Ierusalimschy的书《Lua中的编程》是一个很好的起点;您可以获得

脚本如何知道C对象的属性?

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

typedef struct my_object *Object;
Object some_object;
您的C代码对该对象的属性了解多少?几乎什么都不知道,就是这样。您所能做的就是

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

  • 调用实际知道结构my_对象内部内容的函数

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

  • 您可以通过API调用将指向Lua堆栈上的对象的指针放入Lua数据结构、变量或Lua宇宙中的任何其他位置

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

  • “辅助图书馆”里有很多东西可以帮助你。不要忽视它

所有这些在罗伯托的书的第三部分中都有非常清晰的解释,其中包括一些例子

  • 您可以选择自己分配内存(“light userdata”)或让Lua分配内存。通常最好让Lua分配内存,因为它可以在不再需要时自动释放对象,并且还可以关联Lua元表,这允许您(以及其他技巧)要允许对象参与,请执行以下操作: