XS (Perl)

XS är ett gränssnitt ( makrospråk ) till en extern Perl - funktion genom vilken ett Perl- program kan anropa en C- eller C++- subrutin . XS (eller XSUB ) är en förkortning för "eXternal Subroutine" (extern subrutin), där "eXternal" (extern) syftar på programmeringsspråk som är externa till Perl.

XS-makrospråket beskriver funktionsgränssnittet och tjänar till att anpassa Perl-funktionsanropsmodellen med C-funktionsanropsmodellen, som inkluderar typkonvertering och manipulering av placeringen av funktionsargument och returvärden. Varje separat beskriven funktion i gränssnittet kallas XSUB .

XS används när du vill göra bindningar eller gränssnitt till befintliga C-bibliotek för användning i Perl.

Huvuduppgiften för XS-makrospråket är att förenkla skrivningen av specifika moduler genom att ersätta den typiska bindningskoden med korta makron. XS ersätter dock inte behovet av att lära sig Perls interna funktioner och API. Utan deras kunskap är det omöjligt att skriva XS-moduler för Perl.

Utseendehistorik

Subrutinbibliotek i Perl kallas moduler , och moduler som innehåller XSUB kallas XS-moduler . Perl tillhandahåller ett ramverk för att utveckla, paketera, distribuera och installera sådana moduler.

Uppkomsten av XS orsakas av behovet av att skriva subrutiner som utför mycket CPU- och/eller RAM -intensiva uppgifter , interagerar med hårdvara eller systemverktyg på låg nivå, befintliga subrutinbibliotek i C.

Perl-tolk

Perl- tolken är ett C- program , så det finns inga grundläggande hinder för att anropa C -program från Perl . XS-makrospråket är dock något komplext och mycket tekniskt, och dess användning kräver viss förståelse för Perl-tolken. Den tidigaste referensen till detta ämne var perlguts POD .

Wraps

Det är möjligt att skriva XS-moduler som omsluter C++-kod . I grund och botten handlar det om att sätta upp modulbyggsystemet [1] .

Ett exempel på att skapa en XS-modul

Följande är en XS-modul som tillhandahåller en funktion concat()för att sammanfoga två strängar (det vill säga motsvarande Perl-operatorn .).

#define PERL_NO_GET_CONTEXT #inkludera " EXTERN.h" #inkludera "perl.h" #inkludera "XSUB.h" SV * _do_sv_catsv ( pTHX_ SV * one_sv , SV * two_sv ) { SV * one_copy = newSVsv ( one_sv ); sv_catsv ( one_copy , two_sv ); returnera one_copy ; } MODULE = Demo :: XSModule PACKAGE = Demo :: XSModule SV * concat ( SV * one_sv , SV * two_sv ) KOD : SV * to_return = _do_sv_catsv ( aTHX_ one_sv , two_sv ); RETVAL = to_return ; UTGÅNG : REVAL

De första fyra raderna ( operatorerna #defineoch #include) är standardmönstret.

Detta följs av valfritt antal enkla C-funktioner som anropas lokalt.

Avsnittet som börjar med MODULE = Demo::XSModuledefinierar Perl-gränssnittet för denna kod, med det faktiska XS-makrospråket. Observera att C-koden i avsnittet CODE:anropar den rena C-funktionen _do_sv_catsv()som definierades i föregående avsnitt.

Perl-dokumentationen förklarar innebörden och syftet med alla "speciella" tecken (som aTHX_och RETVAL) som visas ovan.

För att göra denna modul tillgänglig för Perl måste den kompileras. Bygg verktyg som ExtUtils::MakeMaker kan göra detta automatiskt. (För att bygga manuellt: xsubpp- verktyget analyserar XS-modulen och matar ut C-källkoden; denna källkod kompileras sedan till ett delat bibliotek och placeras i en katalog där Perl kan hitta den.) Perl-koden använder sedan XSLoadern för att ladda och kompilera XS-modulen . Vid det här laget kan Perl anropa Demo::XSModule::concat('foo', 'bar')och returnera resultatet som en sträng foobar, som om det concat()självt vore skrivet i Perl.

Observera att för att skapa Perl-gränssnitt till redan befintliga C-bibliotek, kan h2xs- verktyget automatisera mycket av skapandet av själva XS-filen.

Svårigheter

Att skapa och underhålla XS-moduler kräver erfarenhet av själva C samt Perls omfattande C API. XS-moduler kan bara installeras om C-kompilatorn och header-filerna som Perl-tolken kompilerades med är tillgängliga. Dessutom kan nyare versioner av Perl bryta binär kompatibilitet , vilket kräver att XS-moduler kompileras om.

Se även

  • SWIG  är ett alternativ till XS som även stöder anrop av C- och C++-funktioner från flera andra språk.
  • FFI  är en mekanism som låter dig anropa subrutiner skrivna på ett annat språk.
  • Perl

Litteratur

  • Jenness, Tim & Cozens, Simon (2002). "Utöka och bädda in Perl". Greenwich: Manning Publications Co. ISBN 1-930110-82-0
  1. Limma ihop C++ och Perl . johnkeiser.com (27 augusti 2001). Hämtad 15 september 2021. Arkiverad från originalet 11 december 2001.

Länkar