libffi - libffi

libffi
Utvecklare Anthony Green
Första utgåvan 7 oktober 1996 ; För 24 år sedan ( 1996-10-07 )
Stabil frisättning
3.4.2 / 28 juni 2021 ; 1 dag sedan ( 2021-06-28 )
Förvar Redigera detta på Wikidata
Skrivet i C , monteringsspråk
Operativ system Unix-liknande , Microsoft Windows , OS X , iOS , Bare Metal
Typ Körtidsbibliotek
Licens MIT-licens
Hemsida källkod .org / libffi / Redigera detta på Wikidata

libffi är ett gränssnittsbibliotek för utländska funktioner . Det ger en programspråket C -gränssnitt för att ringa inbyggt kompilerade funktioner ges information om målet funktionen vid körning i stället för kompileringen . Det implementerar också motsatt funktionalitet: libffi kan producera en pekare till en funktion som kan acceptera och avkoda alla kombinationer av argument som definieras vid körningstid.

libffi används oftast som en överbryggande teknik mellan sammanställda och tolkade språkimplementeringar. libffi kan också användas för att implementera plugin-program , där plug-in-funktionens funktionssignaturer inte är kända när värdprogrammet skapades.

Anmärkningsvärda användare inkluderar Python , Haskell , Dalvik , F-Script , PyPy , PyObjC , RubyCocoa , JRuby , Rubinius , MacRuby , gcj , GNU Smalltalk , IcedTea , Cycript , Pawn , Squeak , Java Native Access , Common Lisp (via CFFI), Racket , Inbäddningsbar Common Lisp och Mozilla .

Mac OS X , är libffi vanligen används med BridgeSupport , vilket ger programmeringsspråk neutrala beskrivningar av ramverksgränssnitt, och Nu som binder direkt Objective-C åtkomst från Lisp .

libffi har i stor utsträckning portade och är släppt under en MIT-licens .

Bakgrund

Även programspråket C är allestädes närvarande bland plattformar, hur fungerar samtalen genomförs i maskinkod - det ringer konvention - varierar. När man vill ladda en underrutin dynamiskt vid körning krävs kunskap om dessa konventioner.

libffi har kunskap om anropskonventionen på många plattformar (processor-OS-kombinationer). Dess C API , som delas på alla byggnader av libffi oavsett plattform, abstrakt över komplexiteten i att ladda kod på olika plattformar. Förutom vanliga funktioner stöder den också C- stilvariadiska funktioner .

C-anropskonventionen används inte bara av C-språket: på grund av mängden befintlig kod skriven i C tillåter de flesta nyare sammanställda språken också skriv- och anropsfunktioner i en sådan konvention. Som ett resultat kan libffi interagera med vissa funktioner skrivna på dessa språk också.

Historia

libffi, ursprungligen utvecklat av Anthony Green, inspirerades av Gencall-biblioteket från Silicon Graphics . Gencall utvecklades av Gianni Mariani, då anställd av SGI , i syfte att tillåta samtal till funktioner efter adress och skapa en samtalsram för den specifika samtalskonventionen ( MIPS O32). Anthony Green förfinade idén och utvidgade den till andra arkitekturer och anropskonventioner och open sourcing libffi.

Adoption

Libffi-biblioteket är användbart för att bygga en bro mellan tolkad och inbyggd kod. Några anmärkningsvärda användare inkluderar:

D

libffi-d
Bindningar till libffi-biblioteket för D. Används främst för MCI (Managed Compiler Infrastructure).

F-Script

F-Script
Genererar dynamiskt kakaoklasser skrivna i F-Script.

Svek

GNU Guile
libffi används i Guile 1.9.8 och senare

Haskell

GHC
libffi har använts för majoriteten av FFI utfört av GHC sedan slutet av 2009.

Java

OpenJDK
Open source-implementeringen av Java Platform Standard Edition använder libffi för att överbrygga tolk och inbyggd kod för nollmonteringsport.
Dalvik
Dalvik är den virtuella maskinen som driver Java-plattformen på Android- mobila enheter. libffi används på Android-portar för vilka ingen anpassad överbryggningskod har skrivits.
Java Native Access (JNA)
Det JNI-fria sättet att ringa inbyggd kod från Java.
gcj
Runtidsbiblioteket för GNU Compiler för Java-programmeringsspråket använder libffi för att hantera samtal fram och tillbaka mellan tolkad och nativt kompilerad kod. gcj är en del av GCC, GNU Compiler Collection .

JavaScript

JSCocoa
Ring Objective-C-kod från javascript på Mac OS X och iPhone (via libffi-iphone-porten).
Mozilla
libffi används i js-ctypes- biblioteket (tidigare känt som ctypes.jsm) för att ringa C-funktioner inom JavaScript- kod (tillgänglig i XULRunner- applikationer, Firefox- tillägg etc).
nod-ffi
Ett Node.js- tillägg för laddning och anrop av dynamiska bibliotek från JavaScript.

Läspa

cffi-libffi
Standard utländskt funktionsgränssnittsbibliotek för Common Lisp CFFI inkluderar cffi-libffi-systemet för att inkludera stöd för att skicka och returnera strukturargument efter värde.
pixie
pixie (en Clojure- inspirerad Lisp-dialekt) använder libffi som standardgränssnittsmekanism för främmande funktioner.

Perl

FFI :: Raw
Ett tunt omslag runt libffi.
FFI :: Platypus
Nyare och bekvämare omslag runt libffi.

Pytonorm

CPython
Standard, mest använda implementeringen av Python-programmeringsspråket använder libffi i standardtypbiblioteket.
PyObjC
Ring Objective-C-kod från Python på Mac OS X.

Racket

Racket
Ring C-kod från denna populära Scheme-implementering (används också som implementeringsplattform för Paul Grahams nya Lisp, Arc).

Rubin

Fiol
Ett libffi-omslag i Ruby Standard Library
Ruby-FFI
En gränssnittsförlängning för Ruby.
RubyCocoa
Ring Objective-C-kod från Ruby på Mac OS X.

Referenser

externa länkar