XS (Perl)

XS on rajapinta ( makrokieli ) Perlin ulkoiseen funktioon , jonka kautta Perl- ohjelma voi kutsua C- tai C++- alirutiinia . XS (tai XSUB ) on lyhenne sanoista "ulkoinen aliohjelma" (ulkoinen aliohjelma), jossa "eXternal" (ulkoinen) viittaa Perlin ulkopuolisiin ohjelmointikieliin .

XS-makrokieli kuvaa funktion käyttöliittymää ja kohdistaa Perl-funktiokutsumallin C-funktiokutsumalliin, joka sisältää tyyppimuunnoksen ja funktion argumenttien ja palautusarvojen sijoittelun manipuloinnin. Jokainen erikseen kuvattu toiminto käyttöliittymässä on nimeltään XSUB .

XS:ää käytetään, kun halutaan tehdä sidoksia tai rajapintoja olemassa oleviin C-kirjastoihin käytettäväksi Perlissä.

XS-makrokielen päätehtävä on yksinkertaistaa tiettyjen moduulien kirjoittamista korvaamalla tyypillinen sidoskoodi lyhyillä makroilla. XS ei kuitenkaan korvaa tarvetta oppia Perlin sisäosat ja API. Ilman heidän tietämystänsä XS-moduulien kirjoittaminen Perlille on mahdotonta.

Ulkoasuhistoria

Perlin alirutiinikirjastoja kutsutaan moduuleiksi ja XSUB :n sisältäviä moduuleja kutsutaan XS-moduuleiksi . Perl tarjoaa puitteet tällaisten moduulien kehittämiseen, pakkaamiseen, jakeluun ja asentamiseen.

XS:n syntyminen johtuu tarpeesta kirjoittaa alirutiineja, jotka suorittavat erittäin prosessoria ja/tai RAM -intensiivisiä tehtäviä , ovat vuorovaikutuksessa laitteiston tai matalan tason järjestelmätyökalujen kanssa, olemassa olevien C:n alirutiinikirjastojen kanssa.

Perl-tulkki

Perl - tulkki on C - ohjelma , joten C - ohjelmien kutsumiselle Perlistä ei ole perustavanlaatuisia esteitä . XS-makrokieli on kuitenkin melko monimutkainen ja erittäin tekninen, ja sen käyttö vaatii jonkin verran Perl-tulkin ymmärtämistä. Varhaisin viittaus tähän aiheeseen oli perlguts POD .

Wraps

On mahdollista kirjoittaa XS-moduuleja, jotka käärivät C++-koodin . Pohjimmiltaan kyse on moduulin rakennusjärjestelmän asettamisesta [1] .

Esimerkki XS-moduulin luomisesta

Seuraava on XS-moduuli, joka tarjoaa toiminnon concat()kahden merkkijonon ketjuttamiseksi (eli vastaa Perl-operaattoria .).

#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 ( yksi_kopio , kaksi_sv ); palauttaa yksi_kopio ; } MODULE = Demo :: XSModule PAKETTI = Demo :: XSModule SV * concat ( SV * one_sv , SV * two_sv ) KOODI : SV * to_return = _do_sv_catsv ( aTHX_ one_sv , two_sv ); RETVAL = paluu ; TULOSTULO : REVAL

Ensimmäiset neljä riviä ( #defineja operaattorit #include) ovat vakiokuvio.

Tätä seuraa mikä tahansa määrä yksinkertaisia ​​C-funktioita, joita kutsutaan paikallisesti.

Tekstillä alkava osio MODULE = Demo::XSModulemäärittää tämän koodin Perl-rajapinnan käyttäen todellista XS-makrokieltä. Huomaa, että osion C-koodi CODE:kutsuu puhdasta C-funktiota _do_sv_catsv(), joka määriteltiin edellisessä osassa.

Perl-dokumentaatio selittää kaikkien yllä olevien "erikoismerkkien" (kuten aTHX_ja RETVAL) merkityksen ja tarkoituksen.

Jotta tämä moduuli olisi Perlin käytettävissä, se on käännettävä. Rakennustyökalut, kuten ExtUtils::MakeMaker , voivat tehdä tämän automaattisesti. (Manuaalinen rakentaminen: xsubpp -työkalu jäsentää XS-moduulin ja tulostaa C-lähdekoodin; tämä lähdekoodi käännetään sitten jaettuun kirjastoon ja sijoitetaan hakemistoon, josta Perl löytää sen.) Perl-koodi käyttää sitten XSLoaderia lataamiseen ja käännä XS-moduuli . Tässä vaiheessa Perl voi kutsua Demo::XSModule::concat('foo', 'bar')ja palauttaa tuloksen merkkijonona foobarikään kuin se olisi concat()itse kirjoitettu Perlissä.

Huomaa, että Perl-liitäntöjen luomiseksi jo olemassa oleviin C-kirjastoihin h2xs- työkalu voi automatisoida suuren osan itse XS-tiedoston luomisesta.

Vaikeudet

XS-moduulien luominen ja ylläpito vaatii kokemusta itse C:stä sekä Perlin laajasta C API:sta. XS-moduulit voidaan asentaa vain, jos C-kääntäjä ja otsikkotiedostot , joilla Perl-tulkki on käännetty, ovat saatavilla. Myös uudemmat Perlin versiot voivat rikkoa binaariyhteensopivuuden , jolloin XS-moduulit on käännettävä uudelleen.

Katso myös

  • SWIG  on vaihtoehto XS:lle, joka tukee myös C- ja C++-funktioiden kutsumista useista muista kielistä.
  • FFI  on mekanismi, jonka avulla voit kutsua toisella kielellä kirjoitettuja aliohjelmia.
  • Perl

Kirjallisuus

  • Jenness, Tim & Cozens, Simon (2002). "Perlin laajentaminen ja upottaminen". Greenwich: Manning Publications Co. ISBN 1-930110-82-0
  1. C++:n ja Perlin liimaus yhteen . johnkeiser.com (27. elokuuta 2001). Haettu 15. syyskuuta 2021. Arkistoitu alkuperäisestä 11. joulukuuta 2001.

Linkit