XS (Perl)

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é.

Historie vzhledu

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.

Perl interpret

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 .

Zábaly

Je možné napsat moduly XS, které obalí C++ kód . V podstatě jde o nastavení systému sestavování modulů [1] .

Příklad vytvoření modulu XS

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 : REVAL

První č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.

Obtíže

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.

Viz také

  • SWIG  je alternativou k XS, která také podporuje volání funkcí C a C++ z několika dalších jazyků.
  • FFI  je mechanismus, který umožňuje volat podprogramy napsané v jiném jazyce.
  • Perl

Literatura

  • Jenness, Tim & Cozens, Simon (2002). "Rozšiřování a vkládání Perl" . Greenwich: Manning Publications Co. ISBN 1-930110-82-0
  1. Spojení C++ a Perlu dohromady . johnkeiser.com (27. srpna 2001). Získáno 15. září 2021. Archivováno z originálu 11. prosince 2001.

Odkazy