EnglezăFrancezăSpaniolă

Favicon OnWorks

prima-gencls - Online în cloud

Rulați prima-gencls în furnizorul de găzduire gratuit OnWorks prin Ubuntu Online, Fedora Online, emulator online Windows sau emulator online MAC OS

Aceasta este comanda prima-gencls care poate fi rulată în furnizorul de găzduire gratuit OnWorks folosind una dintre multiplele noastre stații de lucru online gratuite, cum ar fi Ubuntu Online, Fedora Online, emulator online Windows sau emulator online MAC OS

PROGRAM:

NUME


gencls - compilator de interfață de clasă pentru modulele de bază Prima

REZUMAT


gencls --h --inc --tml -O -I --depend --sayparent filename.cls

DESCRIERE


Creează anteturi cu macrocomenzi și structuri C pentru definițiile obiectelor modulului de bază Prima.

ARGUMENTE


gencls acceptă următoarele argumente:

--h Generează fișierul .h (cu declarații care urmează să fie incluse în unul sau mai multe fișiere)

--inc
Generează fișierul .inc (cu declarațiile care trebuie incluse numai în fișier)

-O Activează algoritmul de optimizare pentru fișierele .inc. Algoritmul se bazează pe o presupunere,
că unele funcții sunt declarate identic, deci piesa de cod care se ocupă
conversia parametrului și rezultatul poate fi partajată. Cu steag „-O” activat, un corp thunk este
înlocuit cu un apel la o funcție, al cărui nume este format din toți parametrii metodei
plus rezultat. Funcția actuală nu este scrisă în fișierul .inc, ci în fișierul .tml. Toate
Declarațiile duplicate dintr-un set de fișiere .tml pot fi eliminate și mementoul
scris într-un fișier de utilitarul tmlink.

--tml
Generează fișierul .tml. Pornește automat „-O”.

-Idirname
Adaugă un director la o cale de căutare, unde utilitarul caută fișiere .cls. Poate fi
specificat de mai multe ori.

--depinde
Imprimă dependențe pentru un fișier dat.

--sayparent
Tipărește părintele imediat al unei clase în interiorul fișierului dat.

SINTAXĂ


Pe scurt, sintaxa unui fișier .cls poate fi descrisă prin următoarea schemă:

[ zero sau mai multe declarații de tip ]
[ declarație zero sau o clasă ]

Gencls produce fișiere .h, .inc sau .tml, cu un nume de bază al fișierului .cls, dacă nu există obiect sau
numele pachetului dat, sau cu un nume al obiectului sau al pachetului altfel.

pachet de bază mărime scalară de date Tipuri
Gencls are încorporate mai multe tipuri de date scalare, cu care știe să se ocupe. a „a face”
înseamnă că poate genera un cod care transferă date de acest tip între C și perl,
folosind interfața de bibliotecă XS (vezi perlguts).

Tipurile sunt:

int
boolean
Mâner
dubla
SV*
HV*
char *
șir (declarația C este char[256] )

Există, de asemenea, unele tipuri încorporate derivate, care sunt

lung
mic de statura
car de război
Culori
U8

care sunt mapate la int. Datele nu suferă nicio conversie în int în procesul de transfer, dar aceasta
este stocat în schimb în perl scalar folosind nouSViv() funcție, care, la rândul său, poate pierde biți
sau un semn.

Derivat de date Tipuri
Sintaxa pentru o definiție nouă a tipurilor de date este următoarea:



Un domeniu de aplicare poate fi unul dintre cele două pragmate, „global” sau „local”. Ele sugerează utilizarea unor date noi
tip, dacă tipul va fi folosit numai pentru unul sau mai multe obiecte. Folosirea cuvântului „local” este
seamănă oarecum cu C pragma static. În prezent, singura diferență este că o funcție
folosind un tip local complex în lista de parametri sau ca rezultat nu este un subiect pentru
Optimizare „-O”.

mărime scalară Tipuri
Noile tipuri scalare pot fi asociate doar cu cele existente, în primul rând pentru codarea C
comoditatea. Un tip scalar poate fi definit în două moduri:

Aliasarea directă
Sintaxă:

$id => ;

Exemplu:

global $Handle => int;

Noul ID de tip nu va fi vizibil în fișierele C, dar tipul va fi înlocuit
toate fișierele .cls care includ această definiție.

C macro
Sintaxă:

id1 id2

Exemplu:

global API_HANDLE UV

Un astfel de cod creează o definiție macro C în fișierul antet .h sub formă

#definiți id1 id2

Macro-urile C cu parametri nu sunt permise. id1 și id2 nu trebuie să fie prezente
în spațiul de nume .cls și nu se face nicio înlocuire în timpul procesării fișierului .cls. Acest
utilizarea pragma este foarte limitată.

Complex Tipuri
Tipurile complexe de date pot fi matrice, structuri și hashuri. Ele pot fi o combinație sau o
vector de tipuri de date scalare (dar nu complexe).

Gencls permite mai multe combinații de tipuri de date complexe pe care limbajul C nu le face
recunoaşte. Acestea vor fi descrise mai jos.

Tipurile de date complexe nu sunt importate în codul perl. Un programator perl trebuie să se conformeze
tipul de date utilizat la transmiterea parametrilor unei funcții.

Arrays
Sintaxă:

@id [dimensiune];

Exemplu:

global @FillPattern U8[8];

Exemplu de funcții care utilizează matrice:

Array * func( Array a1, Array * a2);

Cod Perl:

@ret = func( @array1, @array2);

Rețineți că referințele la matrice nu sunt utilizate și numărul de articole din toate matricea
parametrii trebuie să fie exact ca dimensiunile matricelor.

Notă: următoarea declarație nu se va compila cu compilatorul C, deoarece C nu poate reveni
matrice. Cu toate acestea, nu este tratată ca o eroare de către gencls:

Array func();

Structuri
Sintaxă:

@id {
;
...
;
};

Exemplu:

global @Struc {
număr int;
ID șir;
}

Exemplu de funcții care utilizează structuri:

Struc * func1( Struc a1, Struc * a2);
Struc func2( Struc a1, Struc * a2);

Cod Perl:

@ret = func1( @struc1, @struc2);
@ret = func2( @struc1, @struc2);

Rețineți că referințele de matrice nu sunt utilizate și atât numărul cât și ordinea articolelor în total
parametrii matricei trebuie setați exact ca dimensiuni și ordinea structurilor. Struct
numele câmpurilor nu sunt folosite și în codul perl.

Hash-uri
Sintaxă:

%id {
;
...
;
};

Exemplu:

global % Hash {
număr int;
ID șir;
}

Exemplu de funcții care utilizează hash-uri:

Hash * func1( Hash a1, Hash * a2);
Hash func2( Hash a1, Hash * a2);

Cod Perl:

%ret = %{func1( \%hash1, \%hash2)};
%ret = %{func2( \%hash1, \%hash2)};

Rețineți că numai referințele hash sunt utilizate și returnate. Când un hash este transmis de la perl
cod ar putea avea unele sau toate câmpurile nesetate. Structura C este umplută și trecută la a
C, iar câmpurile care au fost nesetate sunt atribuite unui corespondent
Valoarea C_TYPE_UNDEF, unde TYPE este unul dintre literalele NUMERIC, STRING și POINTER.

Conversia înapoi nu contează pe aceste valori și returnează întotdeauna toate cheile hash cu a
perechea corespunzătoare.

Spațiu de nume secțiune
Sintaxă:

{

...

}

Un fișier .cls poate avea zero sau o secțiune de spațiu de nume, pline cu descrieri de funcții.
Funcțiile descrise aici vor fi exportate la ID-ul dat în timpul codului de inițializare. A
spațiul de nume poate fi fie „obiect”, fie „pachet”.

Sintaxa spațiului de nume pachet permite doar declararea funcțiilor în interiorul unui „pachet”
bloc.

pachet {

...
}

Sintaxa spațiului de nume obiect include variabile și proprietăți, precum și funcții (
numite metode în sintaxa obiectului). Sintaxa generală a spațiului de nume al obiectului este

obiect [(ID-ul clasei părinte)] {



}

În cadrul unui spațiu de nume obiect, poate fi utilizată sintaxa moștenirii:

obiect ( ) { ... }

sau o descriere a obiectului rădăcină goală (fără strămoș)

obiect { ... }

pentru declarația clasei obiect.

funcţii
Sintaxă:

[ ] ( ) [ => ];

Exemple:

int package_func1( int a, int b = 1) => c_func_2;
Punct package_func2( Struc * x, ...);
metoda void object_func3( HV * profile);

Un prefix este utilizat numai cu funcțiile obiect (metode). Mai multe despre prefix în Metode
secţiune.

O funcție nu poate returna nimic ( void ), un scalar ( int, șir etc ) sau un complex (
tip array, hash ). Poate accepta la fel de bine parametri scalari și complexi, cu tip
conversie care corespunde regulilor descrise mai sus în „Tipuri de date scalare de bază”
secţiune.

Dacă o funcție are parametri și/sau rezultat de un tip care nu poate fi convertit
automat între C și perl, este declarat, dar nu este expus spațiului de nume perl. The
se emite avertismentul corespunzător. Nu este posibil să folosiți sintaxa gencls pentru a declara a
funcția cu parametri personalizați sau date rezultate. În acest scop, C
trebuie făcută declararea codului împreună cu apelul „newXS”.

Exemplu: punctele de suspensie (...) nu pot fi convertite de gencls, totuși este un C legal
constructie.

Punct package_func2( Struc * x, ...);

Sintaxa funcției are mai multe adăugiri:

Valorile implicite ale parametrilor
Exemplu:

void func( int a = 15);

O funcție declarată în acest fel poate fi apelată atât cu 0, cât și cu 1 parametri. Dacă este
apelat cu 0 parametri, va fi utilizată automat o valoare întreagă de 15. The
sintaxa permite parametrii impliciti pentru tipurile int, pointer și șir și scalari ai acestora
aliasuri.

Parametrii impliciti pot fi cât mai mulți posibil, dar trebuie să fie la sfârșitul
lista parametrilor funcției. Declarația „func( int a = 1, int b)” este incorectă.

Alianta
În codul C generat, o funcție C trebuie apelată după ce parametrii au fost
analizat. Gencls se așteaptă ca o funcție conformă să fie prezentă în codul C, cu nume fix
și lista de parametri. Cu toate acestea, dacă sarcina unei astfel de funcții este un înveliș la un identic
funcție publicată sub alt nume, aliasing poate fi preformat pentru a salva atât codul, cât și
viteză.

Exemplu:

pachet pachet {
void func( int x) => intern;
}

O funcție declarată în acest fel nu va apela Package_func() funcția C, dar
intern() funcţionează în schimb. Singura cerere este aceea intern() funcția trebuie să aibă
parametru și declarație de rezultat identic cu a func().

Hash inline
A fost concepută o modalitate utilă de a apela o funcție cu un hash ca parametru din perl. În cazul în care o
funcția este declarată cu ultimul parametru sau tip „HV*”, apoi translația parametrului
de la perl la C se realizează ca și cum toți parametrii trecuți ar fi un hash. Acest hash este
a trecut la o funcție C și conținutul său a revenit apoi înapoi la perl ca hash din nou.
Conținutul hash poate fi modificat în cadrul funcției C.

Această declarație este utilizată intens în constructori, care cod perl este tipic

sub init
{
my %ret = shift-> SUPER::init( @_);
...
returnează %ret;
}

iar codul C este de obicei

void Obj_init (profil HV *) {
init(profil) moștenit;
... [ modifica conținutul profilului ] ...
}

Aplicate
Metodele sunt funcții numite într-un context al unui obiect. Practic toate metodele trebuie
au acces la un obiect cu care au de-a face. Obiectele prima sunt vizibile în C ca
Gestionați tipul de date. Un astfel de mâner este de fapt un pointer către o instanță de obiect, care la rândul său
conține un pointer către tabelul de metode virtuale obiect (VMT). Pentru a facilita un OO-like
sintaxă, acest parametru Handle nu este aproape niciodată menționat în toate metodele unui obiect
descriere într-un fișier cls, deși este implicit numărat, deci fiecare metodă cls
declaraţie

metoda void a( int x)

pentru o clasă de obiecte Obiectul este reflectat în C ca

void Object_a( Handle self, int x)

declarație de funcție. Spre deosebire de funcțiile pachetului, acel gencls nu poate publica dacă
nu poate face față parametrilor nesuportați pe neconvertibili, există o modalitate de a
emite o astfel de declarație cu o metodă. Utilizarea principală pentru aceasta este numele metodei gets
rezervat în VMT-ul obiectului.

Metodele sunt accesibile în codul C prin dereferențiarea directă a numelui unui „Handle self” ca un
structura corespunzătoare:

((( PSampleObject) self)-> self)-> sample_method( self, ...);

O metodă poate avea unul dintre cele șase prefixe care guvernează generarea codului C:

metodă
Acesta este primul și cel mai elementar tip de metodă. Este numele prefixului, „metoda” este
prin urmare, a fost ales drept cel mai descriptiv nume. Se așteaptă ca metodele să fie codificate
C, mânerul obiectului este implicit și nu este inclus într-o descriere .cls.

metoda void a()

rezultă în

void Object_a( Manevrează-te pe sine)

Declarație C. O metodă publicată își convertește automat parametrii și un rezultat
între C și perl.

public
Când metodele care au parametri și/sau rezultat care nu poate fi automat
convertite între C și perl trebuie declarate, sau declarația funcției nu
se încadrează în sintaxa C, se folosește un prefix „public”. Metodele declarate cu „public” este
se așteaptă să comunice cu perl prin intermediul interfeței XS (vezi perlxs). Este, de asemenea
de așteptat ca o metodă „publică” să creeze atât funcții REDEFINIT, cât și funcții FROMPERL (vezi
Prima::interne pentru detalii). Exemplele sunt multe în Prima sursă și vor
să nu fie afișat aici. metodele „publice” au de obicei rezultat nul și nu au parametri, dar
asta nu contează prea mult, deoarece gencls nu produce nicio conversie pentru astfel de metode.

import
Pentru metodele care sunt nerezonabile de codat în C, dar în schimb în perl, gencls poate fi
s-a spus să producă ambalajele corespunzătoare folosind prefixul „import”. Acest tip de a
metoda poate fi văzută ca „metodă” din interior spre exterior. Funcția „import” nu are nevoie de un C
omologul, cu excepția codului generat automat.

static
Dacă o metodă trebuie să poată funcționa atât cu cât și fără o instanță de obiect, este nevoie
să fie prefixat cu prefix „static”. Metodele „statice” sunt toate la fel cu cele „metode”,
cu excepția faptului că primul parametru „Handle self” nu este declarat implicit. Dacă un „static”
metoda este apelată fără obiect (dar cu o clasă), ca

Class::Object-> static_method();

primul său parametru nu este un obiect, ci un șir „Class::Object”. Dacă o metodă niciodată
se ocupă de un obiect, este suficient să folosiți declarația acestuia ca

static a( char * className = "");

dar dacă are, a

static a( SV * class_or_object = nil);

este nevoie de declarație. În ultimul caz, codul C însuși trebuie să determine ce anume are
a fost trecut, dacă vreodată. Rețineți aici parametrul implicit: o metodă „statică” este de obicei
lizibil pentru a apela ca

Class::Object::static_method();

unde nu i se trec parametri. Fără parametrul implicit un astfel de apel
generează o eroare de rulare „parametri insuficienti trecuți”.

ciudat
Nu am putut găsi un nume mai bun pentru el. prefixul „ciudat” denotă o metodă care a combinat
proprietăți atât de la „static” cât și de la „public”. Cu alte cuvinte, gencls generează nr
codul de conversie și nu se așteaptă să nu se „Manageze singur” ca prim parametru pentru o astfel de metodă.
Ca exemplu, poate fi descrisă Prima::Imagine::încărcare, care poate fi numită folosind un larg
spectrul semanticii de apelare (a se vedea Prima::image-load pentru detalii).

c_doar
După cum spune și numele, „c_only” este o metodă care este prezentă pe un VMT, dar nu este
accesibil din perl. Poate fi supraîncărcat numai din C. Mai mult, este permis
înregistrați o funcție perl cu numele unei metode „c_only” și totuși aceste entități
vor fi complet independente unul de celălalt - supraîncărcarea nu va avea loc.

NB: metode care au rezultate și/sau parametri care nu pot fi convertite
automat, schimbați prefixul lor în „c_only”. Probabil că acesta este un comportament greșit,
și o astfel de condiție trebuie să semnaleze o eroare.

Proprietăţi
Setul de instrumente Prima introduce o entitate numită proprietate, care se așteaptă să înlocuiască metoda
perechi a căror funcție este de a achiziționa și atribui o variabilă obiect internă, de exemplu,
un nume de obiect, culoare etc. În loc să aibă o pereche de metode precum Object::set_color și
Object::get_color, este concepută o proprietate Object::color. O proprietate este o metodă cu
considerații speciale, în special, atunci când este apelat fără parametri, un mod „get”.
este subînțeles. Dimpotrivă, dacă este apelat cu un singur parametru, se declanșează un mod „set”.
Rețineți că atât la invocațiile „set” cât și la „get” „Handle self” este primul parametru implicit
mereu prezent.

Proprietățile pot funcționa cu o cantitate diferită, dar fixă ​​de parametri și poate efectua un „set”
și funcțiile „obține” doar pentru una. În mod implicit, singurul parametru este implicit „Handle
de sine":

proprietate char * nume

are omologul C

char * nume_obiect (Handle self, Bool set, char * name)

În funcție de mod, „Bool set” este fie „adevărat”, fie „fals”. În modul „set” un cod C
rezultatul este eliminat, în modul „get” valoarea parametrului este nedefinită.

Sintaxa pentru proprietatea multi-parametru este

proprietate long pixel( int x, int y);

și codul C

Long Object_pixel( Handle self, Bool set, int x, int y, long pixel)

Rețineți că în cazul cu mai mulți parametri parametrii declarați după numele proprietății sunt
întotdeauna inițializat, în ambele moduri „set” și „get”.

instanță variabile
Fiecare obiect este caracterizat de starea sa internă unică. Sintaxa Gencls permite a
declarație de variabile, pentru variabilele care sunt alocate pentru fiecare instanță de obiect. Cu toate că
Validarea tipului de date nu se efectuează pentru variabile, iar declarațiile lor doar primesc
copiate „ca atare”, declarațiile complexe C care implică indicatori de matrice, structuri și funcție sunt
nerecunoscut. Ca o soluție, sunt utilizați pointeri către entități definite de tip. Exemplu:

obiect SampleObject {
intx;
Lista lista;
struct { int x } s; # declarație ilegală
}

Variabilele sunt accesibile în codul C prin dereferențiarea directă a numelui unui „Handle self” ca a
structura corespunzătoare:

(( PSampleObject) self)-> x;

AUTORI


Dmitri Karasik,[e-mail protejat]>. Anton Berezin,[e-mail protejat]>.

Utilizați prima-gencls online folosind serviciile onworks.net


Servere și stații de lucru gratuite

Descărcați aplicații Windows și Linux

Comenzi Linux

Ad