Какие расширения FFI?

Я что-то кодирую на C ++, и я хотел бы предложить сценарий слой в моем приложении, во время поиска работоспособного решения я нашел это FFI extensions но я не могу найти надлежащую документацию для них, парня, который изобрел этот или любой другой «надежный» и технический источник, единственное, что мне ясно, это то, что эта технология является мультиязычной, в LuaJit, Ruby и Haskell кто-то говорит об этом, но я понятия не имею, что это за «вещь».

Это что-то сопоставимое с SWIG ? Это новый ребенок на блоке?

0

Решение

FFI это концепция. Это то, что многие языки называют своим клеевым слоем, что позволяет вам обращаться к другим языкам (очень часто этот мост представляет собой C ABI), и поэтому он отличается для каждого проекта. (например. этот для Эрланга

libffi часто используется для реализации этого клеевого слоя в языке, как SWIG.

2

Другие решения

Извините за очень общий ответ, но ваш вопрос также кажется таким ..

В отличие от Java, здесь нет «единой FFI» и «единой надежной среды сценариев». В Java язык сценариев JS Rhino почти «встроен» в JRE.

C / C ++ обладает способностью «относительно легко» взаимодействовать со всеми / любыми другими платформами. Это потому, что все остальные платформы обычно реализованы на C / C ++. Извините за обобщение и упрощение. Но дело в том, что если бы у вас были исходные коды C ++ других платформ, вы бы добавили к ним новые вещи, просто наблюдая за тем, как создавались стандартные.

Дело в том, что обычно все остальные платформы являются:

  • закрытый источник
  • с открытым исходным кодом, но лицензируется таким образом, чтобы вы не могли его использовать
  • с открытым исходным кодом, хорошо лицензированный, но достаточно большой / сложный, что вы просто не хотите компилировать / изменять их внутренние компоненты

Таким образом, каждая другая платформа сама по себе создает способ вызова C API. Просто вы можете использовать Win32API из Ruby / Python без необходимости перекомпиляции всей среды выполнения Python только потому, что вы хотите вызвать SendKeys и т.п.

Так что, как правило, это «другие платформы», которые обращаются к C / C ++, чем другие. Это потому что они все уже есть способ сделать это. Даже в Java есть JNI, а в .net есть P / Invoke, верно?

Но теперь вызов C ++ — from-X возможен, в зависимости от платформы X или Y или Z, он сильно отличается. И очень часто это работает, но утомительно определять или просто громоздко. То есть в Ruby на Windows вы можете вызвать любой C api:

  • дать фактическое имя функции, т.е. _@@2AV21moveMeByDistance
  • предоставление закодированного списка типов параметров, т.е. ifpp (Целый, дробный, указатель, указатель)
  • давая правильные параметры в правильных типах и порядке

если вы не последуете, это плохо рухнет. Приведенные выше примеры являются искусственными и неверными, кстати. Но это выглядит похоже.

Таким образом, практически на любой платформе было много инструментов, чтобы упростить это. На всех платформах — разные. Но все они называются FFI — линия н.у.к. сказал, потому что это понятие.

Инструменты могут, например, потребовать от вас аннотирования кода 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? Рубин? Python? Все они могут. Тогда ищите библиотеки, которые предоставляют вам наиболее удобный способ соединения. Их много, но вам придется взглянуть на сайты / форумы и т. Д., Связанные с этим языком. Или даже здесь, но тогда спросите о конкретном языке / библиотеке.

Ключевые слова для поиска:

  • модули — то есть «расширение XYZ Script новыми модулями»
  • extensions — то есть «написание расширений для Ruby в C ++»
  • привязки — то есть «привязки Ruby для библиотеки FastFourierTransform»
  • вызов C / C ++ кода / классов из языка XYZ

и т.п.

0

По вопросам рекламы [email protected]