C++ C++;

C++ C++;,c++,scripting,scripting-language,C++,Scripting,Scripting Language,我对脚本语言有点生疏了,只要它们最近像蘑菇一样突然出现:) 今天我想,有一种脚本语言可以很好地与C++进行无缝对话,也就是说,可以使用C++类,而对我来说最重要的是可以编译成C++或一些DLL /.SO(加上.h),这样我就可以把它链接到C++程序中,并利用脚本定义或实现的类。 我知道我可以嵌入任何流行的脚本语言,如lua、ruby、python。。。但该接口通常包含某种“eval”函数,用于评估提供的脚本代码。根据C++和脚本语言的工具,脚本的回调到C++的集成可以或多或少地容易编写,但是我没

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

<>今天我想,有一种脚本语言可以很好地与C++进行无缝对话,也就是说,可以使用C++类,而对我来说最重要的是可以编译成C++或一些DLL /.SO(加上.h),这样我就可以把它链接到C++程序中,并利用脚本定义或实现的类。 我知道我可以嵌入任何流行的脚本语言,如lua、ruby、python。。。但该接口通常包含某种“eval”函数,用于评估提供的脚本代码。根据C++和脚本语言的工具,脚本的回调到C++的集成可以或多或少地容易编写,但是我没有看到任何脚本语言,它实际上允许我编写独立的模块,这些模块作为A.H和./DLL被暴露到我的程序中。(也许沿着生成C++代码的脚本语言的线条)。 你知道这样的工具/脚本语言吗

提前谢谢


Pd。我一直在思考Haskell的GHC。它们生成C,但不是C++。…< P/> < P>你可以检查嵌入(一个方案解释器)或者(谷歌的JavaScript解释器-用Chrome——这是用C++编写的)。

< P>谷歌是用C++编写的,我希望你可以把它集成到一个项目中。他们谈论做这件事。

< P>这是我的专业领域之外的一部分,但我愿意冒着下降的风险。
似乎就是你要找的。它使用一点宏魔术来完成它的操作,但是它确实把Python类暴露给C++。

在这个上下文中通常被问的问题是:我如何暴露我的C++类,以便它们可以从脚本实例化?答案通常是这样的

你问的是相反的问题,听起来你把事情弄得有点复杂了。生成.h文件和.so文件的脚本引擎并不是真正的脚本引擎,而是一个编译器!在这种情况下,你可以使用C++ +< /P>
脚本引擎不是这样工作的。您向他们传递一个脚本和一些回调函数,这些函数提供了一组可以从脚本调用的函数,引擎将解释脚本。

好问题,我自己经常想到这一点,但遗憾的是,这类问题没有简单的解决方案。如果你在Windows上(我想不是),那么你可以通过在C++和VB中创建COM组件(考虑到脚本语言)来实现这样的事情。对话通过COM接口进行,这是在不同语言之间进行互操作的好方法。基于.NET的语言也是如此,它们之间可以进行互操作

<>我也很想知道C++中是否存在这样的问题,最好是开源的。< /P> < P> > Lua:

使用Lua中的C++类,可以使用:

要生成绑定,请使用tolua++:

它将一个清理过的头作为输入,并输出一个c文件,以完成繁重的工作。简单,友好,工作愉快

在C++中使用Lua对象时,我会采用一般的代理对象的方法来编写(如字段、SETFEAR、CALL方法、方法、字段)。 如果您想要一个dll,您可以将.lua作为一个资源(在Windows中,我不知道什么是适合Linux的等效资源),并在DllMain上使用lua代码初始化代理对象

< > C++代码可以使用代理对象调用Lua代码,代理中可能有一些自检方法使这个任务更容易。
您可以为每个要编写的lua库重用代理对象,只需更改提供给它的lua代码。

您可以使用lua执行此操作,但是如果您有很多类,您需要像SWIG或toLua++这样的工具来为您生成一些粘合代码

这些工具都不会处理你的问题的异常部分,那就是有一个.h文件隐藏在脚本语言中,并且让C++代码调用脚本而不知道脚本是脚本。要完成此操作,您必须执行以下操作:

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

  • 在接口后面隐藏脚本解释器的某种全局状态

  • 假设您有多个.h文件,每个文件都是使用脚本实现的,那么您必须决定哪些文件共享脚本语言中的状态,哪些文件使用单独的脚本状态。(基本上,脚本语言有一个VM,极端情况是:(a)所有.h文件都使用相同的VM;(b)每个.h文件都有自己独立的VM。其他选择更复杂。)

<>如果你决定自己做这件事,写胶水代码把LUA表变成C++类(这样Lua代码看起来像C++),这是相当简单的。向另一个方向前进,在Lua中包裹C++(这样C++对象查看脚本就像Lua值)是一个很大的麻烦。
无论你做什么,你都有一些工作要做。

更新2020:今天我可能会选择Lua+,除非我真的想避免Lua作为一种语言。Chaiscript在这种情况下成为了一个很好的候选者,尽管与Lua+Sol2/3相比,它的性能并不是最优的(尽管经过多年的改进,它在许多情况下仍然足够好)。 猎鹰已经死了好几年了,瑞普


以下是面向C++的集成,而不是语言绑定:

    在一个小项目中尝试,有趣的是,这是一个用C++制作的作品,只包括一个标题!不确定它是否适合一个大项目,但会看到,尝试一下
    int get_foo() { return script.eval("get_foo()"); }
    int get_bar() { return script.eval("get_bar()"); }