stringtranslate.com

Внешний функциональный интерфейс

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

Именование

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

Операция

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

ИФУ могут быть осложнены следующими соображениями:

UML-файл ffi.svg

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

Кроме того, многие 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" . ХаскеллВики . Проверено 19 июня 2015 г. FFI Haskell используется для вызова функций из других языков (в основном C на данный момент), а C для вызова функций Haskell.
  2. ^ "std::ffi - Rust" . Проверено 1 апреля 2021 г. Этот модуль предоставляет утилиты для обработки данных через интерфейсы, отличные от Rust, такие как другие языки программирования и базовая операционная система. В основном он используется для привязок FFI (интерфейс внешних функций) и кода, которому необходимо обмениваться строками C-подобного типа с другими языками.
  3. ^ "Руководство PHP FFI" . Руководство по PHP . Проверено 31 августа 2023 г. Определенные переменные C доступны как свойства экземпляра FFI.
  4. ^ AB Майк Полл. «Библиотека ФФИ». Luajit.org . Проверено 29 сентября 2013 г.
  5. ^ Аб Хайнц, Иоахим (2013). Пути вперед: материалы первой международной конференции Csound. Алекс Хофманн, Иэн МакКарди. Ньюкасл-апон-Тайн: Издательство Cambridge Scholars Publishing. ISBN 978-1-4438-5122-0. ОСЛК  855505215.
  6. ^ «Документация CFFI» . Проверено 19 июня 2015 г. Интерфейс внешних функций C для Python. Цель — предоставить удобный и надежный способ вызова скомпилированного кода C из Python с использованием объявлений интерфейса, написанных на C.
  7. ^ «Интерфейс для других языков». Адаик.орг . Проверено 29 сентября 2013 г.
  8. ^ «Иностранный экспорт» . Проверено 25 мая 2020 г.
  9. ^ «Вызов C из чистого» . Проверено 25 апреля 2018 г.
  10. ^ "dart: библиотека ffi" . Проверено 01 января 2020 г.
  11. ^ "Вики-тег 'fortran-iso-c-binding'" . Переполнение стека .
  12. ^ «cgo — язык программирования Go» . Проверено 23 августа 2015 г.
  13. ^ «Интерфейс иностранных функций | Руководство» . Дено . Проверено 8 февраля 2023 г.
  14. ^ «API FFI». Бун Документы .
  15. ^ «Вызов кода C и Фортрана · Язык Джулии» . docs.julialang.org . Проверено 11 февраля 2018 г.
  16. ^ PyCall.jl: Пакет для вызова функций Python из языка Julia, JuliaPy, 08 февраля 2018 г. , получено 11 февраля 2018 г.
  17. ^ «PHP: FFI — Руководство» . Группа PHP . Проверено 13 июня 2019 г.
  18. ^ Эли Барзилай. «Внешний интерфейс рэкета». Docs.racket-lang.org . Проверено 29 сентября 2013 г.
  19. ^ "TR600.pdf" (PDF) . Архивировано из оригинала (PDF) 2 сентября 2009 г. Проверено 29 сентября 2013 г.
  20. ^ «Встроенные реализации» . Проверено 15 августа 2017 г.
  21. ^ "Родной звонок" . Проверено 15 августа 2017 г.
  22. ^ «Использование внешних функций для вызова внешнего кода» . Проверено 1 июня 2019 г.
  23. ^ «Импорт из заголовочного файла C» . Фонд программного обеспечения Zig . Проверено 11 марта 2021 г.
  24. ^ «4. Пример сценария». Гимп.орг. 04 февраля 2001 г. Проверено 29 сентября 2013 г.
  25. ^ «Script-Fu и плагины для GIMP» . Гимп.орг . Проверено 29 сентября 2013 г.

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