libffi - libffi
| Développeur(s) | Anthony Vert |
|---|---|
| Première version | 7 octobre 1996 |
| Version stable | 3.4.2 / 28 juin 2021
|
| Dépôt |
|
| É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 |
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 :
ré
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.
- 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.).
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.
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.