Rozhraní pro cizí funkce - Foreign function interface
![]() | Tento článek je Použití externí odkazy nemusí dodržovat zásady nebo pokyny Wikipedie.Srpna 2016) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
A rozhraní cizí funkce (FFI) je mechanismus, kterým je program napsán v jednom programovací jazyk může volat rutiny nebo využívat služby napsané v jiném.
Pojmenování
Termín pochází ze specifikace pro Společný Lisp, který výslovně odkazuje na jazykové funkce pro mezijazyčné hovory jako takové;[1] termín také oficiálně používá Haskell[2] a Krajta programovací jazyky.[3] Jiné jazyky používají jinou terminologii: Programovací jazyk Ada mluví o "jazykové vazby ", zatímco Jáva označuje svůj FFI jako JNI (Nativní rozhraní Java ) nebo JNA (Nativní přístup Java ). Rozhraní cizí funkce se stalo obecnou terminologií pro mechanismy, které takové služby poskytují.
Úkon
Primární funkcí rozhraní cizích funkcí je spojit sémantiku a konvence volání jednoho programovacího jazyka ( hostitel jazyk nebo jazyk, který definuje FFI) se sémantikou a konvencemi jiného (dále jen "FFI") host Jazyk). Tento proces musí rovněž zohledňovat: běhová prostředí a / nebo binární rozhraní aplikace oba. To lze provést několika způsoby:
- Požadovat, aby byly funkce v jazyce hosta, které mají být k dispozici v hostitelském jazyce, specifikovány nebo implementovány konkrétním způsobem; často používá nějakou knihovnu kompatibility.
- Použití nástroje k automatickému „zabalení“ funkcí v jazyce hosta vhodným způsobem kód lepidla, který provádí nezbytný překlad.
- Použití souhrnné knihovny
- Omezení množiny jazyků hostitele, které lze použít napříč jazyky. Například funkce C ++ volané z C nemusí (obecně) zahrnovat referenční parametry nebo vyvolávat výjimky.
FFI mohou být komplikovány následujícími úvahami:
- Pokud jeden jazyk podporuje odvoz odpadu (GC) a druhý nikoli; je třeba dbát na to, aby kód jazyka, který není jazykem GC, způsobil selhání GC v druhém. Například v JNI musí kód C, který se „drží“ odkazů na objekty, které přijímá z Javy, „zaregistrovat“ tuto skutečnost u Běhové prostředí Java (JRE); jinak může Java mazat objekty dříve, než s nimi C skončí. (Kód C musí také výslovně uvolnit svůj odkaz na jakýkoli takový objekt, jakmile C tento objekt již nepotřebuje.)
- Komplikované nebo netriviální objekty nebo datové typy může být obtížné mapovat z jednoho prostředí do druhého.
- Je možné, že nebude možné, aby oba jazyky udržovaly odkazy na stejnou instanci proměnlivého objektu z důvodu problému s mapováním výše.
- Na a. Může běžet jeden nebo oba jazyky virtuální stroj (VM); navíc, pokud jsou oba, budou to pravděpodobně různé virtuální počítače.
- Cross-language dědictví a další rozdíly, například mezi systémy typu nebo mezi modely objektové kompozice, může být obzvláště obtížné.
Podle jazyka
Mezi příklady FFI patří:
- Ada jazykové vazby, které umožňují nejen volat cizí funkce, ale také exportovat jeho funkce a metody, které mají být volány z jiného kódu než Ada.[4]
- C ++ má triviální FFI s C, protože jazyky sdílejí významnou společnou podmnožinu. Primárním účinkem externí "C" Deklarace v C ++ je zakázat C ++ mangling jména.
- Čistý poskytuje obousměrný FFI se všemi následujícími jazyky C nebo stdcall konvence volání.[5][6]
- CNI, alternativa k JNI používaná v prostředí kompilátoru GNU.
- D dělá to stejně jako C ++ dělá, s externí "C" prostřednictvím extern (C ++)
- Šipka zahrnuje šipku: ffi[7] knihovna volat nativní C kód pro mobilní aplikace, aplikace příkazového řádku a server
- Dynamické jazyky, jako Krajta, Perl, Tcl, a Rubín, všechny poskytují snadný přístup k nativnímu kódu napsanému v C / C ++ (nebo v jakémkoli jiném jazyce, který dodržuje konvence volání C / C ++).
- Faktor má FFI pro C, Fortran, Cíl-C, a Windows COM; všechny tyto možnosti umožňují dynamický import a volání libovolných sdílených knihoven.
- FFI z Společný Lisp a Haskell
- Fortran 2003 má modul ISO_C_BINDING, který poskytuje interoperabilní datové typy (vnitřní typy i struktury POD), interoperabilní ukazatele, interoperabilní globální úložiště dat a mechanismy pro volání C z Fortranu a pro volání Fortranu z C.[8]
- Jít může volat C kód přímo přes
"C"
pseudobalíček.[9] - GWT, ve kterém je Java kompilován do JavaScriptu, má FFI s názvem JSNI, který umožňuje zdroji Javy volat libovolné funkce JavaScriptu a JavaScript zpětně volat do Javy.
- JNI, který poskytuje rozhraní mezi Jáva a C / C ++, preferované systémové jazyky na většině systémů, kde je implementována Java. JNA poskytuje rozhraní s nativními knihovnami, aniž byste museli psát kód lepidla. Dalším příkladem je JNR
- Julie má
ccall
klíčové slovo pro volání C (a dalších jazyků, např. Fortran);[10] zatímco balíčky, které poskytují podobnou podporu bez varného štítku, jsou k dispozici pro některé jazyky, např. pro Python[11] (např. poskytnout podporu OO a podporu GC), Java (a podporuje další jazyky JDK, jako je Scala) a R. Interaktivní použití s C ++ je také možné s balíčkem Cxx.jl. - PHP poskytuje FFI C.[12]
- Krajta poskytuje typy a cffi moduly. Například modul ctypes může načítat C funkce z sdílené knihovny /DLL průběžně a automaticky překládejte jednoduché datové typy mezi sémantikou Pythonu a C následujícím způsobem:
import typylibc = typy.CDLL('/lib/libc.so.6') # V systému Linux / Unixt = libc.čas(Žádný) # Ekvivalentní C kód: t = čas (NULL)tisk(t)
- P / Vyvolání, která poskytuje rozhraní mezi společností Microsoft Common Language Runtime a nativní kód.
- Raketa má nativní FFI silně založený na makrech, který umožňuje dynamický import libovolných sdílených knihoven.[13][14]
- Raku může volat Rubín, Krajta, Perl, Brainfuck, Lua, C, C ++, Jít a schéma Lstivost /Gambit [15] [16]
- Rez také definuje rozhraní cizí funkce.[17]
- Visual Basic má deklarativní syntaxi, která mu umožňuje volat funkce jiné než Unicode C.
- Jedna ze základen Komponentní objektový model je běžný formát rozhraní, který pro řetězce a pole nativně používá stejné typy jako Visual Basic.
- LuaJIT, a právě včas implementace Lua, má FFI, který umožňuje „volání externích funkcí C a používání datových struktur C z čistého kódu Lua“.[18]
- PhoneGap (byl nazýván jménem Apache Callback, ale nyní Apache Cordova) je platforma pro vytváření nativních mobilních aplikací pomocí HTML, CSS a JavaScript. Kromě toho má FFI prostřednictvím funkcí zpětného volání JavaScriptu pro přístup k metodám a vlastnostem nativních funkcí mobilního telefonu, včetně akcelerometru, fotoaparátu (také PhotoLibrary a SavedPhotoAlbum), kompasu, úložiště (databáze SQL a localStorage), oznámení, médií a snímání (přehrávání a nahrávání nebo audio a video), Soubor, Kontakty (adresář), Události, Informace o zařízení a připojení.[1],[2].
- Wolfram jazyk poskytuje technologii nazvanou WSTP (Wolfram Symbolic Transfer Protocol), která umožňuje obousměrné volání kódu mezi jinými jazyky s vazbami pro C ++, Java, .NET a další jazyky.
Mnoho FFI lze navíc generovat automaticky: například LOK. Avšak v případě jazyk rozšíření může dojít k sémantické inverzi vztahu hosta a hostitele, když menší tělo rozšířeného jazyka je služba vyvolávající host ve větším těle hostitelského jazyka, například psaní malého pluginu [19] pro GIMP.[20]
Některé FFI jsou omezeny na volné postavení funkce, zatímco ostatní také umožňují volání funkcí vložených do objektu nebo třídy (často nazývaných volání metody ); některé dokonce umožňují migraci složitých datových typů a / nebo objektů přes jazykovou hranici.
Ve většině případů je FFI definován jazykem „vyšší úrovně“, takže může využívat služby definované a implementované v jazyce nižší úrovně, typicky systémový jazyk jako C nebo C ++. To se obvykle provádí buď pro přístup ke službám OS v jazyce, ve kterém je definováno API OS, nebo z hlediska výkonu.
Mnoho FFI také poskytuje prostředky, aby volaný jazyk vyvolal služby také v hostitelském jazyce.
Termín rozhraní cizí funkce se obecně nepoužívá k popisu vícejazyčných běhových časů, jako je Microsoft Common Language Runtime, kde je poskytován společný „substrát“, který umožňuje jakémukoli jazyku kompatibilnímu s CLR používat služby definované v jakémkoli jiném. (V tomto případě však CLR obsahuje FFI, P / Vyvolání, volat mimo runtime.) Kromě toho mnoho distribuovaných výpočetních architektur, jako je Vzdálené vyvolání metody Java (RMI), RPC, CORBA, MÝDLO a D-Bus povolit psaní různých služeb v různých jazycích; takové architektury se obecně nepovažují za FFI.
Speciální případy
Existují některé speciální případy, ve kterých se jazyky kompilují do stejného bytecode VM, jako Clojure a Jáva, stejně jako Elixír a Erlang. Vzhledem k tomu, že neexistuje žádné rozhraní, nejde přesně o FFI, zatímco uživateli nabízí stejné funkce.
Viz také
- Jazyková interoperabilita
- Definiční jazyk rozhraní
- Konvence volání
- Mangling jména
- Aplikační programovací rozhraní
- Binární rozhraní aplikace
- Porovnání aplikačních virtuálních strojů
- LOK
- Vzdálené volání procedury
- libffi
Reference
- ^ „Uživatelská příručka CFFI“. common-lisp.org. Citováno 2015-06-18.
- ^ "FFI Úvod". HaskellWiki. Citováno 19. června 2015.
Haskellův FFI se používá k volání funkcí z jiných jazyků (v tomto okamžiku v podstatě C) a pro C k volání funkcí Haskell.
- ^ „Dokumentace CFFI“. Citováno 19. června 2015.
C Rozhraní pro cizí funkce pro Python. Cílem je poskytnout pohodlný a spolehlivý způsob volání kompilovaného C kódu z Pythonu pomocí deklarací rozhraní napsaných v C.
- ^ „Rozhraní do jiných jazyků“. Adaic.org. Citováno 2013-09-29.
- ^ „Zahraniční export“. Citováno 2020-05-25.
- ^ „Volání C z čistého“. Citováno 2018-04-25.
- ^ „dart: ffi library“. Citováno 2020-01-01.
- ^ "'Fortran-iso-c-binding 'tag wiki ". Přetečení zásobníku.
- ^ "cgo - programovací jazyk Go". Citováno 2015-08-23.
- ^ „Volání kódu C a Fortran · jazyk Julia“. docs.julialang.org. Citováno 2018-02-11.
- ^ PyCall.jl: Balíček pro volání funkcí Pythonu z jazyka Julia, JuliaPy, 08.02.2018, vyvoláno 2018-02-11
- ^ "PHP: FFI - manuální". Skupina PHP. Citováno 13. června 2019.
- ^ Eli Barzilay. „Zahraniční rozhraní rakety“. Docs.racket-lang.org. Citováno 2013-09-29.
- ^ „TR600.pdf“ (PDF). Citováno 2013-09-29.
- ^ "Inline implementace". Citováno 2017-08-15.
- ^ „Nativní volání“. Citováno 2017-08-15.
- ^ "Použití externích funkcí k volání externího kódu". Citováno 2019-06-01.
- ^ Mike Pall. "Knihovna FFI". Luajit.org. Citováno 2013-09-29.
- ^ "4. Ukázkový skript". Gimp.org. 04.02.2001. Citováno 2013-09-29.
- ^ „Script-Fu a doplňky pro GIMP“. Gimp.org. Citováno 2013-09-29.
externí odkazy
- c2.com: Cizí funkční rozhraní
- Rozhraní cizích funkcí Haskell 98
- Allegro Common Lisp FFI
- Generátor rozhraní cizích funkcí pro occam-pi
- UFFI: Lisp Universal Foreign Function Interface
- CFFI: Common Foreign Function Interface, pro Common Lisp
- Nativní rozhraní Java: Programátorská příručka a specifikace
- Specifikace JNI
- JSNI (nativní rozhraní JavaScriptu)
- knihovna dyncall využívající jádra volání sestavení pro různé procesory, operační systémy a konvence volání
- FFCALL
- C / Vyvolat
- libffi