libffi - libffi

libffi
Ontwikkelaar(s) Anthony Groen
Eerste uitgave 7 oktober 1996 ; 24 jaar geleden ( 1996-10-07 )
Stabiele vrijlating
3.4.2 / 28 juni 2021 ; 1 dag geleden ( 2021-06-28 )
Opslagplaats Bewerk dit op Wikidata
Geschreven in C , Assembleertaal
Besturingssysteem Unix-achtig , Microsoft Windows , OS X , iOS , Bare Metal
Type Runtime bibliotheek
Licentie MIT-licentie
Website sourceware .org /libffi / Bewerk dit op Wikidata

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

libffi-d
Bindingen naar de libffi-bibliotheek voor D. Voornamelijk gebruikt voor de MCI (Managed Compiler Infrastructure).

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.
Dalvik
Dalvik is de virtuele machine die het Java-platform op mobiele Android -apparaten draait. libffi wordt gebruikt op Android-poorten waarvoor geen aangepaste overbruggingscode is geschreven.
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.).
node-ffi
Een Node.js- add-on voor het laden en aanroepen van dynamische bibliotheken vanuit JavaScript.

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.
elfje
pixie (een door Clojure geïnspireerd Lisp-dialect) gebruikt libffi als het standaard interfacemechanisme voor vreemde functies.

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.

Referenties

Externe links