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.
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 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 .
On mahdollista kirjoittaa XS-moduuleja, jotka käärivät C++-koodin . Pohjimmiltaan kyse on moduulin rakennusjärjestelmän asettamisesta [1] .
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 : REVALEnsimmä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.
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.
Perl | |
---|---|
Ihmiset |
|
Asiat | |
Kehykset |
|
|
Ilmainen ja avoimen lähdekoodin ohjelmisto | |
---|---|
Pääasia |
|
Yhteisö |
|
Organisaatiot | |
Lisenssit | |
Ongelmia | |
Muut |
|
|