外国金融机构的扩展是什么? 我在C++中编码一些东西,我想在我的应用程序中提供脚本层,在寻找一个可行的解决方案时,我发现了这个代码> FFI扩展< /代码>,但是我不能真正找到适合他们的文档,这个家伙发明了这个或任何其他“可靠”的技术来源,我唯一清楚的是,这项技术是跨语言的,在LuaJit、Ruby和Haskell中,有人在谈论这项技术,但我不知道这“东西”是什么

外国金融机构的扩展是什么? 我在C++中编码一些东西,我想在我的应用程序中提供脚本层,在寻找一个可行的解决方案时,我发现了这个代码> FFI扩展< /代码>,但是我不能真正找到适合他们的文档,这个家伙发明了这个或任何其他“可靠”的技术来源,我唯一清楚的是,这项技术是跨语言的,在LuaJit、Ruby和Haskell中,有人在谈论这项技术,但我不知道这“东西”是什么,c++,scripting,ffi,C++,Scripting,Ffi,有什么可比的吗?是新来的孩子吗?是一个概念。这是许多语言所称的粘合层,它使您能够调用其他语言(通常这个桥是a到C ABI),因此每个项目的粘合层都不同。(例如,对于Erlang 通常用于实现语言中的粘合层,就像现在一样。请原谅我给出了一个非常一般的答案,但您的问题似乎也是这样 与Java相比,没有“一个FFI”,也没有“一个可靠的脚本环境”。在Java中,JS Rhino脚本语言几乎“内置”在JRE中 C/C++具有“相对容易”的功能这是因为所有其他的平台通常都是用C/C++实现的。很抱歉,泛化

有什么可比的吗?是新来的孩子吗?

是一个概念。这是许多语言所称的粘合层,它使您能够调用其他语言(通常这个桥是a到C ABI),因此每个项目的粘合层都不同。(例如,对于Erlang


通常用于实现语言中的粘合层,就像现在一样。

请原谅我给出了一个非常一般的答案,但您的问题似乎也是这样

与Java相比,没有“一个FFI”,也没有“一个可靠的脚本环境”。在Java中,JS Rhino脚本语言几乎“内置”在JRE中

C/C++具有“相对容易”的功能这是因为所有其他的平台通常都是用C/C++实现的。很抱歉,泛化和过于简化。但是,关键是,如果你有其他平台的C++源代码,你可以通过观察标准的创建方式来添加新的东西。 关键是,通常所有其他平台都是:

  • 闭源
  • 开源,但授权方式会阻止您使用它
  • 开源,许可良好,但足够大/复杂,您根本不想编译/更改其内部
因此,其他平台都会自行生成一些调用C API的方法,也就是说,您可以使用Ruby/Python中的Win32API,而无需重新编译整个Python的运行时,因为您想调用
SendKeys

因此,通常是“其他平台”以另一种方式调用C/C++。这是因为它们都已经有了一种方法来实现这一点。甚至Java也有JNI,.net也有p/Invoke,对吗

但是,现在,从X调用C++-from-X是可能的,这取决于X或Y或Z平台,它有很大的不同。通常,它可以工作,但定义起来很繁琐或很难处理。例如,在Ruby on Windows中,您可以通过以下方式调用任何C api:

  • 给出函数的实际名称,即
    @2AV21moveMeByDistance
  • 给出参数类型的编码列表,即
    ifpp
    (int、float、pointer、pointer)
  • 以适当的类型和顺序提供适当的参数
如果你不遵守,它会严重崩溃。顺便说一句,上面的例子是不正确的。但是看起来很相似

因此,几乎在任何平台上,都有许多工具可以简化这一点。在所有平台上——不同的平台上。但都被称为FFI-linenos,因为这是一个概念

<>工具可能要求你用一些额外的信息注释C++代码,如:

 class RUBIZE MyClass :: BaseThing
 {
     PUBLIC(void,int,int) void moveMeByDistance(int x, int y) { ... }
     PUBLIC(void)         void .......
 };
然后,他们可以处理您的.h文件,自动生成“绑定”,然后生成一个“绑定库”,该库将调整脚本环境,以便您现在可以直接从脚本调用
MyClass::moveMyByDistance(5,6)

或者,它们可能要求您在运行时注册所有位,即:

 class MyClass :: ScriptObject
 {
     void moveMeByDistance(int x, int y) { ... }
     void .......
 };

 int dllmain()
 {
     ScriptingEnv::RegisterClass<MyClass>();
     ScriptingEnv::RegisterClass( "move", &MyClass::moveMeByDistance );
     ScriptingEnv::RegisterClass( "eat", .... );
 }
class MyClass::ScriptObject
{
void moveMeByDistance(int x,int y){…}
无效的
};
int dllmain()
{
ScriptingEnv::RegisterClass();
ScriptingEnv::RegisterClass(“move”,&MyClass::moveMeByDistance);
ScriptingEnv::RegisterClass(“eat”,…);
}
但同样,上述所有例子都是人为的

因为C/C++可以与任何其他平台进行接口(因为任何其他平台通常都有相应的工具:p),你必须首先决定你想使用哪种脚本语言。JS?Lua?Ruby?Python?所有这些语言都可以。然后寻找能为你提供最舒适桥接方式的库。有很多,但你必须查看与该语言相关的网站/论坛等。或者甚至在这里,然后询问具体语言uge/图书馆

要查找的关键字包括:

  • 模块——即“使用新模块扩展XYZ脚本”
  • 扩展——即“在C++中为Ruby编写扩展”
  • 绑定——即“FastFourierTransform库的Ruby绑定”
  • 从XYZ语言调用C/C++代码/类

等等。

这是一种从一种语言调用另一种语言代码的方法。@BenjaminGruenbaum相当含糊……这是编译器的功能?是运行时的功能?它来自什么?它是如何工作的?好吧,它是ABI,所以它或多或少是在运行时发生的,那么我付出的代价和优点在哪里呢?@user2485710如果你想合作的话不要使用libffi,最好阅读它的文档。如果你想发明自己的FFI,你自己负责。优点很简单,A)你可以调用用另一种语言编写的东西。它既不是来自编译器,也不是“运行时”。跨语言工具通常只是库,双方都必须正确使用它们才能获得效果。您有两种以上的语言、两种以上的运行时和两个编译器。当谈到C++和露比时,大部分时间C++将是较低的,而露比将是高级的。较低的版本需要您在编译时向模块中添加额外的元信息,而较高的版本将读取这些元信息并在运行时使用它们。因此,成本是双方的。您的C++代码将变得“脏”,脚本环境会变得更“重”。对于下行者:很好的知道为什么你要把一个完全正确的答案否决下来。所以这个FFI严重依赖于调用COVEN。