stringtranslate.com

Интерфейс внешней функции

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

Нейминг

Термин происходит из спецификации Common Lisp , которая явно ссылается на функцию языка программирования, позволяющую осуществлять межъязыковые вызовы как таковые; [ требуется ссылка ] термин также часто официально используется в документации интерпретатора и компилятора для Haskell , [1] Rust , [2] PHP , [3] Python и LuaJIT ( Lua ) [4] [5] : 35.  [ 6] Другие языки используют другую терминологию: Ada имеет языковые привязки , в то время как Java имеет Java Native Interface (JNI) или Java Native Access (JNA). Интерфейс внешних функций стал общим термином для механизмов, которые предоставляют такие услуги.

Операция

Основная функция интерфейса внешней функции — сопоставить семантику и соглашения о вызовах одного языка программирования ( языка- хозяина или языка, определяющего FFI) с семантикой и соглашениями другого ( гостевого языка). Этот процесс также должен учитывать среды выполнения и двоичные интерфейсы приложений обоих. Это можно сделать несколькими способами:

FFI могут быть осложнены следующими факторами:

UML ffi.svg

Примеры FFI включают в себя:

Кроме того, многие FFI могут быть сгенерированы автоматически: например, SWIG . Однако в случае языка расширения может возникнуть семантическая инверсия отношений гостя и хоста, когда меньший корпус языка расширения является гостем, вызывающим службы в большем корпусе языка хоста, например, написание небольшого плагина [24] для GIMP. [25]

Некоторые FFI ограничены отдельными функциями , в то время как другие также допускают вызовы функций, встроенных в объект или класс (часто называемые вызовами методов ); некоторые даже допускают миграцию сложных типов данных или объектов через границу языка.

В большинстве случаев FFI определяется языком более высокого уровня , так что он может использовать службы, определенные и реализованные на языке более низкого уровня , как правило, на языке системного программирования , таком как C или C++ . Обычно это делается либо для доступа к службам операционной системы (ОС) на языке, на котором определен API ОС, либо для целей производительности.

Многие FFI также предоставляют средства для вызываемого языка, чтобы вызывать сервисы на принимающем языке.

Термин «интерфейс внешних функций» обычно не используется для описания многоязычных сред выполнения, таких как Microsoft Common Language Runtime , где предоставляется общий субстрат , который позволяет любому языку, совместимому с CLR, использовать службы, определенные в любом другом. (Однако в этом случае CLR включает FFI, P/Invoke , для вызова за пределами среды выполнения.) Кроме того, многие распределенные вычислительные архитектуры, такие как удаленный вызов методов Java (RMI), RPC, CORBA , SOAP и D-Bus, позволяют писать различные службы на разных языках; такие архитектуры, как правило, не считаются FFI.

Особые случаи

Есть некоторые особые случаи, в которых языки компилируются в одну и ту же виртуальную машину байт-кода, как Clojure и Java , а также Elixir и Erlang . Поскольку нет интерфейса, это не FFI, строго говоря, хотя он предлагает те же функции пользователю.

Смотрите также

Ссылки

  1. ^ "Введение в FFI". HaskellWiki . Получено 19 июня 2015 г. FFI языка Haskell используется для вызова функций из других языков (в основном C на данный момент), а также для вызова функций языка Haskell из языка C.
  2. ^ "std::ffi". Rust-lang.org . Получено 1 апреля 2021 г. Этот модуль предоставляет утилиты для обработки данных через интерфейсы, отличные от Rust, такие как другие языки программирования и базовая операционная система. Он в основном используется для привязок FFI (Foreign Function Interface) и кода, которому необходимо обмениваться строками в стиле C с другими языками.
  3. ^ "PHP FFI Manual". PHP Manual . Получено 31 августа 2023 г. Определенные переменные C доступны как свойства экземпляра FFI.
  4. ^ ab Майк Полл. "Библиотека FFI". Luajit.org . Получено 29.09.2013 .
  5. ^ ab Heintz, Joachim; Hofmann, Alex; McCurdy, Iain (2013). Пути вперед: Труды первой международной конференции Csound. Ньюкасл-апон-Тайн: Cambridge Scholars Publishing. ISBN 978-1-4438-5122-0. OCLC  855505215.
  6. ^ "CFFI documentation" . Получено 19 июня 2015 г. Интерфейс внешних функций C для Python. Цель состоит в том, чтобы предоставить удобный и надежный способ вызова скомпилированного кода C из Python с использованием деклараций интерфейсов, написанных на C.
  7. ^ "Интерфейс к другим языкам". Adaic.org . Получено 29.09.2013 .
  8. ^ "Иностранный экспорт" . Получено 2020-05-25 .
  9. ^ "Вызов C из Clean" . Получено 2018-04-25 .
  10. ^ "библиотека dart:ffi" . Получено 2020-01-01 .
  11. ^ "wiki тег 'fortran-iso-c-binding'". Stack Overflow .
  12. ^ "cgo". Язык программирования Go . Получено 2015-08-23 .
  13. ^ "Foreign Function Interface | Руководство". Deno . Получено 2023-02-08 .
  14. ^ "FFI API". Bun Docs .
  15. ^ "Вызов кода C и Fortran". JuliaLang.org . Получено 2018-02-11 .
  16. ^ PyCall.jl: Пакет для вызова функций Python из языка Julia, JuliaPy, 2018-02-08 , получено 2018-02-11
  17. ^ "PHP: FFI - Руководство". PHP Group . Получено 13 июня 2019 г.
  18. ^ Эли Барзилай. "The Racket Foreign Interface". Docs.racket-lang.org . Получено 29.09.2013 .
  19. ^ "TR600.pdf" (PDF) . Архивировано из оригинала (PDF) 2009-09-02 . Получено 2013-09-29 .
  20. ^ "Встроенные реализации" . Получено 2017-08-15 .
  21. ^ "Native Call" . Получено 2017-08-15 .
  22. ^ "Использование внешних функций для вызова внешнего кода" . Получено 01.06.2019 .
  23. ^ "Импорт из файла заголовка C". Zig Software Foundation . Получено 2021-03-11 .
  24. ^ "4. Пример сценария". Gimp.org. 2001-02-04 . Получено 2013-09-29 .
  25. ^ "Script-Fu и плагины для GIMP". Gimp.org . Получено 29.09.2013 .

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