Я что-то кодирую на C ++, и я хотел бы предложить сценарий слой в моем приложении, во время поиска работоспособного решения я нашел это FFI extensions
но я не могу найти надлежащую документацию для них, парня, который изобрел этот или любой другой «надежный» и технический источник, единственное, что мне ясно, это то, что эта технология является мультиязычной, в LuaJit, Ruby и Haskell кто-то говорит об этом, но я понятия не имею, что это за «вещь».
Это что-то сопоставимое с SWIG ? Это новый ребенок на блоке?
FFI это концепция. Это то, что многие языки называют своим клеевым слоем, что позволяет вам обращаться к другим языкам (очень часто этот мост представляет собой C ABI), и поэтому он отличается для каждого проекта. (например. этот для Эрланга
libffi часто используется для реализации этого клеевого слоя в языке, как SWIG.
Извините за очень общий ответ, но ваш вопрос также кажется таким ..
В отличие от 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? Все они могут. Тогда ищите библиотеки, которые предоставляют вам наиболее удобный способ соединения. Их много, но вам придется взглянуть на сайты / форумы и т. Д., Связанные с этим языком. Или даже здесь, но тогда спросите о конкретном языке / библиотеке.
Ключевые слова для поиска:
и т.п.