外国金融机构的扩展是什么

What are the FFI extensions?

本文关键字:扩展 是什么 金融机构      更新时间:2023-10-16

我正在用C++编写一些东西,我想在我的应用程序中提供一个脚本层,在寻找可行的解决方案的过程中,我找到了这个FFI extensions,但我真的找不到合适的文档,也找不到发明它的人或任何其他"可靠"和技术来源,我唯一清楚的是,这项技术是跨语言的,用LuaJit,Ruby和Haskell有人在谈论这个东西,但我不知道这个"东西"是什么

有什么东西可以与SWIG相媲美吗?是街区里的新孩子吗?

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

libffi通常用于实现语言中的粘合层,SWIG也是如此。

请给我一个非常一般的答案,但你的问题似乎也是这样。。

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

C/C++具有与所有/任何其他平台"相对容易"对接的能力。这是因为所有其他平台通常都是用C/C++实现的。抱歉过于笼统和简单化。但是,关键是,如果你有其他平台的C++源代码,你只需要观察标准代码是如何创建的,就可以为它们添加新的东西。

重点是,通常所有其他平台都是:

  • 闭源
  • 开源,但以阻止您使用它的方式获得许可
  • 开源,许可良好,但足够大/复杂,你根本不想编译/更改它们的内部

因此,其他所有平台都会自行生成一些调用C API的方法。这只是为了让你可以使用Ruby/Python中的Win32API,而不需要因为你想调用SendKeys等而真正重新编译整个Python的运行时。

所以,通常情况下,调用C/C++的是"其他平台",而不是其他平台。这是因为他们都已经有办法做到这一点了。甚至Java有JNI,.net有P/Invoke,对吧?

但是,现在,从X调用C++是可能的,这取决于X、Y或Z平台,差异很大。通常情况下,它是有效的,但定义起来很乏味,或者只是很笨拙。也就是说,在Windows上的Ruby中,您可以通过以下方式调用任何C api:

  • 给出函数的实际名称,即_@@2AV21moveMeByDistance
  • 给出参数类型的编码列表,即ifpp(int、float、pointer、pointer)
  • 以适当的类型和顺序给出适当的参数

如果你不遵守,它会崩溃的。顺便说一句,上面的例子是人为的,是不正确的。但它看起来很相似。

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

这些工具可能需要你用一些额外的信息来注释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", .... );
 }

但是,以上所有的例子都是人为的。

由于C/C++可以连接到任何其他平台(由于任何其他平台通常都有这样的工具:p),您必须首先决定要使用的脚本语言。JS?Lua?红宝石蟒蛇他们都可以。然后寻找那些能为你提供最舒适的桥接方式的库。有很多,但你必须查看与该语言相关的网站/论坛等。甚至在这里,但随后询问具体的语言/图书馆。

要查找的关键字有:

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

等等。