Интерфейс внешних функций
Интерфейс внешних функций (англ. Foreign Function Interface, FFI) — это механизм, с помощью которого программа, написанная на одном языке программирования, может вызывать подпрограммы или использовать услуги, написанные или скомпилированные на другом языке. FFI часто используется в контекстах, где производятся вызовы из бинарной динамически подключаемой библиотеки.
Термин
Термин происходит из спецификации для Common Lisp, которая явно ссылается на функцию языка программирования, позволяющую производить вызовы между языками как таковые; этот термин также часто официально используется в документации интерпретатора и компилятора Haskell[1], Rust[2], Python, OCaml[3] и LuaJIT (Lua)[4]. Другие языки используют другую терминологию: в документации по языку программирования Ада говорится о «привязках к языку», в то время как Java называет свой интерфейс Java Native Interface или Java Native Access (JNA). Интерфейс внешней функции стал общим термином для механизмов, предоставляющих такие услуги.
Описание
Связывание одного программного языка с другим является непростой задачей. Язык, для которого создаётся интерфейс к другому языку, должен разбираться в соглашениях вызова, системе типов, структурах данных, механизмах выделения памяти и методов линковки языка-цели для корректной работы. Требуется тщательно согласовать семантику обоих языков, чтобы они могли корректно понимать передаваемые между ними данные.[5]
Кроме того, добавление FFI к типобезопасному языку потенциально расширяет набор операций, которые могут нарушить безопасность тонкими и сложными для обнаружения способами.[6]
Примечания
Литература
- Bryan O'Sullivan, John Goerzen, Donald Bruce Stewart. Chapter 17. Interfacing with C: The FFI // Real World Haskell (англ.). — O'Reilly Media, Inc., 2008. — ISBN 9780596514983.