我是LikeMagic的作者,它是一个用于Io语言的C++绑定库。(我不是Io语言的作者。)
http://github.com/dennisferron/LikeMagic
我在LikeMagic中的一个明确目标是实现完全且双向的C++互操作性。 LikeMagic将本地Io类型作为C++类型进行编组(包括在Io中的STL容器和本机List类型之间进行转换),并在Io中表示C++类、方法、字段和数组。 您甚至可以传递一个Io代码块
出 Io环境,并将其用作C++中的函数对象!将C++类型封装以供Io脚本使用非常简单,快速且轻松。从C++访问脚本对象确实需要像您描述的“eval”函数,但是基于模板的类型转换和编组使得访问执行脚本字符串的结果变得容易。而且,上述能力可以将Io block()对象转换为C++函数对象。目前该项目仍处于早期阶段,尽管它已经完全可用。我仍然需要做一些事情,例如记录其构建步骤和依赖项,并且它只能使用gcc 4.4.1+(而不是Microsoft Visual C ++),因为它使用了MSVC尚未支持的C++0x功能。但是,它完全支持Linux和Windows,并计划进行Mac移植。
现在是个坏消息:让脚本生成.h文件和可从C++调用的.so或.dll文件不仅需要(某种形式的)编译器,而且还必须是即时编译器(JIT compiler)。这是因为(在许多脚本语言中,尤其是在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()"); }
我承认从调用包装函数的角度来看,这是更清晰的代码。但如果您想要这样做,为什么不在脚本语言中使用反射并根据存储在脚本对象中的方法列表生成一个.h文件呢?这种反射可以
在Io中轻松实现。我计划将
OpenC++源到源代码转换器作为可调用库集成到LikeMagic中,这意味着您甚至可以使用强大的C++代码生成器而不是编写字符串。