如何在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
Lua 旨在实现这一目的,并且相当容易使用。
另外一个值得关注的是 QtScript,它基于 Javascript,尽管这需要一些工作来“Qt化”您的应用程序。
以下是来自 Python 网站的关于嵌入 Python 2.6 的文档...
大多数脚本语言允许在C中嵌入,并且通常允许您将某些对象甚至是函数从C代码公开到脚本中,以便脚本可以操作对象并调用函数。
如上Lua是专为此目的设计的嵌入式,使用解释器可以将对象公开到脚本中并从C调用Lua函数,搜索“在C中嵌入Lua”即可找到大量信息,还不要错过Lua手册的“应用程序编程接口”一节(http://www.lua.org/manual/5.1/manual.html#3)。
尽管Python更适合独立使用,但也可以被嵌入。如果您的脚本使用了大量Python提供的库,则可能非常有用。
一些有用的链接:
- 嵌入 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 Scheme
- 嵌入 PERL
- 嵌入 TCL
- 嵌入 JavaScript
- 嵌入 PHP
我熟悉 Python。Python 是一种非常丰富的语言,有大量可用的库。
你可能还想看看 SWIG,这是一个简化包装和接口生成器。正如大家所猜测的,它生成大部分模板代码,以便将你的 C/C++ 代码与脚本引擎接口(手动完成可能会很麻烦)。
它支持 Python 和 Lua(根据你的喜好),以及许多其他语言。生成扩展脚本语言的模块相当容易。扩展 和 嵌入,这正是你想要的,需要更多的努力。
你可能会看一下 游戏脚本掌握。因为我也对计算机游戏的高层方面感兴趣,所以这本书经常被推荐给我。
不幸的是,这本书似乎已经停印了(至少在欧洲)。
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的代码,但我建议你自己手写代码。实际上,这很容易做到,这也是了解正在发生的事情的唯一方法。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
Lua. 它的占用空间很小,速度相当快,我发现它(主观上)是与C交互的API最令人愉悦的。
如果你想从C中操作Lua对象,使用内置的API非常容易。如果你想从Lua中操作C数据,通常需要一些更多的工作,你可能需要创建包装方法来暴露让Lua修改的部分。
小的代码库和对于引入到嵌入式解释器中的默认库量的严格控制也意味着你可以对安全性做出合理的假设。
唯一奇怪的部分是基于1的数组编号,但是,考虑到迭代器的存在,它并不是那么大的问题。
如何与C集成:Lua的发行版tarball有一个名为"etc"的目录,里面有一些非常好用的例子,应该可以很快地让你入手。具体来说,etc/min.c演示了如何启动一个解释器,让它解释文件,并调用C函数('print'在那种情况下)。从那里开始,你可以通过阅读Lua文档和附带发行版的标准库的源代码来学习它。