Alijas (računarstvo)

S Vikipedije, slobodne enciklopedije

U računarstvu, alijas opisuje situaciju u kojoj se lokaciji podataka u računarskoj memoriji može pristupiti preko različitih simboličkih imena u programu. Tako, modifikovanje podataka putem jednog imena implicitno menja vrednosti u vezi sa svim alijas imenima. Kao rezultat toga, alijas se čini posebno teškim za razumevanje, analiziranje i optimizaciju programa. Analizatori alijasa koji se bave alijasom nameravaju da izračunaju i korisne informacije za razumevanje alijasa u programima.

Primeri[uredi | uredi izvor]

Provera granica niza[uredi | uredi izvor]

Na primer, C (programski jezik) (čita se: "ce" - C je latinično slovo) ne obavlja proveru granica niza. Tada može da se iskoristi sprovođenje programskog jezika od strane kompajlera i konvencija kompjuterskog jezika kako bi se postigao efekat alijasa.

Ako se niz kreira na stek, sa promenljivom izloženom u memoriji direktno pored tog niza, onda može da se indeksira izvan niza i direktno promeni promenljivu promenom relevantnog elementa niza. Na primer, ako imamo niz celih brojeva veličine 2(nazovimo ga arr), pored druge celobrojne promenljive (zovimo je i), onda arr[2] (to je treći element niza) biće alijas od i ako su susedni u memoriji.

#include <stdio.h>

int main()
{
	int arr[2] = { 1, 2 };
	int i=10;
 
	/* i постаје алијас од arr[2]. */
	arr[2] = 20;
 
	printf("element 0: %d \t", arr[0]); // излази 1
	printf("element 1: %d \t", arr[1]); // излази 2
	printf("element 2: %d \t", arr[2]); // излази 20
	printf("i: %d \t\t", i); // ће такође изаћи 20, не 10, због алијаса
	/* arr величина је још увек 2. */
	printf("arr величина: %d \n", (sizeof(arr) / sizeof(int)));
}

To je moguće u nekim implementacijama S programskog jezika (čita se: "ce" - C je latinično slovo) , jer niz je blok celovite memorije, a elementi niza su samo reference poravnanja sa adrese početka tog bloka pomnoženog veličinom jednog elementa. Pošto, S programski jezik (čita se: "ce" - C je latinično slovo)nema proveru granica, indeksiranje i adresiranje izvan niza je moguće. Imajte na umu da je pomenuto ponašanje alijasa nedefinisano ponašanje. Neke implementacije mogu ostaviti prostor između nizova i promenljivih na stek, na primer, da se usklade promenljive na memorijskim lokacijama koje su višestruke arhitekture na maternjim veličinama reči kompjuterske arhitekture . S (čita se: "ce" - C je latinično slovo) standard ne precizira kako su generalno podaci izloženi u memoriji. (ISO/IEC 9899:1999, section 6.2.6.1).

Nije pogrešno da kompajler izostavi alijas efekat za pristupe koji spadaju van granica niza.

Pokazivač alijasa[uredi | uredi izvor]

Još jedan niz alijasa se može javiti u bilo kom jeziku koji se odnosi na jednu lokaciju u memoriji sa više od jednog imena ( na primer pokazivači). Vidite S primer xor swap algoritma koji je funkcija; pretpostavlja da se dva pokazivača koja su prošla, razlikuju, ali ako su u stvari jednaki (ili alijasi međusobno), funkcija ne radi. Ovo je zajednički problem sa funkcijama koje prihvataju pokazivač argumenata, a njihova tolerancija (ili nedostatak istog) za alijas mora biti pažljivo dokumentovana, posebno za funkcije koje obavljaju složene manipulacije na memorijskoj oblasti na njima.

Određeni alijas[uredi | uredi izvor]

Kontrolisano alijas ponašanje može biti poželjno u nekim slučajevima (a to je, alijas ponašanje koje je navedeno, za razliku omogućenog rasporeda memorije u S programskom jeziku). To je uobičajena praksa u Fortranu.Perl programski jezik precizira, u nekim konstrukcijama, alijas ponašanje, kao što je u petlji za svakog. Ovo omogućava da se određene strukture podataka menjaju direktno sa manje koda. Na primer:

my @array = (1, 2, 3);

foreach my $element (@array) {
   # Повећање $element, према томе аутоматски
   # додаје @array, зато што $element је ''алијас''
   # за сваки @array елемент у заузврат.
   $element++;
}
 
 print "@array \n";

će odštampati "2 3 4" kao rezultat. Ako neko želi da zaobiđe alijas efekat, onda bi se mogao kopirati sadržaj indeksa promenljive u drugu i promeniće kopiju.

Sukob sa optimizacijom[uredi | uredi izvor]

Optimajzeri često moraju da prave konzervativne pretpostavke o varijablama u prisustvu pokazivača. Na primer, znajući vrednost promenljive (kao što x je 5) obično dozvoljava određene optimizacije (kao što je konstantno prostiranje. Međutim, prevodilac ne može da koristi ove informacije nakon zadatka na drugoj promenljivoj (na primer, u S programskom jeziku *y = 10), jer može biti da je *y alijas od x . Ovo bi mogao biti slučaj nakon zadatka kao y = &x. Kao efekat ovog zadatka u *y vrednost h bi se promenila, tako da bi propagiranje informacije da x je 5 prateći sa *y = 10 bilo pogrešno (ako je *y zaista alijas od x). Međutim, ako imamo informacije o pokazivačima, onda je stalni proces prostiranja mogao da bude upit kao što je: da li x može biti alijas od *y? Zatim, ako je odgovor ne,x = 5 može da se propagira.

Druga optimizacija pod uticajem alijasa je ponovljeni kod. Ako kompajler odluči da x nije alijas od *y , onda kod koji koristi ili menja vrednost x može da se menja pre zadatka *y = 10, ukoliko bi poboljšali raspored ili omogućili više petlji optimizacije da se izvrše.

Da bi se omogućile takve optimizacije na predvidiv način,ISO standard za S programski jezik (uključujući novije S99 izdanje) precizira da je to ilegalno (sa nekim izuzecima) za pokazivače različitih tipova da se odnose na istu lokaciju memorije. Ovo pravilo, poznato kao striktno alijas pravilo nekad dozvoljava impresivna povećanja u performansi,[1] ali je poznato da ruši druge validne kodove. Nekoliko softverskih projekata namerno krše ovaj deo C99 standarda. Na primer, Python 2.x je radio to da bi sproveo referentno računanje,[2] i zahtevao je promene u osnovnim objektima u Python 3 kako bi omogućio ovu optimizaciju. Linuks radi ovo zato što striktni alijas pravi probleme sa optimizacijom vanlinijskog koda.[3] U ovakvim slučajevima kada se kompajluje sa GNU kolekcijom kompajlera , opcija -fno-strict-aliasing se poziva kako bi sprečila neželjene optimizacije koje bi dale neočekivani kod.

Alijas hardvera[uredi | uredi izvor]

Pojam alijas se takođe koristi da opiše situacije gde, usled iѕbora dizajna hardvera ili greške hardvera, jedna ili više slobodnih adresa bitova se ne koristi u procesu selekcije memorije.[4] Ovo bi mogla biti odluka dizajna ako postoji više adresa bitova slobodnih nego što je neophodno kako bi pružili podršku instaliranoj memoriji uređaja. U nedostatku, jedan ili više adresa bitova bi mogla biti skraćena zajedno ili bi morala biti primorana da se skrati do kraja(logic 0) ili da snabdeva voltažu (logic 1).

Primer: Za ovaj primer, pretpostaljamo dizajn memorije sa 8 lokacija, koje zahtevaju samo 3 adrese linija (ili bitova pošto je 23=8). Adrese bitova (nazvane A2 do A0) su dekodirane da odaberu jedinstvene lokacije memorije kao što sledi, u standardnom binarnom brojaču:

A2 A1 A0 Lokacija memorije
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7

U tabeli iznad, svaka od 8 jedinstvenih kombinacija adresa bitova odabira različitu lokaciju u memoriji. Međutim, ako jedna adresa bita (A2) mora biti skraćena do kraja, tabela bi bila promenjena kao u priloženom nastavku:

A2 A1 A0 Lokacija memorije
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3

U ovom slučaju, kada je A2 jednako 0, prve četiri lokacije u memoriji su duplirane i pojavljuju se ponovo kao i poslednjih četiri. Lokacije u memoriji od 4 do 7 su postale nedostupne.

Ako se ova promena desi drugoj adresi bita, rezultat dekodiranja će biti drugačiji, ali će efekat generalno biti isti: gubitak jedne adrse bita odseca dostupnu memoriju u polovini, sa rezultirajućim duplikacijama (alijas) od preostalog prostora.

Vidi još[uredi | uredi izvor]

Reference[uredi | uredi izvor]

  1. ^ Acton, Mike (01. 06. 2006). „Understanding Strict Aliasing”. Arhivirano iz originala 08. 05. 2013. g. Pristupljeno 27. 10. 2015. 
  2. ^ Schemenauer, Neil (17. 07. 2003). „ANSI strict aliasing and Python”. 
  3. ^ Torvalds, Linus (26. 02. 2003). „Re: Invalid compilation without -fno-strict-aliasing”. 
  4. ^ Barr, Michael (27. 07. 2012). „Software Based Memory Testing”. 

Spoljašnje veze[uredi | uredi izvor]