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

我有一个 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 应用程序中)。

原文链接 https://stackoverflow.com/questions/1158396

点赞
stackoverflow用户120901
stackoverflow用户120901

Lua. 它的占用空间很小,速度相当快,我发现它(主观上)是与C交互的API最令人愉悦的。

如果你想从C中操作Lua对象,使用内置的API非常容易。如果你想从Lua中操作C数据,通常需要一些更多的工作,你可能需要创建包装方法来暴露让Lua修改的部分。

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

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

如何与C集成:Lua的发行版tarball有一个名为"etc"的目录,里面有一些非常好用的例子,应该可以很快地让你入手。具体来说,etc/min.c演示了如何启动一个解释器,让它解释文件,并调用C函数('print'在那种情况下)。从那里开始,你可以通过阅读Lua文档和附带发行版的标准库的源代码来学习它。

2009-07-21 10:39:24
stackoverflow用户6521
stackoverflow用户6521

Lua 旨在实现这一目的,并且相当容易使用。

另外一个值得关注的是 QtScript,它基于 Javascript,尽管这需要一些工作来“Qt化”您的应用程序。

2009-07-21 10:40:53
stackoverflow用户108445
stackoverflow用户108445

以下是来自 Python 网站的关于嵌入 Python 2.6 的文档...

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

2009-07-21 10:57:52
stackoverflow用户77156
stackoverflow用户77156

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

如上Lua是专为此目的设计的嵌入式,使用解释器可以将对象公开到脚本中并从C调用Lua函数,搜索“在C中嵌入Lua”即可找到大量信息,还不要错过Lua手册的“应用程序编程接口”一节(http://www.lua.org/manual/5.1/manual.html#3)。

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

2009-07-21 11:01:50
stackoverflow用户3571
stackoverflow用户3571
2009-07-21 11:06:47
stackoverflow用户6034
stackoverflow用户6034

你可能还想看看 SWIG,这是一个简化包装和接口生成器。正如大家所猜测的,它生成大部分模板代码,以便将你的 C/C++ 代码与脚本引擎接口(手动完成可能会很麻烦)。

它支持 Python 和 Lua(根据你的喜好),以及许多其他语言。生成扩展脚本语言的模块相当容易。扩展 嵌入,这正是你想要的,需要更多的努力。

2009-07-21 12:03:25
stackoverflow用户88888888
stackoverflow用户88888888

你可能会看一下 游戏脚本掌握。因为我也对计算机游戏的高层方面感兴趣,所以这本书经常被推荐给我。

不幸的是,这本书似乎已经停印了(至少在欧洲)。

2009-07-21 17:10:58
stackoverflow用户41661
stackoverflow用户41661

Lua非常适合嵌入。Roberto Ierusalimschy的书《Programming in Lua》是一个好的起点;你可以免费在线获得之前的版本

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

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

typedef struct my_object *Object;
Object some_object;

你的C代码了解这个对象的属性吗?几乎什么也不知道。你所能做的就是:

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

  • 调用真正了解struct my_object内部的函数。

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

  • 你可以调用API,将对象的_指针_放入Lua的堆栈中,然后进入Lua数据结构、变量或Lua宇宙中的任何其他位置。

  • 你定义的函数知道对象的内部,你将这些函数导出到Lua中。

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

这一切都在Roberto的书的第三部分中以清晰明了的方式解释,其中包含示例。一个重要的细节是

  • 你可以选择自己分配内存(“轻量级用户数据”)还是由Lua分配内存。通常最好由Lua分配内存,因为它可以在不再需要时自动释放对象,并且可以关联一个Lua元表,允许对象参与标准Lua操作,例如查找字段,而不仅仅是函数调用。

最后一点:虽然可以使用SWIG或toLua或其他工具尝试生成连接C和Lua的代码,但我建议你自己手写代码。实际上,这很容易做到,这也是了解正在发生的事情的唯一方法。

2009-07-21 22:54:44