C ++脚本语言

我在脚本语言中有些生疏,只要最近他们像蘑菇一样popup:)

今天,我认为有一个脚本语言可以与C ++无缝对话,也就是说,可以使用C ++类,而且对我来说最重要的是可以编译成C ++或某个DLL / .SO(加上它的。 h),以便我可以将它链接到我的C ++程序中,并利用脚本定义或实现的类。

我知道我可以embedded任何stream行的脚本语言,如卢阿,ruby,python…但接口通常包括某种“eval”函数来评估提供的脚本代码。 根据用来连接C ++和脚本语言的工具,脚本到C ++的callback集成可能或多或less容易编写,但是我还没有看到任何脚本语言,它们实际上允许我编写独立的模块作为一个.h和.so / dll暴露给我的程序(也许沿着生成C ++代码的脚本语言)。

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

提前致谢。

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

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

  • ChaiScript – 现在在一个小项目中尝试,有趣的是,这个是用C ++ 编写的 ,只是包含一个头文件而已 。 不知道是否对一个大项目有好处,但会看到,尝试有一些味道!
  • 猎鹰 – 尝试一个大项目,优秀; 它不是一个“包括embedded”作为ChaiScript,但它是因为它非常灵活,并且完全被认为是用在C ++(只有在C库中的C ++代码) – 我决定坚持它为我的最大的项目,需要很多脚本灵活性(可比较ruby / python)
  • AngelScript – 还没有尝试
  • GameMonkey – 还没有尝试
  • Io – 还没有尝试

对于你来说,如果你真的想用C ++编写你的脚本模块,并且很容易把它暴露给脚本语言, 我会推荐使用Falcon 。 这完全是用C ++编写的,所有的模块/库都是这样编写的。

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

你问的是相反的问题,这听起来像是让事情复杂化了一点。 生成.h文件和.so文件的脚本引擎不会真正成为脚本引擎 – 它将是一个编译器! 在这种情况下,你可以使用C ++。

脚本引擎不能这样工作。 您将脚本和一些callback函数传递给它们,这些callback函数提供了一组可以从脚本调用的函数,并且引擎将解释脚本。

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

在lua中使用C ++类可以使用:

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

它将清理后的头部作为input,并输出交stream文件,完成辛勤工作。 轻松,愉快和愉快的工作。

对于在C ++中使用Lua对象,我会采用像(field,setField,callMethod,methods,fields)这样的方法来编写一个通用代理对象的方法。

如果你想要一个DLL你可以有一个.lua作为一个资源(在Windows中,我不知道什么可能是一个合适的等效的Linux),并在您的DllMain初始化您的代理对象与卢阿代码。

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

你可以重新使用代理对象来为你想写的每个lua库,只是改变提供给它的lua代码。

这略微超出了我的专业领域,但我愿意冒风险。 🙂

Boost :: Python似乎是你在找什么。 它使用了一些macros魔法来实现它的function,但它确实将Python类暴露给了C ++。

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

http://github.com/dennisferron/LikeMagic

LikeMagic的一个明确的目标是在两个方向上完整的和完整的C ++互操作性。 LikeMagic会将原生Iotypes编组为C ++types(包括在STL容器和Io的本地Listtypes之间进行转换),它将代表Io中的C ++类,方法,字段和数组。 你甚至可以将Io代码块 Io环境中传出 ,并用C ++作为函数。

在Io脚本中包装C ++types以供消耗是简单,快速和容易的。 从C ++访问脚本对象的确需要一个像你所描述的“eval”函数,但是基于模板的types转换和封送处理使得访问执行脚本string的结果变得容易。 还有上述将Io block()对象转换为C ++函子的能力。

目前这个项目还处于初期阶段,尽pipe它已经全面投入运营。 我仍然需要做文档的构build步骤和依赖关系,而且只能使用gcc 4.4.1+(而不是Microsoft Visual C ++)来编译,因为它使用了MSVC中尚不支持的C ++ 0x特性。 但是,它完全支持Linux和Windows,并且计划使用Mac端口。

现在,坏消息是:使脚本生成可从C ++调用的.h文件和.so或.dll文件不仅需要编译器 (一种sorting),而且还必须是JIT编译器 。 这是因为(在许多脚本语言中,但尤其是在Io中)对象的方法和字段直到运行时才知道 – 在Io中,甚至可以将方法添加到活动对象中并从中删除! 起初,我要说的是,你问这个问题让我想知道,如果你真的不明白dynamic语言什么的话。 但我确实相信一种devise方式,你首先想象一下做某件事的理想或最简单的方法,然后从那里向后倒退到实际可能的地方。 所以我从容易使用的angular度来承认,你所描述的听起来更容易使用。

但是,尽pipe这是理想的,而且几乎没有可能(使用JIT编译的脚本语言),但它不是很实用,所以我仍然不确定你所要求的是你真正想要的。 如果脚本中的.h和.so / .dll文件被打乱了,并且脚本发生了变化,那么你需要重新编译你的C ++程序来利用这个改变! 这不违背使用脚本的主要好处吗?

唯一可行的方法是,如果定义脚本的接口不改变,并且只是为脚本函数制作C ++包装器。 你最终会有很多C ++函数,比如:

int get_foo() { return script.eval("get_foo()"); } int get_bar() { return script.eval("get_bar()"); } 

我承认,从包装函数调用者的angular度来看,这是更清晰的代码。 但是,如果这就是你想要的,为什么不在脚本语言中使用reflection,并从存储在脚本对象中的方法列表中生成一个.h文件? 这种reflection可以很容易地在Io中完成 。 在某些时候,我打算把OpenC ++的源代码到源代码转换器作为LikeMagic的可调用库,这意味着你甚至可以使用一个强大的C ++代码生成器来代替写出string。

你可以用Lua做到这一点,但是如果你有很多类,你需要一个像SWIG或toLua ++这样的工具来为你生成一些粘合代码。

这些工具都不会处理你的问题的不寻常的部分,这是一个隐藏脚本语言的.h文件,并让你的C代码调用脚本,而不知道这是脚本。 要做到这一点,你必须做到以下几点:

  • 自己写胶水代码。 (对于Lua来说,这是相对容易的,直到你进入课堂之后,就不那么容易了,这就是为什么像SWIG和toLua ++这样的工具存在的原因。)

  • 隐藏界面的脚本解释器的某种全局状态。

  • 假设您有多个使用脚本实现的.h文件,您必须决定哪些脚本语言共享状态,哪些使用单独的脚本状态。 (你基本上有一个虚拟机的脚本语言,极端是(一)所有.h文件使用相同的虚拟机的共同和(b)每个.h文件有它自己独立的虚拟机,其他select更多复杂。)

如果你自己决定这样做,编写粘合代码将Lua表转换成C ++类(这样Lua代码看起来像C ++到程序的其余部分)是非常简单的。 从另一个angular度来看,在Lua中包装你的C ++(这样C ++对象看起来像Lua值这样的脚本)是一个很大的麻烦。

不pipe你做什么,你都有一些工作要做。

好问题,我自己经常想到这个,但是这样的事情是不容易的。 如果你在Windows上(我猜不是),那么你可以通过在C ++和VB中创buildCOM组件(考虑到它是一种脚本语言)来实现这个目标。 谈话通过COM接口发生,这是在不同语言之间进行互操作的好方法。 基于.NET的语言也是一样,它们之间可以进行互操作。

我也很想知道是否存在这样的C ++,最好是开源的。

您可以检查embeddedGuile (一个scheme解释器)或V8 (谷歌的JavaScript解释器 – 在Chrome中使用 – 用C ++编写)。

Google的V8引擎是用C ++编写的,我希望你可以把它集成到一个项目中。 他们在这篇文章中谈到了这样做。