Inovatii în Object Pascal

Ar fi fost de asteptat ca trecerea la 32 biti să fie mai disruptivă în sintaxa Object Pascal decît a fost migrarea de la Turbo Pascal la Delphi. Din fericire, proiectantii lui au anticipat acest pas si au conceput de la bun început noul model obiectual compatibil COM, iar modificările care urmează sînt mai degrabă ajustări la noile posibilităti pe 32 biti.

Delphi 2 introduce noile tipuri ANSIChar - caracter standard pe 8 biti echivalent cu Char din versiunile precedente de Pascal si WideChar - caracter Unicode pe 16 biti. În setul Unicode, primele 255 de numere sînt rezervate pentru setul ANSI. Char este echivalent cu ANSIChar.

O directivă nouă de compilare, $H, determină semnificatia cuvîntului rezervat string. În starea implicită, $H+, string este echivalent cu AnsiString - tipul nou de "string lung" de dimensiune practic nelimitată, în care fiecare element este de tip AnsiChar. Toate obiectele din VCL folosesc exclusiv string-uri lungi. În starea $H- cuvîntul string semnifică ShortString, echivalent cu string-ul clasic, cu dimensiune maximă de 255 caractere.

String-urile lungi sînt alocate dinamic si întretinerea lor se face automat de către compilator fără cod suplimentar din partea programatorului. String-ul lung este alocat si dealocat pe baza unui numărător de referinte de către un algoritm tipic de garbage-collection. Ori de cîte ori i se atribuie o valoare nouă, numărătorul valorii precedente se decrementează în timp ce numărătorul valorii curente se incrementează. Cînd numărătorul atinge valoarea zero, blocul de memorie care contine valoarea respectivă este automat dealocat. Acest sistem reduce semnificativ durata operatiunilor de copiere de string-uri, respectiv consumul de memorie. O operatiune de asignare între două string-uri se reduce la copierea unui pointer de 32 biti la blocul corespunzător de memorie simultan cu incrementarea numărătorului asociat. Un număr mare de string-uri pot referi aceeasi valoare fără consum suplimentar de memorie. Numărătorul este automat decrementat si atunci cînd un string local iese din scopul unei proceduri sau functii.

Ca urmare a alocării dinamice a string-urilor lungi apar o serie de noutăti fată de operatiunile cu string-uri clasice Astfel, referintele la un caracter din string trebuie făcute numai după atribuirea unei valori sau declararea unei lungimi pentru variabila string. Anterior acestui moment string-ul lung nu are memorie alocată, deci nu există. String-urile lungi sînt garantate a se termina în zero, deci sînt compatibile în asignare cu string-urile clasice terminate în zero (PChar) si se pot interschimba cu acestea prin simplu typecasting.

Tipurile generice Integer si Cardinal si-au schimbat dimensiunea de la 2 la 4 bytes si domeniul de valori s-a extins corespunzător. Calculele pe întregi se efectuează pe 32 biti, fără depăsirile care apăreau în expresiile similare pe 16 biti si, pe care programele uneori se bazau. De altfel, toate structurile de date sînt aliniate acum implicit la 32 biti, iar functia SizeOf returnează valori multipli de 4.

O ciudătenie impusă de cerintele de flexibilitate în lucrul cu server-e OLE cu parametri al căror tip nu este cunoscut la compilare, este noul tip Variant. O variabilă declarată astfel este o structura pe 16 biti care contine si informatie de tip, putînd stoca un string, un întreg sau o valoare reală în virgulă mobilă. Cînd tipul variantului este necompatibil cu tipul necesar efectuării operatiunii, variantul îsi va schimba automat valoarea într-o valoare de tip compatibil, dacă este posibil; în caz contrar este invocată o exceptie.

Tipul Currency este un nou venit între realii în virgulă mobilă, conceput pentru reprezentarea exactă a valorilor monetare mari, fără erori de rotunjire. Reprezentarea se face ca un întreg pe 64 biti cu cei mai putin semnificativi 4 digiti stocînd 4 cifre zecimale. Cînd sînt amestecate cu alte tipuri reale în asignări si expresii, valorile din currency sînt automat scalate prîn împărtire sau înmultire cu 10000.

Singura inovatie de sintaxă o reprezintă sectiunea optională de finalizare dintr-o unitate. Aceasta se declară prin cuvîntul rezervat finalization obligatoriu după o sectiune de initializare declarată prin initialization. Codurile de finalizare se execută la încheierea executiei în ordine inversă declarării unitătilor corespunzătoare în clauza uses. Executarea, chiar si partială a codului de initializare al unei unităti garantează că si codul de finalizare corespunzător va fi executat la închiderea aplicatiei.


(C) Copyright Computer Press Agora