~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 8F94AC6DDB43F10BEAF6EED44207498E__1704145800 ✰
Заголовок документа оригинал.:
✰ Foreign function interface - Wikipedia ✰
Заголовок документа перевод.:
✰ Интерфейс внешних функций — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Foreign_function_interface ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/8f/8e/8f94ac6ddb43f10beaf6eed44207498e.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/8f/8e/8f94ac6ddb43f10beaf6eed44207498e__translat.html ✰
Дата и время сохранения документа:
✰ 21.06.2024 09:16:40 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 2 January 2024, at 00:50 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Интерфейс внешних функций — Википедия Jump to content

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

Из Википедии, бесплатной энциклопедии

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

Именование [ править ]

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

Операция [ править ]

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

  • Требование, чтобы функции гостевого языка, которые должны вызываться на основном языке, были указаны или реализованы определенным образом, часто с использованием какой-либо библиотеки совместимости.
  • Использование инструмента для автоматического «обертывания» функций гостевого языка соответствующим связующим кодом , который выполняет любой необходимый перевод.
  • Использование библиотек-оболочек
  • Ограничение набора возможностей основного языка, которые можно использовать на разных языках. Например, функции C++, вызываемые из C, могут (как правило) не включать ссылочные параметры или выдавать исключения.

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

  • Если один язык поддерживает сборку мусора (GC), а другой нет; необходимо следить за тем, чтобы код языка, не относящегося к GC, не вызывал сбоя GC в другом языке. Например, в JNI код C, который «сохраняет» ссылки на объекты, полученные от Java, должен «регистрировать» этот факт в среде выполнения Java (JRE); в противном случае Java может удалить объекты до того, как C завершит их работу. (Код C также должен явно освободить свою ссылку на любой такой объект, как только C больше не будет нуждаться в этом объекте.)
  • Сложные или нетривиальные объекты или типы данных может быть сложно сопоставить из одной среды в другую.
  • Оба языка могут оказаться неспособными поддерживать ссылки на один и тот же экземпляр изменяемого объекта из-за описанной выше проблемы сопоставления.
  • могут работать один или оба языка На виртуальной машине (ВМ) ; более того, если оба есть, то, скорее всего, это будут разные ВМ.
  • Межъязыковое наследование и другие различия, например, между системами типов или между моделями композиции объектов , могут быть особенно трудными.

UML-файл ffi.svg

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

  • Привязки языка Ada , позволяющие не только вызывать внешние функции, но и экспортировать их функции и методы для вызова из кода, отличного от Ada. [7]
  • C++ имеет тривиальное FFI с C , поскольку эти языки имеют значительное общее подмножество. Основной эффект от Объявление extern "C" в C++ предназначено для отключения искажения имен C++ . В других языках используются отдельные утилиты или промежуточное программное обеспечение, примеры включают:
  • Clean обеспечивает двунаправленный FFI со всеми языками, следующими за C или соглашением о вызовах stdcall . [8] [9]
  • Общий Лисп
  • CNI — альтернатива JNI, используемая в среде компилятора GNU.
  • Одной из основ объектной модели компонентов является общий формат интерфейса, который изначально использует те же типы, что и Visual Basic, для строк и массивов.
  • D делает это так же, как C++ , с extern «C» через extern (C++).
  • В состав Dart входит дарт:ffi [10] библиотека для вызова собственного кода C для мобильных приложений, приложений командной строки и серверных приложений.
  • Динамические языки , такие как Python , Perl , Tcl и Ruby , обеспечивают легкий доступ к собственному коду, написанному на C/C++ (или любом другом языке, подчиняющемся соглашениям о вызовах C/C++).
  • Factor имеет FFI для C, Fortran , Objective-C и Windows COM ; все это позволяет динамически импортировать и вызывать произвольные общие библиотеки.
  • В Fortran 2003 есть модуль ISO_C_BINDING, который предоставляет совместимые типы данных (как внутренние типы, так и структуры POD), совместимые указатели, совместимые глобальные хранилища данных и механизмы для вызова C из Fortran и для вызова Fortran из C. [11] Он был улучшен в стандарте Fortran 2018.
  • Go может вызывать код C напрямую через "C" псевдопакет. [12]
  • GWT , в котором Java компилируется в JavaScript, имеет FFI под названием JSNI, который позволяет исходному коду Java вызывать произвольные функции JavaScript, а JavaScript — выполнять обратный вызов в Java.
  • Хаскелл
  • JNI , который обеспечивает интерфейс между Java и C/C++ — предпочтительными системными языками в большинстве систем, где развернут Java. JNA предоставляет интерфейс с собственными библиотеками без необходимости писать связующий код . Другой пример — JNR.
  • LuaJIT, своевременная реализация Lua , имеет FFI, который позволяет «вызывать внешние функции C и использовать структуры данных C из чистого кода Lua». [4] [5] : 35 
  • У Nim есть FFI, который позволяет ему использовать исходный код C , C++ и Objective-C . Он также может взаимодействовать с Javascript.
  • JavaScript обычно выполняется внутри среды выполнения веб-браузера , которая не обеспечивает прямого доступа к системным библиотекам или командам для запуска, но есть несколько исключений:
    • Node.js предоставляет функции для открытия предварительно скомпилированных .node модули, которые, в свою очередь, могут предоставлять доступ к невстроенным ресурсам.
    • Deno предоставляет своего рода интерфейс FFI через dlopen(...) функции. [13]
    • Bun предоставляет встроенный модуль, bun:ffi, чтобы эффективно вызывать собственные библиотеки непосредственно из JavaScript. [14]
  • У Джулии есть ccall ключевое слово для вызова C (и других языков, например Fortran); [15] в то время как пакеты, обеспечивающие аналогичную поддержку без шаблонов, доступны для некоторых языков, например для Python [16] (например, для обеспечения поддержки объектно-ориентированного программирования и поддержки GC), Java (и поддерживает другие языки JDK, такие как Scala) и R. Интерактивное использование с C++ также возможно с помощью пакета Cxx.jl.
  • PhoneGap (назывался Apache Callback, но теперь Apache Cordova) — это платформа для создания собственных мобильных приложений с использованием HTML, CSS и JavaScript. Кроме того, имеются FFI через функции обратного вызова JavaScript для доступа к методам и свойствам собственных функций мобильного телефона, включая акселерометр, камеру (также PhotoLibrary и SavedPhotoAlbum), компас, хранилище (база данных SQL и локальное хранилище), уведомление, мультимедиа и захват (воспроизведение и запись или аудио). и видео), Файл, Контакты (адресная книга), События, Информация об устройстве и подключении. [1] , [2] .
  • PHP предоставляет FFI для C. [17]
  • Python предоставляет модули ctypes и cffi . Например, модуль ctypes может загружать функции C из общих библиотек / DLL «на лету» и автоматически переводить простые типы данных между семантикой Python и C следующим образом:
    импортировать   ctypes 
     libc   =   ctypes  .   CDLL  (  '/lib/libc.so.6'  )    # В Linux/Unix 
     t   =   libc  .   time  (  None  )                     # Эквивалентный код C: t = time(NULL) 
     print  (  t  ) 
    
  • P/Invoke , который обеспечивает интерфейс между Microsoft Common Language Runtime и собственным кодом.
  • Racket имеет собственный FFI, основанный на макросах, который позволяет динамически импортировать произвольные общие библиотеки. [18] [19]
  • Раку может вызывать Ruby , Python , Perl , Brainfuck , Lua , C , C++ , Go , Scheme Guile / Gambit и Rust. [20] [21]
  • Ruby предоставляет FFI либо через гем ffi , либо через стандартную библиотеку fiddle .
    требуется   «скрипка» 
    
     libm   =   Fiddle  .   dlopen  (  '/lib/libm.so.6'  ) 
    
     # Эквивалентно: doublefloor(double x); 
      пол   =   Скрипка  ::  Функция  .   new  ( 
       libm  .  sym  (  'floor'  ),       # ptr — это ссылочная функция (или символ) Fiddle::Handle. 
       [  Fiddle  ::  TYPE_DOUBLE  ]  ,   # args — это массив аргументов, передаваемый в функцию ptr . 
       Fiddle  ::  TYPE_DOUBLE      # ret_type — тип возвращаемого значения функции 
     ) 
    
     # Эквивалент: Floor(3.14159); 
      пол  .   вызов  (  3.14159  3.0  )  >   #= 
    
  • Rust определяет внешний интерфейс функций для функций с различными стандартными ABI . [22] Также имеется библиотека для взаимодействия с Elixir , Rustler .
  • Visual Basic имеет декларативный синтаксис, который позволяет вызывать функции C, не поддерживающие Юникод.
  • Wolfram Language предоставляет технологию WSTP (протокол символической передачи Wolfram), которая обеспечивает двунаправленный вызов кода между другими языками с привязками для C++, Java, .NET и других языков.
  • Zig предоставляет FFI для c, используя встроенный cImport функция. [23]

Кроме того, многие FFI могут формироваться автоматически: например, SWIG . Однако в случае языка расширения может произойти семантическая инверсия отношений гостя и хоста, когда меньшая часть языка расширения является гостем, вызывающим службы в большей части хост-языка, например, при написании небольшого плагина. [24] для ГИМП. [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. ^ «Введение в ФФИ» . ХаскеллВики . Проверено 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. ^ Перейти обратно: а б Майк Палл. «Библиотека ФФИ» . Luajit.org . Проверено 29 сентября 2013 г.
  5. ^ Перейти обратно: а б Хайнц, Иоахим (2013). Путь вперед: материалы первой международной конференции Csound . Алекс Хофманн, Иэн МакКарди. Ньюкасл-апон-Тайн: Издательство Cambridge Scholars Publishing. ISBN  978-1-4438-5122-0 . OCLC   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» . Бун Документы .
  15. ^ «Вызов кода C и Fortran · Язык Julia» . 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. ^ «Скрипт-Фу и плагины для The GIMP» . Гимп.орг . Проверено 29 сентября 2013 г.

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: 8F94AC6DDB43F10BEAF6EED44207498E__1704145800
URL1:https://en.wikipedia.org/wiki/Foreign_function_interface
Заголовок, (Title) документа по адресу, URL1:
Foreign function interface - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)