C++的脚本语言

Die*_*lla 39 c++ scripting scripting-language

我在脚本语言方面有点生疏,只要它们最近像蘑菇一样突然出现:)

今天我认为有一种脚本语言与C++无缝对话会很好,也就是说,可以使用C++类,对我来说最重要的是,可以编译成C++或者一些DLL/.SO(加上它. h)这样我就可以将它链接到我的C++程序中并使用脚本定义或实现的类.

我知道我可以嵌入任何流行的脚本语言,如lua,ruby,python ......但是接口通常包含某种"eval"函数,用于评估提供的脚本代码.根据用于耦合C++和脚本语言的工具,脚本回调到C++的集成可能或多或少易于编写,但我没有看到任何实际上允许我编写独立模块的脚本语言作为.h和.so/dll暴露给我的程序(可能是生成C++代码的脚本语言).

你知道这样的工具/脚本语言吗?

提前致谢.

PD.我一直在思考Vala或Haskell的GHC.他们生成C,但不生成C++ ......

Kla*_*aim 32

以下是比语言绑定更多的C++集成:

  • ChaiScript - 在一个小项目中尝试,有趣的是,这个是用C++ 编写的,只需要包含一个标题!不确定它是否对一个大项目有好处但是会看到,尝试它有一些味道!
  • 猎鹰 - 尝试一个大项目,非常好; 它不是ChaiScript的"一个包含嵌入",而是因为它非常灵活,并且完全被认为是在C++中使用(在库中只有C++代码) - 我决定坚持使用它来完成我需要大量工作的最大项目脚本灵活性(与ruby/python相当)
  • AngelScript - 还没试过
  • GameMonkey - 还没试过
  • Io - 没试过

对于你,如果你真的想用C++编写脚本模块并轻松地将它暴露给脚本语言,我建议你去Falcon.它完全是用C++编写的,所有模块/库都是用这种方式编写的.


Dan*_*ker 21

在这种情况下通常要问的问题是:我如何公开我的C++类,以便可以从脚本中实例化它们?答案通常是http://www.swig.org/

你问的是相反的问题,听起来你的问题有点复杂.生成.h文件和.so文件的脚本引擎实际上不是脚本引擎 - 它将是一个编译器!在这种情况下,您可以使用C++.

脚本引擎不能像那样工作.您向它们传递一个脚本和一些回调,这些回调提供了一组可以从脚本调用的函数,引擎会解释脚本.


Vit*_* Py 21

试试lua:http://www.lua.org/

要在lua中使用C++类,您可以使用:

要生成绑定,请使用tolua ++:http://www.codenix.com/~tolua/

它需要一个清理过的标题作为输入并输出完成辛苦工作的ac文件.简单,美观,愉快.

为了在C++中使用Lua对象,我采用了使用(field,setField,callMethod,methods,fields)等方法编写通用Proxy对象的方法.

如果你想要一个dll,你可以将.lua作为资源(在Windows中,我不知道什么是Linux的合适等价物),并在你的DllMain上使用lua代码初始化你的代理对象.

然后,c ++代码可以使用代理对象来调用lua代码,代理中可能有一些内省方法可以使这个任务更容易.

您可以为要编写的每个lua库重用代理对象,只需更改提供给它的lua代码即可.


Dra*_*788 13

这略微超出了我的专业领域,但我愿意冒险投票.:-)

Boost :: Python似乎是你正在寻找的东西.它使用了一些宏魔术来完成它的工作,但它确实将Python类暴露给C++而且非常干净.


Den*_*nis 5

我是LikeMagic的作者,LikeMagic是Io语言的C++绑定库.(我不是Io的作者.)

http://github.com/dennisferron/LikeMagic

我对LikeMagic的一个明确目标是在两个方向上完整且完全的C++互操作性.LikeMagic将封装本地Io类型作为C++类型(包括在STL容器和Io的本机List类型之间进行转换),它将代表Io中的C++类,方法,字段和数组.您甚至可以 Io环境中传递一块Io代码,并在C++中将其用作仿函数!

在Io脚本中包装C++类型是简单,快速和简单的.从C++访问脚本对象确实需要像您所描述的"eval"函数,但基于模板的类型转换和编组可以轻松访问执行脚本字符串的结果.并且有上述能力将Io block()对象转换为C++仿函数.

目前该项目仍处于早期阶段,尽管该项目已全面运作.我仍然需要做一些事情,比如记录它的构建步骤和依赖项,它只能用gcc 4.4.1+(不是Microsoft Visual C++)构建,因为它使用了MSVC尚不支持的C++ 0x功能.但是,它完全支持Linux和Windows,并且计划使用Mac端口.

现在坏消息:使脚本生成.h文件和.so或.dll文件可以从C++调用,这不仅需要编译器(一种),而且还必须是一个JIT编译器.这是因为(在许多脚本语言中,但最重要的是在Io中)对象的方法和字段直到运行时才知道 - 在Io中,甚至可以在实时对象中添加和删除方法!起初我会说,你要求这个事实让我想知道你是否真的不明白动态语言什么.但我确实相信一种设计方式,在这种方式中,你首先想象一下理想的或最简单的做事方式,然后从那里向后工作到实际可行的方式.因此,我会从易于使用的角度承认,您所描述的声音听起来更容易使用.

虽然它是理想的,并且几乎不可能(使用带有JIT编译的脚本语言),但它不太实用,所以我仍然不确定你所要求的是你真正想要的.如果.h和.so/.dll文件是从脚本中进行了JIT,并且脚本发生了变化,那么您需要重新编译C++程序以利用更改!这是否违反了首先使用脚本的主要好处?

唯一可行的方法是,如果界面定义的脚本没有改变,你只是为脚本函数制作C++包装器.您最终会拥有许多C++函数,例如:

int get_foo() { return script.eval("get_foo()"); }
int get_bar() { return script.eval("get_bar()"); }
Run Code Online (Sandbox Code Playgroud)

从包装函数的调用者的角度来看,我会承认这是一个更清晰的代码.但是,如果这就是你想要的,为什么不在脚本语言中使用反射并从脚本对象中存储的方法列表生成.h文件?这种反射可以在Io中轻松完成.在某些时候,我计划将OpenC++源到源转换器集成为LikeMagic中的可调用库,这意味着您甚至可以使用强大的C++代码生成器而不是写出字符串.


Ben*_*ins 0

您可以检查嵌入Guile(一种方案解释器)或V8(Google 的 javascript 解释器 - 在 Chrome 中使用 - 用 C++ 编写)。