代码之家  ›  专栏  ›  技术社区  ›  Diego Sevilla

C++脚本语言[关闭]

  •  39
  • Diego Sevilla  · 技术社区  · 15 年前

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

    我知道我可以嵌入任何流行的脚本语言,如lua,ruby,python。。。但接口通常包含某种“eval”函数,用于计算提供的脚本代码。根据用于C++和脚本语言的工具,将脚本回调到C++中的集成可以或多或少易于编写,但我还没有看到任何脚本语言,它实际上允许我编写独立的模块,这些模块被暴露为.h和./dll到我的程序(可能沿着生成C++代码的脚本语言的行)。

    提前谢谢。

    警察局。我一直在想 Vala

    10 回复  |  直到 15 年前
        1
  •  32
  •   Klaim    15 年前

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

    • ChaiScript
    • Falcon 尝试一个大的项目,优秀的,它不是一个“嵌入”作为CHAISScript,但它是因为它是真正灵活的,并完全被认为是在C++中使用的(只有C++代码在LIBS)-我决定坚持它为我的最大项目,需要大量脚本灵活性(相当于Ruby/Python)
    • AngelScript -还没试过
    • GameMonkey -还没试过
    • Io

    对于你来说,如果你真的想在C++中编写脚本模块,并且很容易把它暴露给脚本语言, 我建议你和猎鹰一起去 . 它完全是用C++编写的,所有的模块/库都是这样编写的。

        2
  •  21
  •   Daniel Earwicker    15 年前

    http://www.swig.org/

    你问的是相反的问题,听起来有点复杂。一个生成.h文件和.so文件的脚本引擎并不是真正的脚本引擎,而是一个编译器!在这种情况下,你可以使用C++。

    脚本引擎不是这样工作的。向它们传递一个脚本和一些回调,这些回调提供了一组可以从脚本调用的函数,并且引擎解释脚本。

        3
  •  21
  •   Vitor Py    15 年前

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

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

    它以一个清理过的头作为输入,并输出一个c文件来完成这项工作。很容易,很高兴和你一起工作。

    为了在C++中使用Lua对象,我将采用像(字段、SETFEAR、CALL方法、方法、字段)这样的方法编写通用代理对象。

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

    然后,c++代码可以使用proxy对象来调用lua代码,在proxy中可以使用一些内省方法来简化此任务。

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

        4
  •  13
  •   Dragontamer5788    15 年前
        5
  •  5
  •   Dennis    15 年前

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

    http://github.com/dennisferron/LikeMagic

    我与LeimEaMo的一个明确目标是在两个方向上完成和完全的C++互操作性。LigMeEao将将本地IO类型封为C++类型(包括STL容器和艾奥的本机列表类型之间的转换),它将代表IO中的C++类、方法、字段和数组。你甚至可以传递一个Io代码块 外面的

    在IO脚本中封装C++类型用于消费是简单、快速和容易的。从C++访问脚本对象确实需要像您所描述的“EVE”函数,但是基于模板的类型转换和封送处理可以很容易地访问执行脚本字符串的结果。并且有上述能力将IO块()对象转换为C++函子。

    目前,该项目仍处于早期阶段,尽管已全面投入运营。我仍然需要做一些事情,比如记录它的构建步骤和依赖关系,它只能用GCC 4.4.1+(不是微软Visual C++)来构建,因为它使用了MSVC中还没有支持的C++ 0x特性。但是,它完全支持Linux和Windows,并且计划使用Mac端口。

    现在坏消息是:让脚本产生.h文件和.c++.dll文件,这不仅需要 编者 (某种)但也必须是 . 这是因为(在许多脚本语言中,尤其是在Io中)对象的方法和字段直到运行时才知道——在Io中,甚至可以从活动对象中添加和删除方法!一开始我想说的是,你要求这样做的事实让我怀疑你是否真的不明白什么是动态语言 . 但我确实相信一种设计方法,你首先试着想象一种理想的或最简单的可能的方法,然后再从那里回到实际可行的地方。所以我承认,从易用性的角度来看,你所描述的听起来更易用。

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

    从包装器函数的调用方的角度来看,我承认这是一个看起来更干净的代码。但是如果这是您想要的,为什么不在脚本语言中使用反射并从存储在脚本对象中的方法列表中生成一个.h文件呢?这种反射可以是 easily done in Io . 在某个时候,我计划整合 OpenC++ source-to-source translator

        6
  •  2
  •   Norman Ramsey    15 年前

    你可以用Lua来实现这一点,但是如果你有很多类,你会希望SWIG或toLua++这样的工具为你生成一些粘合代码。

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

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

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

    如果您自己决定这样做,编写胶粘代码将LUA表转换成C++类(以便Lua代码看起来像C++)到程序的其余部分是相当简单的。在另一个方向上,在Lua中包装C++(让C++对象查看像Lua值的脚本)是AsS中的一大麻烦。

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

        7
  •  1
  •   T.J. Crowder    15 年前

    谷歌的 V8 engine 是用C++编写的,我希望你可以把它集成到一个项目中。他们说要这么做 in this article

        8
  •  1
  •   tathagata    15 年前

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

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

        9
  •  0
  •   Ben Collins    15 年前

    你可以签入嵌入 Guile (方案口译员)或 V8 (谷歌的JavaScript解释器-在Chrome中使用,它是用C++编写的)。