Foreign function interface: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
creata pagina
 
Fix wikilink che punta alla voce errata
 
(9 versioni intermedie di 8 utenti non mostrate)
Riga 1:
{{w|informatica|aprile 2018}}
Una '''FFI''' ( '''Foreign Function Interface''' ) è un [[meccanismo]] mediante il quale un [[programma (informatica)|programma]] scritto in un [[linguaggio]] di [[programmazione]] può chiamare [[routine (informatica)|routine]] o fare uso di servizi scritti in un altro.
 
== NamingEtimologia del termine ==
Il [[termine]] deriva dalla specifica di [[Common LISP|Common Lisp]] , che fa esplicitamente [[riferimento]] alle funzionalità [[Linguistica educativa|linguistiche]] per le chiamate tra lingue in quanto tali; il [[termine]] è usato anche ufficialmente dai [[Linguaggio di programmazione|linguaggi]] di programmazione [[Haskell (linguaggio)|Haskell]] e [[Python]]. Altre lingue usano un'altra [[terminologia]]: il linguaggio di programmazione Ada parla di " [[binding di linguaggio]] ", mentre [[Java (linguaggio di programmazione)|Java]] fa riferimento al suo '''FFI''' come [[JNI]] ( [[Java Native Interface]] ) o [[JNA]] ( [[Java Native Access]] ). L'[[interfaccia]] per le funzioni [[Estranei|estranee]] è diventata una [[terminologia]] generica per i [[meccanismi]] che forniscono tali servizi.
 
== Operazione ==
La [[funzione]] primaria di un'interfaccia di funzione straniera è quella di accoppiare la [[semantica]] e chiamare convenzioni di un [[linguaggio di programmazione]] (la lingua ''ospite'' o la lingua che definisce la '''FFI'''), con la [[semantica]] e le convenzioni di un'altra (la lingua ''ospite'' ). Questo processo deve anche prendere in considerazione gli [[Ambiente (biologia)|ambienti]] di [[Run-time|runtime]] e / o le [[Interfaccia binaria|interfacce binarie]] delle [[Applicazione (informatica)|applicazioni]] di entrambi. Questo può essere fatto in diversi modi:
 
* Richiedere che le funzioni in lingua ospite che devono essere chiamate in linguaggio host siano specificate o implementate in un modo particolare; spesso usando una libreria di compatibilità di qualche tipo.
* Utilizzo di uno strumento per "avvolgere" automaticamente le funzioni del linguaggio [[Ospitalità|ospite]] con il codice della colla appropriato, che esegue qualsiasi traduzione necessaria.
* Uso di librerie di [[wrapper]]
* Limitazione del set di funzionalità della [[lingua]] host che possono essere utilizzate in più lingue. Ad esempio, le funzioni [[C ++]] chiamate da C potrebbero non (in generale) includere [[Parametri s|parametri]] di riferimento o generare eccezioni.
 
Le '''FFI''' possono essere complicate dalle seguenti considerazioni:
 
* Se una lingua supporta la [[garbage collection]] ([[GC]]) e l'altra no; bisogna fare attenzione che il codice lingua non GC non fa in modo che GC nell'altro fallisca. In JNI, ad esempio, il codice C che "tiene su" i riferimenti oggetto ricevuti da Java deve "registrare" questo fatto con [[Java Runtime Environment|Java runtime environment]] ([[JRE]]); altrimenti, Java può cancellare oggetti prima che C abbia finito con loro. (Il codice C deve anche rilasciare esplicitamente il suo link a qualsiasi oggetto di questo tipo, non appena non vi è più bisogno, di C, di quell'oggetto.)
* Oggetti complicati o non [[Banalizzazione (filologia)|banali]] o tipi di dati possono essere difficili da mappare da un ambiente all'altro.
* Potrebbe non essere possibile per entrambe le lingue mantenere i riferimenti alla stessa istanza di un oggetto mutabile, a causa del problema di [[Mappatura UV|mappatura]] sopra riportato.
* Una o entrambe le lingue potrebbero essere in esecuzione su una [[macchina virtuale]] (VM); inoltre, se entrambe lo sono, queste saranno probabilmente [[Macchina virtuale|VM]] diverse.
* L' [[Ereditarietà genetica|ereditarietà]] [[cross-language]] e altre differenze, come tra sistemi di tipi o tra modelli di composizione di oggetti , possono essere particolarmente [[Difficile lectu|difficili]].
 
== Casi speciali ==
Ci sono alcuni casi speciali in cui le lingue vengono compilate nella stessa [[VM bytecode]], come [[Clojure]] e [[Java (linguaggio di programmazione)|Java]] , oltre a [[Elixir (linguaggio di programmazione)|Elixir]] ed [[Erlang (linguaggio di programmazione)|Erlang]] . Poiché non esiste un'[[interfaccia]], non è un '''FFI''', in senso stretto, mentre offre la stessa funzionalità all'[[utente]].
 
== Vedi anche ==
 
== Voci correlate ==
* [[Interoperabilità linguistica]]
* [[Transcompiler]]
Riga 35:
* [[Chiamata di procedura remota]]
* [[Libffi]]
 
[[Categoria:Concetti di programmazione]]