Алијас (рачунарство)
У рачунарству, алијас описује ситуацију у којој се локацији података у рачунарској меморији може приступити преко различитих симболичких имена у програму. Тако, модификовање података путем једног имена имплицитно мења вредности у вези са свим алијас именима. Као резултат тога, алијас се чини посебно тешким за разумевање, анализирање и оптимизацију програма. Анализатори алијаса који се баве алијасом намеравају да израчунају и корисне информације за разумевање алијаса у програмима.
Примери
уредиПровера граница низа
уредиНа пример, C (програмски језик) (чита се: "це" - C је латинично слово) не обавља проверу граница низа. Тада може да се искористи спровођење програмског језика од стране компајлера и конвенција компјутерског језика како би се постигао ефекат алијаса.
Ако се низ креира на стек, са променљивом изложеном у меморији директно поред тог низа, онда може да се индексира изван низа и директно промени променљиву променом релевантног елемента низа. На пример, ако имамо низ целих бројева величине 2(назовимо га arr), поред друге целобројне променљиве (зовимо је i), онда arr[2] (то је трећи елемент низа) биће алијас од i ако су суседни у меморији.
#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)));
}
То је могуће у неким имплементацијама С програмског језика (чита се: "це" - C је латинично слово) , јер низ је блок целовите меморије, а елементи низа су само референце поравнања са адресе почетка тог блока помноженог величином једног елемента. Пошто, С програмски језик (чита се: "це" - C је латинично слово)нема проверу граница, индексирање и адресирање изван низа је могуће. Имајте на уму да је поменуто понашање алијаса недефинисано понашање. Неке имплементације могу оставити простор између низова и променљивих на стек, на пример, да се ускладе променљиве на меморијским локацијама које су вишеструке архитектуре на матерњим величинама речи компјутерске архитектуре . С (чита се: "це" - C је латинично слово) стандард не прецизира како су генерално подаци изложени у меморији. (ISO/IEC 9899:1999, section 6.2.6.1).
Није погрешно да компајлер изостави алијас ефекат за приступе који спадају ван граница низа.
Показивач алијаса
уредиЈош један низ алијаса се може јавити у било ком језику који се односи на једну локацију у меморији са више од једног имена ( на пример показивачи). Видите С пример xor swap алгоритма који је функција; претпоставља да се два показивача која су прошла, разликују, али ако су у ствари једнаки (или алијаси међусобно), функција не ради. Ово је заједнички проблем са функцијама које прихватају показивач аргумената, а њихова толеранција (или недостатак истог) за алијас мора бити пажљиво документована, посебно за функције које обављају сложене манипулације на меморијској области на њима.
Одређени алијас
уредиКонтролисано алијас понашање може бити пожељно у неким случајевима (а то је, алијас понашање које је наведено, за разлику омогућеног распореда меморије у С програмском језику). То је уобичајена пракса у Фортрану.Перл програмски језик прецизира, у неким конструкцијама, алијас понашање, као што је у петљи за сваког. Ово омогућава да се одређене структуре података мењају директно са мање кода. На пример:
my @array = (1, 2, 3);
foreach my $element (@array) {
# Повећање $element, према томе аутоматски
# додаје @array, зато што $element је ''алијас''
# за сваки @array елемент у заузврат.
$element++;
}
print "@array \n";
ће одштампати "2 3 4" као резултат. Ако неко жели да заобиђе алијас ефекат, онда би се могао копирати садржај индекса променљиве у другу и промениће копију.
Сукоб са оптимизацијом
уредиОптимајзери често морају да праве конзервативне претпоставке о варијаблама у присуству показивача. На пример, знајући вредност променљиве (као што x
је 5) обично дозвољава одређене оптимизације (као што је константно простирање. Међутим, преводилац не може да користи ове информације након задатка на другој променљивој (на пример, у С програмском језику *y = 10
), јер може бити да је *y
алијас од x
. Ово би могао бити случај након задатка као y = &x
. Као ефекат овог задатка у *y
вредност х би се променила, тако да би пропагирање информације да x
је 5 пратећи са *y = 10
било погрешно (ако је *y
заиста алијас од x
). Међутим, ако имамо информације о показивачима, онда је стални процес простирања могао да буде упит као што је: да ли x
може бити алијас од *y
? Затим, ако је одговор не,x = 5
може да се пропагира.
Друга оптимизација под утицајем алијаса је поновљени код. Ако компајлер одлучи да x
није алијас од *y
, онда код који користи или мења вредност x
може да се мења пре задатка *y = 10
, уколико би побољшали распоред или омогућили више петљи оптимизације да се изврше.
Да би се омогућиле такве оптимизације на предвидив начин,ИСО стандард за С програмски језик (укључујући новије С99 издање) прецизира да је то илегално (са неким изузецима) за показиваче различитих типова да се односе на исту локацију меморије. Ово правило, познато као стриктно алијас правило некад дозвољава импресивна повећања у перформанси,[1] али је познато да руши друге валидне кодове. Неколико софтверских пројеката намерно крше овај део C99 стандарда. На пример, Python 2.x је радио то да би спровео референтно рачунање,[2] и захтевао је промене у основним објектима у Python 3 како би омогућио ову оптимизацију. Линукс ради ово зато што стриктни алијас прави проблеме са оптимизацијом ванлинијског кода.[3] У оваквим случајевима када се компајлује са ГНУ колекцијом компајлера , опција -fno-strict-aliasing
се позива како би спречила нежељене оптимизације које би дале неочекивани код.
Алијас хардвера
уредиПојам алијас се такође користи да опише ситуације где, услед иѕбора дизајна хардвера или грешке хардвера, једна или више слободних адреса битова се не користи у процесу селекције меморије.[4] Ово би могла бити одлука дизајна ако постоји више адреса битова слободних него што је неопходно како би пружили подршку инсталираној меморији уређаја. У недостатку, један или више адреса битова би могла бити скраћена заједно или би морала бити приморана да се скрати до краја(logic 0) или да снабдева волтажу (logic 1).
Пример: За овај пример, претпостаљамо дизајн меморије са 8 локација, које захтевају само 3 адресе линија (или битова пошто је 23=8). Адресе битова (назване А2 до А0) су декодиране да одаберу јединствене локације меморије као што следи, у стандардном бинарном бројачу:
A2 | A1 | A0 | Локација меморије |
---|---|---|---|
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 |
У табели изнад, свака од 8 јединствених комбинација адреса битова одабира различиту локацију у меморији. Међутим, ако једна адреса бита (А2) мора бити скраћена до краја, табела би била промењена као у приложеном наставку:
A2 | A1 | A0 | Локација меморије |
---|---|---|---|
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 |
У овом случају, када је А2 једнако 0, прве четири локације у меморији су дуплиране и појављују се поново као и последњих четири. Локације у меморији од 4 до 7 су постале недоступне.
Ако се ова промена деси другој адреси бита, резултат декодирања ће бити другачији, али ће ефекат генерално бити исти: губитак једне адрсе бита одсеца доступну меморију у половини, са резултирајућим дупликацијама (алијас) од преосталог простора.
Види још
уреди- Алијас за употребу речи када се примењује на обраду сигнала, укључујући и компјутерску графику
- Показивач алијаса
Референце
уреди- ^ Acton, Mike (01. 06. 2006). „Understanding Strict Aliasing”. Архивирано из оригинала 08. 05. 2013. г. Приступљено 27. 10. 2015.
- ^ Schemenauer, Neil (17. 07. 2003). „ANSI strict aliasing and Python”.
- ^ Torvalds, Linus (26. 02. 2003). „Re: Invalid compilation without -fno-strict-aliasing”. Архивирано из оригинала 24. 01. 2016. г. Приступљено 28. 11. 2015.
- ^ Barr, Michael (27. 07. 2012). „Software Based Memory Testing”.
Спољашње везе
уреди- Understanding Strict Aliasing Архивирано на сајту Wayback Machine (8. мај 2013) – чланак Мајк Актона
- Aliasing, pointer casts and gcc 3.3 – информациони чланак на NetBSD поштанској листи
- Type-based alias analysis in C++ - информациони чланак на алијас базираним анализама у C++
- Understand C/C++ Strict Aliasing – чланак о стриктном алијасу пореклом од стране програмера Википедије