libffi - libffi
| Utvecklare | Anthony Green |
|---|---|
| Första utgåvan | 7 oktober 1996 |
| Stabil frisättning | 3.4.2 / 28 juni 2021
|
| Förvar |
|
| 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 |
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 .
På 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
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.
- 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).
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.
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.