XS (Perl)

XS er en grænseflade ( makrosprog ) til en ekstern Perl -funktion, hvorigennem et Perl -program kan kalde en C- eller C++- underrutine . XS (eller XSUB ) er en forkortelse for "eXternal Subroutine" (ekstern subrutine), hvor "eXternal" (ekstern) refererer til programmeringssprog, der er eksternt til Perl.

XS-makrosproget beskriver funktionsgrænsefladen og tjener til at justere Perl-funktionskaldsmodellen med C-funktionskaldsmodellen, som inkluderer typekonvertering og manipulation af placeringen af ​​funktionsargumenter og returværdier. Hver separat beskrevet funktion i grænsefladen kaldes XSUB .

XS bruges, når du vil lave bindinger eller grænseflader til eksisterende C-biblioteker til brug i Perl.

XS makrosprogets hovedopgave er at forenkle skrivningen af ​​specifikke moduler ved at erstatte den typiske bindingskode med korte makroer. XS erstatter dog ikke behovet for at lære Perls interne og API. Uden deres viden er det umuligt at skrive XS-moduler til Perl.

Udseende historie

Subrutinebiblioteker i Perl kaldes moduler , og moduler, der indeholder XSUB , kaldes XS-moduler . Perl giver en ramme til udvikling, emballering, distribution og installation af sådanne moduler.

Fremkomsten af ​​XS er forårsaget af behovet for at skrive subrutiner, der udfører meget CPU- og/eller RAM -intensive opgaver , interagerer med hardware eller systemværktøjer på lavt niveau, eksisterende subrutinebiblioteker i C.

Perl-tolk

Perl - tolken er et C -program , så der er ingen grundlæggende barrierer for at kalde C -programmer fra Perl . XS makrosproget er dog noget komplekst og yderst teknisk, og dets brug kræver en vis forståelse af Perl-fortolkeren. Den tidligste reference til dette emne var perlguts POD .

Wraps

Det er muligt at skrive XS-moduler, der ombryder C++-kode . Grundlæggende er det et spørgsmål om at opsætte modulopbygningssystemet [1] .

Et eksempel på oprettelse af et XS-modul

Det følgende er et XS-modul, der giver en funktion concat()til at sammenkæde to strenge (det vil sige svarende til Perl-operatoren .).

#define PERL_NO_GET_CONTEXT #inkluder " EXTERN.h" #include "perl.h" #include "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 ); returner one_copy ; } MODULE = Demo :: XSModule PAKKE = Demo :: XSModule SV * concat ( SV * one_sv , SV * two_sv ) KODE : SV * to_return = _do_sv_catsv ( aTHX_ one_sv , two_sv ); RETVAL = to_return ; OUTPUT : REVAL

De første fire linjer ( operatorerne #defineog #include) er standardmønsteret.

Dette efterfølges af et vilkårligt antal simple C-funktioner, der kaldes lokalt.

Sektionen, der starter med, MODULE = Demo::XSModuledefinerer Perl-grænsefladen for denne kode ved at bruge det faktiske XS-makrosprog. Bemærk, at C-koden i afsnittet CODE:kalder den rene C-funktion _do_sv_catsv(), der blev defineret i forrige afsnit.

Perl-dokumentationen forklarer betydningen og formålet med alle de "særlige" tegn (såsom aTHX_og RETVAL) vist ovenfor.

For at gøre dette modul tilgængeligt for Perl, skal det kompileres. Byg værktøjer såsom ExtUtils::MakeMaker kan gøre dette automatisk. (For at bygge manuelt: xsubpp- værktøjet analyserer XS-modulet og udsender C-kildekode; denne kildekode kompileres derefter i et delt bibliotek og placeres i en mappe, hvor Perl kan finde den.) Perl-koden bruger derefter XSLoaderen til at indlæse og kompiler XS-modulet . På dette tidspunkt kan Perl kalde Demo::XSModule::concat('foo', 'bar')og returnere resultatet som en streng foobar, som om det concat()selv var skrevet i Perl.

Bemærk, at for at skabe Perl-grænseflader til allerede eksisterende C-biblioteker, kan h2xs- værktøjet automatisere meget af oprettelsen af ​​selve XS-filen.

Vanskeligheder

Oprettelse og vedligeholdelse af XS-moduler kræver erfaring med selve C samt Perls omfattende C API. XS-moduler kan kun installeres, hvis C-kompileren og header-filerne , som Perl-fortolkeren blev kompileret med, er tilgængelige. Nyere versioner af Perl kan også bryde binær kompatibilitet , hvilket kræver, at XS-moduler skal genkompileres.

Se også

  • SWIG  er et alternativ til XS, der også understøtter kald af C- og C++-funktioner fra flere andre sprog.
  • FFI  er en mekanisme, der giver dig mulighed for at kalde subrutiner skrevet på et andet sprog.
  • Perl

Litteratur

  • Jenness, Tim & Cozens, Simon (2002). "Udvidelse og indlejring af Perl". Greenwich: Manning Publications Co. ISBN 1-930110-82-0
  1. Limning af C++ og Perl sammen . johnkeiser.com (27. august 2001). Hentet 15. september 2021. Arkiveret fra originalen 11. december 2001.

Links