libffi - libffi

libffi
Développeur(s) Anthony Vert
Première version 7 octobre 1996 ; il y a 24 ans ( 1996-10-07 )
Version stable
3.4.2 / 28 juin 2021 ; il y a 1 jour ( 2021-06-28 )
Dépôt Modifiez ceci sur Wikidata
Écrit en C , Langage assembleur
Système opérateur Unix-like , Microsoft Windows , OS X , iOS , Bare Metal
Taper Bibliothèque d'exécution
Licence Licence MIT
Site Internet sourceware .org /libffi / Modifiez ceci sur Wikidata

libffi est une bibliothèque d' interface de fonction étrangère . Il fournit une interface en langage de programmation C pour appeler des fonctions compilées en mode natif à partir d' informations sur la fonction cible au moment de l'exécution au lieu du moment de la compilation . Il implémente également la fonctionnalité opposée : libffi peut produire un pointeur vers une fonction qui peut accepter et décoder n'importe quelle combinaison d'arguments définie au moment de l'exécution.

libffi est le plus souvent utilisé comme technologie de passerelle entre les implémentations de langage compilées et interprétées . libffi peut également être utilisé pour implémenter des plug-ins , où les signatures de fonction du plug-in ne sont pas connues au moment de la création de l'application hôte.

Les utilisateurs notables incluent Python , Haskell , Dalvik , F-Script , PyPy , PyObjC , RubyCocoa , JRuby , Rubinius , MacRuby , gcj , GNU Smalltalk , IcedTea , Cycript , Gage , Squeak , Java Native accès , Common Lisp (via CFFI), Racket , Common Lisp intégrable et Mozilla .

Sur Mac OS X , libffi est couramment utilisé avec BridgeSupport , qui fournit des descriptions neutres en langage de programmation des interfaces du framework , et Nu qui lie l' accès Objective-C direct à partir de Lisp .

libffi a été largement porté et est publié sous une licence MIT .

Arrière-plan

Bien que le langage de programmation C soit omniprésent parmi les plates-formes, la manière dont les appels de fonction sont implémentés dans le code machine – la convention d'appel – varie. Lorsqu'on veut charger dynamiquement un sous-programme à l'exécution, une connaissance de ces conventions est requise.

libffi connaît la convention d'appel sur de nombreuses plates-formes (combinaisons processeur-OS). Son API C , qui est partagée sur toutes les versions de libffi quelle que soit la plate-forme, fait abstraction de la complexité du chargement de code sur différentes plates-formes. En plus des fonctions régulières, il prend en charge également de style C fonctions variadique .

La convention d'appel C n'est pas seulement utilisée par le langage C : en raison de la quantité de code existant écrit en C, la plupart des langages compilés les plus récents permettent également d'écrire et d'appeler des fonctions dans une telle convention. En conséquence, libffi est également capable d'interagir avec certaines fonctions écrites dans ces langages.

Histoire

libffi, développé à l'origine par Anthony Green, a été inspiré par la bibliothèque Gencall de Silicon Graphics . Gencall a été développé par Gianni Mariani, puis employé par SGI , dans le but de permettre les appels aux fonctions par adresse et de créer un cadre d'appel pour la convention d'appel particulière ( MIPS O32). Anthony Green a affiné l'idée et l'a étendue à d'autres architectures et conventions d'appel et à l'open source libffi.

Adoption

La bibliothèque libffi est utile pour construire un pont entre le code interprété et compilé nativement. Certains utilisateurs notables incluent :

libffi-d
Liaisons à la bibliothèque libffi pour D. Principalement utilisé pour le MCI (Managed Compiler Infrastructure).

F-Script

F-Script
Génère dynamiquement des classes Cocoa écrites en F-Script.

Ruse

Guile GNU
libffi est utilisé dans Guile 1.9.8 et versions ultérieures

Haskell

GHC
libffi est utilisé pour la majorité des FFI réalisées par le GHC depuis fin 2009.

Java

OpenJDK
L'implémentation open source de la plate-forme Java Standard Edition utilise libffi pour faire le pont entre l'interpréteur et le code natif pour le port Zero-Assembly.
Dalvik
Dalvik est la machine virtuelle qui exécute la plate-forme Java sur les appareils mobiles Android . libffi est utilisé sur les ports Android pour lesquels aucun code de pontage personnalisé n'a été écrit.
Accès natif Java (JNA)
Le moyen sans JNI d'appeler du code natif depuis Java.
gcj
La bibliothèque d'exécution du compilateur GNU pour le langage de programmation Java utilise libffi pour gérer les appels entre le code interprété et le code compilé nativement. gcj fait partie du GCC, la collection de compilateurs GNU .

JavaScript

JSCcoa
Appelez le code Objective-C depuis javascript sur Mac OS X et iPhone (via le port libffi-iphone).
Mozilla
libffi est utilisé dans la bibliothèque js-ctypes (anciennement connue sous le nom de ctypes.jsm) pour appeler des fonctions C dans le code JavaScript (disponible dans les applications XULRunner , les extensions Firefox , etc.).
nœud-ffi
Un module complémentaire Node.js pour charger et appeler des bibliothèques dynamiques à partir de JavaScript.

Zézayer

cffi-libffi
La bibliothèque d'interface de fonction étrangère standard pour Common Lisp CFFI inclut le système cffi-libffi pour inclure la prise en charge de la transmission et du retour d'arguments de structure par valeur.
lutin
pixie (un dialecte Lisp inspiré de Clojure ) utilise libffi comme mécanisme d'interface de fonction étrangère par défaut.

Perl

FFI::Cru
Une enveloppe mince autour de libffi.
FFI::Ornithorynque
Un wrapper plus récent et plus pratique autour de libffi.

Python

CPython
L'implémentation par défaut et la plus largement utilisée du langage de programmation Python utilise libffi dans la bibliothèque standard ctypes.
PyObjC
Appelez le code Objective-C de Python sur Mac OS X.

Raquette

Raquette
Appelez le code C à partir de cette implémentation de Scheme populaire (également utilisée comme plate-forme d'implémentation pour le nouveau Lisp, Arc de Paul Graham).

Rubis

Violon
Un wrapper libffi dans la bibliothèque standard Ruby
Rubis-FFI
Une extension d'interface de fonction étrangère pour Ruby.
RubisCacao
Appelez le code Objective-C de Ruby sur Mac OS X.

Les références

Liens externes