libffi — это библиотека интерфейса внешних функций . Она предоставляет интерфейс языка программирования C для вызова изначально скомпилированных функций с указанием информации о целевой функции во время выполнения, а не во время компиляции . Она также реализует противоположную функциональность: libffi может создавать указатель на функцию, которая может принимать и декодировать любую комбинацию аргументов, определенных во время выполнения.
libffi чаще всего используется как связующее звено между реализациями компилируемых и интерпретируемых языков. libffi также может использоваться для реализации подключаемых модулей , когда сигнатуры функций подключаемого модуля неизвестны на момент создания хост-приложения.
Известные пользователи включают Python , Haskell , Dalvik , F-Script, PyPy , PyObjC , RubyCocoa , JRuby , Rubinius , MacRuby , gcj , GNU Smalltalk , IcedTea , Cycript, Pawn, Java Native Access , Common Lisp (через CFFI), Racket , [3] Embeddable Common Lisp и Mozilla . [4]
В Mac OS X libffi обычно используется с BridgeSupport, который предоставляет нейтральные по отношению к языку программирования описания интерфейсов фреймворков , и Nu , который связывает прямой доступ к Objective-C из Lisp .
libffi широко портирована и выпущена под лицензией MIT .
Хотя язык программирования C повсеместно распространен среди платформ, способы реализации вызовов функций в машинном коде – соглашение о вызовах – различаются. Когда требуется динамически загрузить подпрограмму во время выполнения, требуется знание этих соглашений.
libffi обладает знаниями о соглашении о вызовах на многих платформах (комбинации процессор–ОС). Его C API , который является общим для всех сборок libffi независимо от платформы, абстрагируется от сложности загрузки кода на разных платформах. В дополнение к обычным функциям , он также поддерживает вариативные функции в стиле C.
Соглашение о вызовах C используется не только языком C: из-за количества существующего кода, написанного на C, большинство новых компилируемых языков также позволяют писать и вызывать функции в таком соглашении. В результате libffi может взаимодействовать с некоторыми функциями, написанными на этих языках.
libffi, изначально разработанная Энтони Грином, была вдохновлена библиотекой Gencall от Silicon Graphics . Gencall была разработана Джанни Мариани, тогда работавшим в SGI , с целью разрешить вызовы функций по адресу и создания фрейма вызова для конкретного соглашения о вызовах ( MIPS O32). Энтони Грин усовершенствовал идею и распространил ее на другие архитектуры и соглашения о вызовах, а также на открытый исходный код libffi.
Библиотека libffi полезна для построения моста между интерпретируемым и скомпилированным нативным кодом. Некоторые известные пользователи включают:
{{cite web}}
: CS1 maint: архивная копия как заголовок ( ссылка )