Interfață funcție străină

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

O interfață de funcții străine ( FFI ) este un mecanism prin care un program scris într-un limbaj de programare poate apela rutine sau poate utiliza servicii scrise în altul.

Etimologia termenului

Termenul derivă din specificația Common Lisp , care se referă în mod explicit la caracteristicile lingvistice pentru apelurile între limbi ca atare; termenul este folosit și oficial de programarea lingvistică Haskell și Python . Alte limbi folosesc o altă terminologie : limbajul de programare Ada vorbește despre „ legarea limbajului ”, în timp ce Java se referă la FFI-ul său ca JNI ( Java Native Interface ) sau JNA ( Java Native Access ). Interfața pentru funcții străine a devenit o terminologie generică pentru mecanismele care furnizează astfel de servicii.

Operațiune

Funcția principală a unei interfețe de funcții străine este de a se potrivi cu semantica și convențiile de apel ale unui limbaj de programare (limbajul gazdă sau limbajul care definește FFI ), cu semantica și convențiile altui (limbajul invitat ). Acest proces trebuie să ia în considerare și mediile de rulare și / sau interfețele de aplicații binare ale ambelor. Acest lucru se poate face în mai multe moduri:

  • Solicitați ca funcțiile în limba gazdă care urmează să fie apelate în limba gazdă să fie specificate sau implementate într-un mod special; folosind adesea o bibliotecă de compatibilitate de un fel.
  • Folosirea unui instrument pentru a „înfășura” automat funcțiile limbii gazdă cu codul de lipici corespunzător, care efectuează orice traducere necesară.
  • Utilizarea bibliotecilor de împachetare
  • Restricționarea setului de caracteristici de limbă gazdă care poate fi utilizat în mai multe limbi. De exemplu, funcțiile C ++ apelate de la C nu pot (în general) să includă parametri de referință sau să arunce excepții.

FFI poate fi complicat de următoarele considerații:

  • Dacă o limbă acceptă colectarea gunoiului (GC) și cealaltă nu; aveți grijă ca codul de limbă non-GC să nu provoace eșecul GC în celălalt. În JNI, de exemplu, codul C care „reține” referințele de obiect primite de la Java trebuie să „înregistreze” acest fapt în mediul de execuție Java (JRE); în caz contrar, Java poate șterge obiecte înainte ca C să se termine cu ele. (Codul C trebuie, de asemenea, să elibereze în mod explicit linkul său către orice obiect de acest tip, de îndată ce C nu mai este necesar pentru acel obiect.)
  • Obiectele sau tipurile de date complicate sau netriviale pot fi dificil de cartografiat de la un mediu la altul.
  • Este posibil să nu fie posibil ca ambele limbi să păstreze referințe la aceeași instanță a unui obiect modificabil, din cauza problemei de mapare de mai sus.
  • Una sau ambele limbi pot rula pe o mașină virtuală (VM); de asemenea, dacă ambele sunt, acestea vor fi probabil VM-uri diferite.
  • Moștenirea între limbi străine și alte diferențe, cum ar fi între sistemele de tip sau între modelele de compoziție a obiectelor, pot fi deosebit de dificile .

Cazuri speciale

Există câteva cazuri speciale în care limbile sunt compilate în același bytecode VM , cum ar fi Clojure și Java , precum și Elixir și Erlang . Deoarece nu există nici o interfață , aceasta nu este o FFI, strict vorbind, în timp ce oferă aceeași funcționalitate pentru utilizator .

Elemente conexe