либффи
Разработчик(и) | Энтони Грин |
---|---|
Первоначальный выпуск | 7 октября 1996 г |
Стабильная версия | 3.4.6 [1]
/ 18 февраля 2024 г |
Репозиторий | |
Написано в | С , язык ассемблера |
Операционная система | Unix-подобный , Microsoft Windows , OS X , iOS , «голое железо» |
Тип | Библиотека времени выполнения |
Лицензия | МОЯ лицензия [2] |
Веб-сайт | исходное программное обеспечение |
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] Встраиваемый 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 может взаимодействовать и с некоторыми функциями, написанными на этих языках.
История
[ редактировать ]В этом разделе отсутствует информация о году вызова генерального директора. ( январь 2021 г. ) |
libffi, изначально разработанная Энтони Грином, была вдохновлена библиотекой Gencall от Silicon Graphics . Gencall был разработан Джанни Мариани, который тогда работал в SGI , с целью разрешить вызовы функций по адресу и создать фрейм вызова для конкретного соглашения о вызовах ( MIPS O32). Энтони Грин усовершенствовал эту идею и распространил ее на другие архитектуры, соглашения о вызовах и libffi с открытым исходным кодом.
Принятие
[ редактировать ]Библиотека libffi полезна для построения моста между интерпретируемым и скомпилированным кодом. Некоторые известные пользователи включают:
Д
[ редактировать ]F-скрипт
[ редактировать ]- F-скрипт
- Динамически генерирует классы Cocoa, написанные на F-Script.
Коварство
[ редактировать ]- GNU Коварство
- libffi используется в Guile 1.9.8 и более поздних версиях.
Хаскелл
[ редактировать ]- ГХК
- libffi используется для большинства FFI, выполняемых GHC с конца 2009 года.
Ява
[ редактировать ]- OpenJDK
- Реализация Java Platform Standard Edition с открытым исходным кодом использует libffi для моста между интерпретатором и собственным кодом для порта Zero-Assembly.
- Собственный доступ к Java (JNA)
- Способ вызова машинного кода Java без JNI.
- ГКЖ
- Библиотека времени выполнения компилятора GNU для языка программирования Java использует libffi для обработки вызовов туда и обратно между интерпретируемым и скомпилированным кодом. gcj был частью GCC, коллекции компиляторов GNU .
JavaScript
[ редактировать ]- АОКакао
- Вызовите код Objective-C из javascript в Mac OS X и iPhone (через порт libffi-iphone).
- Мозилла
- libffi используется в библиотеке js-ctypes (ранее известной как ctypes.jsm) для вызова функций C внутри кода JavaScript (доступно в XULRunner приложениях , расширениях Firefox и т. д.). [5]
Лисп
[ редактировать ]- cffi-libffi
- Стандартная библиотека интерфейса внешних функций для Common Lisp CFFI включает систему cffi-libffi, включающую поддержку передачи и возврата аргументов структуры по значению.
- пикси
- pixie ( диалект Lisp, вдохновленный Clojure ) использует libffi в качестве механизма интерфейса внешних функций по умолчанию.
Перл
[ редактировать ]- ФФИ::Сырье
- Тонкая оболочка вокруг libffi.
- FFI::Утконос
- Новая, более удобная оболочка libffi.
Питон
[ редактировать ]- CPython
- По умолчанию, наиболее широко используемая реализация языка программирования Python использует libffi в стандартной библиотеке ctypes.
- PyObjC
- Вызов кода Objective-C из Python в Mac OS X.
Ракетка
[ редактировать ]- Ракетка
- Вызов кода C из этой популярной реализации Scheme.
Руби
[ редактировать ]- скрипка
- Обертка libffi в стандартной библиотеке Ruby.
- Руби-FFI
- Расширение интерфейса внешних функций для Ruby.
- РубинКакао
- Вызов кода Objective-C из Ruby в Mac OS X.
Ссылки
[ редактировать ]- ^ «Выпуск 3.4.6» . 18 февраля 2024 г. Проверено 20 февраля 2024 г.
- ^ «Статус» . Гитхаб . 25 апреля 2022 г.
- ^ «Архивная копия» (PDF) . Архивировано из оригинала (PDF) 2 сентября 2009 г. Проверено 2 августа 2009 г.
{{cite web}}
: CS1 maint: архивная копия в заголовке ( ссылка ) - ^ «Манифест файлов Mozilla-central @ 2dc00d4b379a» .
- ^ https://developer.mozilla.org/en/js-ctypes , ссылка на js-ctypes.