XS je rozhraní ( makrojazyk ) k externí funkci Perlu , jehož prostřednictvím může program v Perlu volat podprogram C nebo C++ . XS (nebo XSUB ) je zkratka pro „eXternal Subroutine“ (externí podprogram), kde „eXternal“ (externí) odkazuje na programovací jazyky externí k Perlu.
Makrojazyk XS popisuje rozhraní funkcí a slouží k zarovnání modelu volání funkce Perl s modelem volání funkce C, který zahrnuje konverzi typů a manipulaci s umístěním argumentů funkce a návratových hodnot. Každá samostatně popsaná funkce v rozhraní se nazývá XSUB .
XS se používá, když chcete vytvořit vazby nebo rozhraní k existujícím knihovnám C pro použití v Perlu.
Hlavním úkolem makrojazyka XS je zjednodušit psaní konkrétních modulů nahrazením typického vazebního kódu krátkými makry. XS však nenahrazuje nutnost učit se vnitřní části a API Perlu. Bez jejich znalostí je psaní XS modulů pro Perl nemožné.
Knihovny podprogramů v Perlu se nazývají moduly a moduly obsahující XSUB se nazývají moduly XS . Perl poskytuje rámec pro vývoj, balení, distribuci a instalaci takových modulů.
Vznik XS je způsoben potřebou psát podprogramy, které provádějí úkoly velmi náročné na CPU a/nebo RAM , interagovat s hardwarem nebo nízkoúrovňovými systémovými nástroji, existujícími knihovnami podprogramů v C.
Interpret Perl je program v jazyce C , takže neexistují žádné zásadní překážky pro volání programů v jazyce C z Perlu . Makrojazyk XS je však poněkud složitý a vysoce technický a jeho použití vyžaduje určité porozumění interpretu Perl. První zmínka o tomto tématu byla perlguts POD .
Je možné napsat moduly XS, které obalí C++ kód . V podstatě jde o nastavení systému sestavování modulů [1] .
Následuje modul XS, který poskytuje funkci concat()pro zřetězení dvou řetězců (to znamená ekvivalent perlského operátoru .).
#define PERL_NO_GET_CONTEXT #include "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 ( jedna_kopie , dva_sv ); return one_copy ; } MODULE = Demo :: XSModule PACKAGE = Demo :: XSModule SV * concat ( SV * one_sv , SV * two_sv ) KÓD : SV * to_return = _do_sv_catsv ( aTHX_ one_sv , two_sv ); RETVAL = vrátit se ; VÝSTUP : REVALPrvní čtyři řádky ( operátory #definea #include) jsou standardním vzorem.
Následuje libovolný počet jednoduchých C funkcí, které jsou volány lokálně.
Část, která začíná, MODULE = Demo::XSModuledefinuje rozhraní Perl pro tento kód pomocí skutečného jazyka maker XS. Všimněte si, že kód C v části CODE:volá funkci čistě C _do_sv_catsv(), která byla definována v předchozí části.
Dokumentace Perlu vysvětluje význam a účel všech „speciálních“ znaků (jako aTHX_a RETVAL) uvedených výše.
Aby byl tento modul dostupný pro Perl, musí být zkompilován. Nástroje pro tvorbu, jako je ExtUtils::MakeMaker , to umí automaticky. (Ruční sestavení: nástroj xsubpp analyzuje modul XS a vydá zdrojový kód C; tento zdrojový kód je poté zkompilován do sdílené knihovny a umístěn do adresáře, kde jej Perl může najít.) Kód Perl pak používá XSLoader k načtení a zkompilujte modul XS . V tomto okamžiku může Perl zavolat Demo::XSModule::concat('foo', 'bar')a vrátit výsledek jako řetězec foobar, jako by byl concat()sám napsán v Perlu.
Všimněte si, že za účelem vytvoření rozhraní Perl k již existujícím knihovnám C může nástroj h2xs automatizovat velkou část vytváření samotného souboru XS.
Vytváření a údržba modulů XS vyžaduje zkušenosti s C samotným a také s rozsáhlým C API Perlu. Moduly XS lze nainstalovat pouze tehdy, jsou-li k dispozici kompilátor C a hlavičkové soubory, se kterými byl zkompilován interpret Perl. Novější verze Perlu mohou také narušit binární kompatibilitu , což vyžaduje rekompilaci modulů XS.
Perl | |
---|---|
Lidé |
|
Věci | |
Rámce |
|
|
Bezplatný open source software | |
---|---|
Hlavní věc |
|
Společenství |
|
Organizace | |
licence | |
Problémy | |
jiný |
|
|