libffi - libffi
| Ontwikkelaar(s) | Anthony Groen |
|---|---|
| Eerste uitgave | 7 oktober 1996 |
| Stabiele vrijlating | 3.4.2 / 28 juni 2021
|
| Opslagplaats |
|
| Geschreven in | C , Assembleertaal |
| Besturingssysteem | Unix-achtig , Microsoft Windows , OS X , iOS , Bare Metal |
| Type | Runtime bibliotheek |
| Licentie | MIT-licentie |
| Website |
sourceware |
libffi is een interfacebibliotheek voor vreemde functies . Het voorziet in een programmeertaal C -interface voor het bellen gecompileerde functies gegeven informatie over de beoogde functie op runtime in plaats van het compileren . Het implementeert ook de tegenovergestelde functionaliteit: libffi kan een aanwijzer produceren naar een functie die elke combinatie van argumenten kan accepteren en decoderen die tijdens runtime zijn gedefinieerd.
libffi wordt meestal gebruikt als een overbruggingstechnologie tussen gecompileerde en geïnterpreteerde taalimplementaties . libffi kan ook worden gebruikt om plug-ins te implementeren , waarbij de functiehandtekeningen van de plug-in niet bekend zijn op het moment dat de hosttoepassing wordt gemaakt.
Bekende gebruikers zijn onder andere Python , Haskell , Dalvik , F-Script , pypy , PyObjC , RubyCocoa , JRuby , Rubinius , MacRuby , gcj , GNU Smalltalk , IcedTea , Cycript , Pion , Squeak , Java inheemse Access , Common Lisp (via CFFI), Racket , Insluitbare Common Lisp en Mozilla .
Op Mac OS X wordt libffi vaak gebruikt met BridgeSupport , dat programmeertaalneutrale beschrijvingen van framework- interfaces biedt, en Nu, dat directe Objective-C- toegang vanuit Lisp bindt .
libffi is op grote schaal geporteerd en wordt vrijgegeven onder een MIT-licentie .
Achtergrond
Hoewel de C-programmeertaal alomtegenwoordig is onder platforms, variëren de manieren waarop functieaanroepen worden geïmplementeerd in machinecode - de oproepconventie -. Wanneer men een subroutine tijdens runtime dynamisch wil laden, is kennis van deze conventies vereist.
libffi heeft kennis van de belconventie op veel platforms (processor-OS-combinaties). De C API , die wordt gedeeld op alle builds van libffi, ongeacht het platform, abstract over de complexiteit van het laden van code op verschillende platforms. Naast reguliere functies ondersteunt het ook variadische functies in C-stijl .
De C-aanroepconventie wordt niet alleen gebruikt door de C-taal: vanwege de hoeveelheid bestaande code die in C is geschreven, laten de meeste nieuwere gecompileerde talen ook schrijf- en aanroepfuncties toe in een dergelijke conventie. Als gevolg hiervan kan libffi ook communiceren met sommige functies die in deze talen zijn geschreven.
Geschiedenis
libffi, oorspronkelijk ontwikkeld door Anthony Green, is geïnspireerd op de Gencall-bibliotheek van Silicon Graphics . Gencall is ontwikkeld door Gianni Mariani, toen in dienst van SGI , met het doel om oproepen naar functies op adres mogelijk te maken en een oproepframe te creëren voor de specifieke oproepconventie ( MIPS O32). Anthony Green verfijnde het idee en breidde het uit naar andere architecturen en het aanroepen van conventies en open sourcing libffi.
Adoptie
De libffi-bibliotheek is nuttig bij het bouwen van een brug tussen geïnterpreteerde en native gecompileerde code. Enkele opmerkelijke gebruikers zijn:
D
F-script
- F-script
- Genereert dynamisch Cocoa-klassen die zijn geschreven in F-Script.
Bedrog
- GNU Guile
- libffi wordt gebruikt in Guile 1.9.8 en hoger
Haskell
- GHC
- libffi wordt sinds eind 2009 gebruikt voor het merendeel van de FFI die door de GHC wordt uitgevoerd.
Java
- OpenJDK
- De open-source implementatie van de Java Platform Standard Edition gebruikt libffi om een brug te slaan tussen de interpreter en de native code voor de Zero-Assembly-poort.
- Java-native toegang (JNA)
- De JNI-vrije manier om native code vanuit Java aan te roepen.
- gcj
- De runtime-bibliotheek voor de GNU-compiler voor de Java-programmeertaal gebruikt libffi om aanroepen heen en weer tussen geïnterpreteerde en native gecompileerde code af te handelen. gcj maakt deel uit van de GCC, de GNU Compiler Collection .
JavaScript
- JSCoca
- Bel Objective-C-code vanuit javascript op Mac OS X en de iPhone (via de libffi-iphone-poort).
- Mozilla
- libffi wordt gebruikt in de js-ctypes- bibliotheek (voorheen bekend als ctypes.jsm) om C-functies binnen JavaScript- code aan te roepen (beschikbaar in XULRunner- toepassingen, Firefox- extensies enz.).
Lisp
- cffi-libffi
- De standaard interfacebibliotheek met vreemde functies voor Common Lisp CFFI omvat het cffi-libffi-systeem om ondersteuning te bieden voor het doorgeven en retourneren van structuurargumenten op waarde.
Perl
- FFI::Rauw
- Een dunne wikkel rond libffi.
- FFI:: Vogelbekdier
- Nieuwere, handigere wrapper rond libffi.
Python
- CPython
- De standaard, meest gebruikte implementatie van de programmeertaal Python gebruikt libffi in de standaard ctypes-bibliotheek.
- PyObjC
- Roep Objective-C-code aan vanuit Python op Mac OS X.
Racket
- Racket
- Roep C-code op van deze populaire Scheme-implementatie (ook gebruikt als het implementatieplatform voor Paul Graham's nieuwe Lisp, Arc).
Robijn
- Viool
- Een libffi-wrapper in de Ruby Standard Library
- Ruby-FFI
- Een Foreign Function Interface-extensie voor Ruby.
- RubyCacao
- Bel Objective-C-code van Ruby op Mac OS X.