У програмуванні, псевдоніми представляють собою ситуацію (aliasing), при якій посилання на місце розташування даних в пам'яті, може здійснюватись за допомогою декількох символічних імен в програмі. Таким чином, модифікація даних за допомогою одного імені, призводить до модифікації значення, яке асоціюється з іншими іменами-аліасами, що може бути не очікуваним для програміста. В результаті, наявність псевдонімів призводить до ситуацій, які важко зрозуміти, аналізувати і оптимізувати. Аналізатори псевдонімів, мають на меті забезпечити аналіз з видачею корисної інформації для відстеження псевдонімів у програмі.
Приклади
Перевірка виходу за межі масиву
Наприклад, мова програмування C не виконує перевірки виходу за межі масиву. Скориставшись особливостями реалізації мови програмування за допомогою компілятора і його особливостями утворення асемблерного коду на даній архітектурі, можна досягти не явного ефекту псевдонімів.
Якщо масив був створений у стековій пам'яті, разом із змінною, яка розташовується у пам'яті одразу після масиву, можна змінюючи масив, вийти за його межі і безпосередньо змінити значення цієї змінної, при доступі ніби до елементу масиву. Наприклад, якщо в нас є масив arr з двома елементами типу int, далі за ним оголошена інша змінна (назвімо її i), тоді arr[2] (тобто третій елемент масиву), буде вказувати на i, тобто стати його псевдонімом, якщо вони знаходяться один за одним у пам'яті.
#include <stdio.h> int main() { int arr[2] = { 1, 2 }; int i=10; /* arr[2] -- псевдонім для i */ 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, через псевдування /* Розмір масиву досі дорівноє 2. */ printf("arr size: %d \n", (sizeof(arr) / sizeof(int))); }
Таке можливо в деяких реалізаціях мови C, оскільки масиви займають послідовний блок пам'яті, а елементи масиву зазвичай знаходяться за допомогою зсуву адреси на фіксовану кількість байт відповідно до порядкового номера елементу, від початку масиву. Оскільки C не перевіряє межі масиву, можлива індексація і адресація за межі масиву. Відмітимо, що згадана поведінка наявності псевдонімів, є невизначеною. Деякі компілятори можуть залишити простір між масивом і змінними в стеку, наприклад, для того щоб вирівняти адреси змінних в комірках пам'яті, так щоб вони були кратні word. Стандарт не визначає як повинні розміщатися дані в пам'яті.
Псевдоніми — вказівники
Інша варіація псевдонімів може трапитись в будь-якій мові програмування, в якій можливо зіслатися на адресу у пам'яті за допомогою більше ніж одного імені (наприклад, за допомогою вказівників).
Використання
Контрольоване використання псевдонімів може бути іноді бажаним. Це звична практика у мові програмування Fortran. Мова програмування Perl визначає, в деяких своїх конструкціях, використання псевдонімів, наприклад в циклах foreach. Це дозволяє модифікувати конкретні структури даних пишучи більш оптимальний код. Наприклад:
my @array = (1, 2, 3); foreach my $element (@array) { # Increment $element, thus automatically # modifying @array, since $element is ''aliased'' # to each of @array's elements in turn. $element++; } print "@array \n";
Виведе на екран результат: «2 3 4». Якщо програміст хоче уникнути утворення псевдонімів, він може створити копію вмісту змінної і змінити значення для копії.
Конфлікти при оптимізації
Оптимізаторам доводиться робити спрощення коду, відповідно змінних, які представлені вказівниками. Наприклад, знаючи точне значення змінної (наприклад, що x = 5), зазвичай дозволяє оптимізувати її підставивши замість неї константу. Але компілятор не може використовувати подібну інформацію після того, як відбулося присвоєння значення іншій змінній (наприклад, *y = 10), оскільки ймовірно, що *y є аліасом x. Це може трапитись, якщо змінній присвоїли адресу змінної x таким чином: y = &x. В результаті присвоєння значення для *y, значення x також зміниться, отже вважати дійсною інформацію, що x = 5 для виразів, що знаходяться після *y = 10 буде потенційно не вірним. Але, якщо ми маємо інформацію щодо вказівників, при оптимізації можна перевірити чи дійсно x і *y є псевдонімами. У разі якщо ні, x можна замінювати константами і далі по коду, без помилок.
Інша проблема оптимізації при наявності псевдонімів це зміна порядку коду. Якщо компілятор вирішує, що x не є псевдонімом *y, тоді код, який вносить зміни або використовує значення змінної x, можна перемістити перед операцією *y = 10, якщо це необхідно для поліпшення планування, або зробити можливими додаткові цикли оптимізації.
Для того щоб зробити таку оптимізацію більш передбаченою, починаючи зі стандарту мови C (версія C99) визначає деякі додаткові правила і обмеження щодо вказівників. Це правило називається (strict aliasing rule), який іноді дозволяє добитися вражаючого збільшення ефективності програми, але при порушенні цього правила може призвести до поламки працездатного коду. При компіляції програми за допомогою компілятору gcc, можна задати додаткову опцію -fno-strict-aliasing, яка виключає небажану оптимізацію, яка може призвести до непередбачуваної поведінки.
Посилання
- Understanding Strict Aliasing — Mike Acton
- Aliasing, pointer casts and gcc 3.3 — Informational article on NetBSD mailing list
- Type-based alias analysis in C++ — Informational article on type-based alias analysis in C++
- Understand C/C++ Strict Aliasing — Article on strict aliasing originally from the boost developer's wiki
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U programuvanni psevdonimi predstavlyayut soboyu situaciyu aliasing pri yakij posilannya na misce roztashuvannya danih v pam yati mozhe zdijsnyuvatis za dopomogoyu dekilkoh simvolichnih imen v programi Takim chinom modifikaciya danih za dopomogoyu odnogo imeni prizvodit do modifikaciyi znachennya yake asociyuyetsya z inshimi imenami aliasami sho mozhe buti ne ochikuvanim dlya programista V rezultati nayavnist psevdonimiv prizvodit do situacij yaki vazhko zrozumiti analizuvati i optimizuvati Analizatori psevdonimiv mayut na meti zabezpechiti analiz z vidacheyu korisnoyi informaciyi dlya vidstezhennya psevdonimiv u programi PrikladiPerevirka vihodu za mezhi masivu Napriklad mova programuvannya C ne vikonuye perevirki vihodu za mezhi masivu Skoristavshis osoblivostyami realizaciyi movi programuvannya za dopomogoyu kompilyatora i jogo osoblivostyami utvorennya asemblernogo kodu na danij arhitekturi mozhna dosyagti ne yavnogo efektu psevdonimiv Yaksho masiv buv stvorenij u stekovij pam yati razom iz zminnoyu yaka roztashovuyetsya u pam yati odrazu pislya masivu mozhna zminyuyuchi masiv vijti za jogo mezhi i bezposeredno zminiti znachennya ciyeyi zminnoyi pri dostupi nibi do elementu masivu Napriklad yaksho v nas ye masiv arr z dvoma elementami tipu int dali za nim ogoloshena insha zminna nazvimo yiyi i todi arr 2 tobto tretij element masivu bude vkazuvati na i tobto stati jogo psevdonimom yaksho voni znahodyatsya odin za odnim u pam yati include lt stdio h gt int main int arr 2 1 2 int i 10 arr 2 psevdonim dlya i arr 2 20 printf element 0 d t arr 0 vivodit na ekran 1 printf element 1 d t arr 1 vivodit na ekran 2 printf element 2 d t arr 2 vivodit na ekran 20 printf i d t t i takozh vivede na ekran 20 a ne 10 cherez psevduvannya Rozmir masivu dosi dorivnoye 2 printf arr size d n sizeof arr sizeof int Take mozhlivo v deyakih realizaciyah movi C oskilki masivi zajmayut poslidovnij blok pam yati a elementi masivu zazvichaj znahodyatsya za dopomogoyu zsuvu adresi na fiksovanu kilkist bajt vidpovidno do poryadkovogo nomera elementu vid pochatku masivu Oskilki C ne pereviryaye mezhi masivu mozhliva indeksaciya i adresaciya za mezhi masivu Vidmitimo sho zgadana povedinka nayavnosti psevdonimiv ye neviznachenoyu Deyaki kompilyatori mozhut zalishiti prostir mizh masivom i zminnimi v steku napriklad dlya togo shob virivnyati adresi zminnih v komirkah pam yati tak shob voni buli kratni word Standart ne viznachaye yak povinni rozmishatisya dani v pam yati Psevdonimi vkazivniki Insha variaciya psevdonimiv mozhe trapitis v bud yakij movi programuvannya v yakij mozhlivo zislatisya na adresu u pam yati za dopomogoyu bilshe nizh odnogo imeni napriklad za dopomogoyu vkazivnikiv VikoristannyaKontrolovane vikoristannya psevdonimiv mozhe buti inodi bazhanim Ce zvichna praktika u movi programuvannya Fortran Mova programuvannya Perl viznachaye v deyakih svoyih konstrukciyah vikoristannya psevdonimiv napriklad v ciklah foreach Ce dozvolyaye modifikuvati konkretni strukturi danih pishuchi bilsh optimalnij kod Napriklad my array 1 2 3 foreach my element array Increment element thus automatically modifying array since element is aliased to each of array s elements in turn element print array n Vivede na ekran rezultat 2 3 4 Yaksho programist hoche uniknuti utvorennya psevdonimiv vin mozhe stvoriti kopiyu vmistu zminnoyi i zminiti znachennya dlya kopiyi Konflikti pri optimizaciyiOptimizatoram dovoditsya robiti sproshennya kodu vidpovidno zminnih yaki predstavleni vkazivnikami Napriklad znayuchi tochne znachennya zminnoyi napriklad sho x 5 zazvichaj dozvolyaye optimizuvati yiyi pidstavivshi zamist neyi konstantu Ale kompilyator ne mozhe vikoristovuvati podibnu informaciyu pislya togo yak vidbulosya prisvoyennya znachennya inshij zminnij napriklad y 10 oskilki jmovirno sho y ye aliasom x Ce mozhe trapitis yaksho zminnij prisvoyili adresu zminnoyi x takim chinom y amp x V rezultati prisvoyennya znachennya dlya y znachennya x takozh zminitsya otzhe vvazhati dijsnoyu informaciyu sho x 5 dlya viraziv sho znahodyatsya pislya y 10 bude potencijno ne virnim Ale yaksho mi mayemo informaciyu shodo vkazivnikiv pri optimizaciyi mozhna pereviriti chi dijsno x i y ye psevdonimami U razi yaksho ni x mozhna zaminyuvati konstantami i dali po kodu bez pomilok Insha problema optimizaciyi pri nayavnosti psevdonimiv ce zmina poryadku kodu Yaksho kompilyator virishuye sho x ne ye psevdonimom y todi kod yakij vnosit zmini abo vikoristovuye znachennya zminnoyi x mozhna peremistiti pered operaciyeyu y 10 yaksho ce neobhidno dlya polipshennya planuvannya abo zrobiti mozhlivimi dodatkovi cikli optimizaciyi Dlya togo shob zrobiti taku optimizaciyu bilsh peredbachenoyu pochinayuchi zi standartu movi C versiya C99 viznachaye deyaki dodatkovi pravila i obmezhennya shodo vkazivnikiv Ce pravilo nazivayetsya strict aliasing rule yakij inodi dozvolyaye dobitisya vrazhayuchogo zbilshennya efektivnosti programi ale pri porushenni cogo pravila mozhe prizvesti do polamki pracezdatnogo kodu Pri kompilyaciyi programi za dopomogoyu kompilyatoru gcc mozhna zadati dodatkovu opciyu fno strict aliasing yaka viklyuchaye nebazhanu optimizaciyu yaka mozhe prizvesti do neperedbachuvanoyi povedinki PosilannyaUnderstanding Strict Aliasing Mike Acton Aliasing pointer casts and gcc 3 3 Informational article on NetBSD mailing list Type based alias analysis in C Informational article on type based alias analysis in C Understand C C Strict Aliasing Article on strict aliasing originally from the boost developer s wiki