stringtranslate.com

libffi

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 полезна для построения моста между интерпретируемым и скомпилированным нативным кодом. Некоторые известные пользователи включают:

Д

libffi-d
Привязки к библиотеке libffi для D. В основном используются для MCI (Managed Compiler Infrastructure).

F-скрипт

F-скрипт
Динамически генерирует классы Cocoa, написанные на F-Script.

Хитрость

GNU-хитрость
libffi используется в Guile 1.9.8 и более поздних версиях

Хаскелл

ГХК
libffi используется для большинства FFI, выполняемых GHC с конца 2009 года.

Ява

OpenJDK
Реализация Java Platform Standard Edition с открытым исходным кодом использует libffi в качестве моста между интерпретатором и машинным кодом для порта Zero-Assembly.
Далвик
Dalvik — это виртуальная машина, которая запускает платформу Java на мобильных устройствах Android . libffi используется на портах Android, для которых не было написано специального кода сопряжения.
Java Native Access (JNA)
Способ вызова собственного кода из Java без использования JNI.
гкдж
Библиотека времени выполнения для компилятора GNU для языка программирования Java использует libffi для обработки вызовов между интерпретируемым и скомпилированным в собственном коде кодом. gcj была частью GCC, коллекции компиляторов GNU .

JavaScript

JSCocoa
Вызов кода Objective-C из JavaScript на Mac OS X и iPhone (через порт libffi-iphone).
Мозилла
libffi используется в библиотеке js-ctypes (ранее известной как ctypes.jsm) для вызова функций C в коде JavaScript (доступно в приложениях XULRunner , расширениях Firefox и т. д.) [5]
узел-ffi
Дополнение Node.js для загрузки и вызова динамических библиотек из JavaScript.

Лисп

cffi-libffi
Стандартная библиотека интерфейса внешних функций для Common Lisp CFFI включает систему cffi-libffi для поддержки передачи и возврата аргументов структуры по значению.
пикси
pixie ( диалект Lisp, вдохновленный Clojure ) использует libffi в качестве механизма интерфейса внешних функций по умолчанию.

Перл

FFI::Сырой
Тонкая оболочка вокруг 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.

Ссылки

  1. ^ "Выпуск 3.4.6". 18 февраля 2024 г. Получено 20 февраля 2024 г.
  2. ^ "Статус". GitHub . 25 апреля 2022 г.
  3. ^ "Архивная копия" (PDF) . Архивировано из оригинала (PDF) 2009-09-02 . Получено 2009-08-02 .{{cite web}}: CS1 maint: архивная копия как заголовок ( ссылка )
  4. ^ "Mozilla-central @ 2dc00d4b379a файлы манифеста".
  5. ^ https://developer.mozilla.org/en/js-ctypes, справочник js-ctypes

Внешние ссылки