外国金融机构的扩展是什么
What are the FFI extensions?
我正在用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++代码/类
等等。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 谁能告诉我,程序中的错误是什么?该程序仅用于获取文件扩展名
- 是什么导致我的 Python 紧缩 C 扩展崩溃?
- 头文件中.h扩展名的意义是什么?
- 对于我扩展此程序来计算最高10x10矩阵的倒数的最简单方法是什么
- 按特定顺序扩展可变参数模板值的最有效方法是什么?
- 扩展std名称空间被认为是未定义行为的原因是什么
- 继承Java集合接口(Set、Map、List等)的C++等价物是什么?或者扩展AbstractCollection
- 我的火狐扩展程序不起作用。使用C++XPCOM组件的Firefox扩展(XPI文件)的结构是什么?
- 外国金融机构的扩展是什么
- 这个 GNU C,C++ 宏的扩展是什么?
- 外部模板是 c++11 扩展是什么意思
- C++模板实现文件的正确文件扩展名是什么
- 动态扩展数组以导入数据的好方法是什么
- 在调用者内部扩展被调用者的指导原则是什么(内联-编译器优化)
- c++0x源文件的默认文件扩展名是什么
- 分发用 C 编写的 PHP 扩展的最简单方法是什么?
- 如果用户在C++中输入字符串,如何检查此目录中是否有具有该名称的文件以及它的扩展名是什么?