В інформатиці, стек викликів (англ. call stack) це структура даних у вигляді стека, яка зберігає інформацію про активні підпрограми комп'ютерної програми. Такий тип стека також відомий під назвами стек виконання, стек управління або рантайм стек, часто скорочується до просто "стек". Хоча підтримка функціонування стека викликів дуже важлива для будь-якої програми, деталі роботи зі стеком зазвичай приховані під час роботи з високорівневими мовами програмування.
Стек викликів використовується для декількох пов'язаних цілей, але головне його призначення — відслідковувати точку повернення з кожної активної підпрограми, тобто адресу інструкції, куди має бути повернуте виконання після завершення підпрограми. (Активними підпрограмами вважаються такі, що були викликані, але ще не завершили виконання поверненням.) Якщо, наприклад, підпрограма DrawSquare
викликає підпрограму DrawLine
з чотирьох різних місць, тоді код DrawLine
має знати куди йому повертати виконання. Це зазвичай робиться кодом для кожного виклику підпрограми всередині DrawSquare
, він записує адресу інструкції, наступної після конкретного виклику (адреси повернення) на верхівку стека викликів. Алгоритм повторюється для кожного наступного вкладеного виклику. При поверненні з підпрограми, адреса повернення знімається зі стека і керування передається наступній інструкції у призупиненій підпрограмі.
Опис
У зв'язку з тим, що стек викликів влаштований як стек, підпрограма, що викликає, заштовхує адресу повернення на верхівку стека, а підпрограма яку викликають, після завершення своєї роботи, виштовхує адресу повернення зі стека і повертає керування інструкції за цією адресою. Якщо підпрограма, яку викликали, викликає іншу підпрограму або рекурсивно саму себе, тоді вона заштовхує наступну адресу повернення на верхівку стека, і т.д. Якщо розмір стека поглинає увесь виділений під стек простір, тоді виникає помилка переповнення стека, яка зазвичай призводить до краху програми. Додавання запису про підпрограму іноді називається намотування (англ. winding); відповідно, видалення запису - розмотування (англ. unwinding).
Зазвичай з програмою пов'язують лише один стек викликів (або більш точно, з кожною ниттю процесу), хоча додатковий стек може бути створений з метою обробки сигналів. Через таку унікальність даного поняття в конкретному контексті, можна вживати просто термін стек.
В високорівневих мовах програмування специфіка стека викликів зазвичай прихована від програміста, який оперує набором функцій, а не прямо пам'яттю стека. З іншого боку, більшість асемблерних мов залучають програміста до маніпулювання стеком. Подробиці маніпулювання стеком в певній мові програмування залежать від компілятора, операційної системи і доступного набору інструкцій.
Призначення стека викликів
Як зауважено вище, головним призначенням стека викликів є:
- Збереження адреси повернення – Коли підпрограма викликається, виникає потреба у збереженні місцезнаходження інструкції на яку має повернутися виконання. Використання саме стека для збереження цієї адреси має важливі переваги відносно інших способів. Одна з них полягає в тому, що кожне завдання має свій окремий стек викликів, таким чином підпрограма може бути повторновикористана різними завданнями (нитями). Іншою перевагою є автоматична підтримка рекурсії. Коли функція викликає себе рекурсивно, адреса повернення щоразу має бути збережена. Ця можливість автоматизується стеком.
Стек викликів може мати додаткові призначення, залежно від мови програмуання і архітектури комп'ютера. Серед них можуть бути:
- Локальне сховище даних – Підпрограма часто потребує пам'ять для збереження значень локальних змінних, змінних значення яких відомі тільки під час виконання підпрограми і не зберігаються по виході з неї. Часто буває зручно виділяти для таких змінних місце просто рухаючи верхівку стека достатньо, щоб забезпечити необхідний простір. Це дуже швидке рішення у порівнянні з розташуванням в купі. Зауважимо, що кожна окрема підпрограма має свій окремий простір у стеку для локальних змінних.
- Передача параметрів – Підпрогами часто вимагають від коду, що їх викликає параметри, і розташування значень цих параметрів у стеку не є незвичним рішенням. Якщо параметрів всього декілька і їхній розмір малий, тоді для передачі їх в підпрограму можна використати регістри процесора, але якщо розмір парамерів не дозволяє зужиткувати цей спосіб передачі, буде необхідний простір в пам'яті. Стек добре працює для передачі таких параметрів, особливо через те, що з кожним викликом наступної підпрограми значення параметрів змінюються, щоразу для них виділяється окреме місце.
- Стек обчислення – Операнди арифметичних або логічних операцій зазвичай розташовують в регістрах і тоді провадять над ними певні дій. Однак, в деяких ситуаціях операнди можуть накопичуватися до довільної глибини, тоді постає питання використання чогось відмінного від регістрів. Стек подібних операндів, скоріше схожий на RPN калькулятор, називається стеком обчислення, і може розташовуватися у стеку викликів.
- Вказівник на поточний об'єкт - Деякі об’єктозорієнтовані мови програмування (наприклад, ),при виклику функції зберігають разом з аргументами функції у стеку. Вказівник this вказує на об'єкт пов'язаний з методом, що викликається.
- Охоплювальне середовище підпрограми - Деякі мови (наприклад, Pascal та Ada) підтримують , які дозволять внутрішній підпрограмі мати доступ до даних охоплюючої підпрограми, тобто параметрів і змінних із власного середовища охоплюючої підпрограми. Таке статичне вкладення може повторюватися - функція об'явлена в функції об'ялевній в наступній функції... Реалізація має забезпечити спосіб у який функція на будь-якому статичному рівні вкладення могла б посилатися на дані з кожного рівня вкладеності охоплювального середовища. Зазвичай це здійснюється через використання вказівника на оточуючий кадр, він зветься (англ. downstack link) або (англ. static link), для того, щоб розрізняти з (англ. dynamic link), що посилається на того хто викликає (необов'язково статичного предка). Наприклад, мови які дозволяють підпрограмам викликати себе рекурсивно, з можливістю утворення в результаті багатьох кадрів виклику для внутрішньої підпрограми, але всі ці статичні посилання вказують на один і те саме середовище охоплюючої підпрограми. Замість статичних посилань, посилання на оточуючі статичні кадри можуть бути реалізовані у вигляді масиву вказівників.
- Інші стани повернення – Окрім адреси повернення, в деяких середовищах в яких присутні інші машинниі аьо програмні стани, що повинні бути відновлені після повернення з підпрограми. Це може бути рівень привілеїв, інформація стосовно обробки винятків, арифметичні режими і так далі. При потребі ці дані можуть бути збережені у стеку так само як і адреса повернення.
Зазвичай стек викликів використовується для адреси повернення, локальних параметрів і параметрів відомих як «кадр виклику». В різних середовищах різні обов'язки покладаються на стек викликів. В мові програмування Forth, наприклад, тільки адреса повернення і локальні змінні зберігаються у стеку викликів (тут він відомий як стек повернення); параметри зберігаються в окремому стеку даних.
Структура
Стек викликів складається з стекових кадрів (іноді активаційних записів). Це залежні від архітектури структури, що містять інформацію про стан підпрограми. Кожний стековий кадр відповідає підпрограмі, яка була викликана і ще не завершилась. Наприклад, якщо підпрогама DrawLine
зараз виконується і була викликана підпрограмою DrawSquare
, верхня частина стека має виглядати подібним чином:
Стековий кадр на горі стека відповідає поточній підпрограмі. В найзагальнішому варіанті стековий кадр включає:
- простір для локальних змінних підпрограми,
- адреси повернення і
- значення параметрів переданих в підпрограму.
Адреса верхівки стека міститься в регістрі, який називають вказівник стеку. Також доступ до пам'яті всередині кадру можна отримати через окремий регістр, часто згадуваний як вказівник кадру, зазвичай він вказує на фіксовану точку в структурі кадру, таку як розташування адреси повернення.
Стекові кадри мають різний розмір. Різні підпрограми мають різну кількість параметрів, тож ця частина може мати різний розмір для різних підпрограм. Насправді, деякі мови програмування підтримують динамічне виділення пам'яті для локальних змінних у стеку, в такому випадку розмір цієї частину кадру може змінюватись під час виконання підпрограми, і бути невідомим під час компілювання. В останньому випадку, доступ через вказівник кадру, швидший ніж через вказівник стеку, зазвичай необхідний через неможливість передбачити зміщення від верхівки стека до таких значень як адреса повернення.
В багатьох системах, вказівник кадру містить поле для збереження попереднього значення регістра вказівника кадру, тобто значення яке він мав під час виконання підпрограми, що викликала. Наприклад, на передуючий діаграмі, стековий кадр DrawLine
буде мати комірку пам'яті відведену під збереження значення вказівника кадру, котрий використовує DrawSquare
. Це значення зберігається на вході в підпрограму і відновлюється для повернення. Наявність такого поля в стековому фреймі дозволяє коду мати доступ до кожного кадру знизу поточної підпрограми.
мови програмування, які підтримують вкладені підпрограми в стековому кадрі мають поле, що містить вказівник на стековий фрейм охоплюючої підпрограми, яка й викликала цю внутрішню (вкладену) підпрограму. Це іноді називається дисплей. Цей вказівник забезпечує внутрішній підпрограмі можливість доступу, до локальних змінних і параметрів охоплюючої підпрограми з якої вона була викликана.
Для деяких цілей стекові кадри викликової та викликаної підпрограм можуть перетинатися. Перетин складається з пам'яті для параметрів. В деяких середовищах, викликова підпрограма заштовхує кожен з аргументів на верхівку стека, розширюючи таким чином свій стековий кадр, і потому робить виклик. В інших середовищах, викликова підпрограма заздалегідь отримує виділене місце на горі стекового кадра, для збереження аргументів, які вона передає викликаній підпрограмі. Це місце іноді називають ділянка вихідних аргументів або викликова ділянка. В цьому випадку, ромір такої ділянки обчислюється компілятором так, щоб забезпечити всі можливі виклики підпрограм.
Використання
Обробка місця виклику
Зазвичай найменші дії над стеком викликів потрібні саме в місці виклику підпрограми (і це є добре, бо може бути багато місць виклику кожної підпрограми). Значення актуальних аргументів обчислюються на місці виклику, через їх особливість для кожного виклику, і заштовхуються в стек або записуються в регістри, в залежності від угоди про виклики, що використовується. Потому виконується інструкція, наприклад BAL (перехід і зв'язування, англ. Branch and Link), для передачі керування коду цільової підпрограми.
Обробка в викликаній підпрограмі
В викликаній підпрограмі, перший виконаний код зазвичай зветься , він виконує необхідну господарську роботу перед початком роботи логічного коду підпрограми.
Код пролога зазвичай зберігає адресу повернення залишену інструкцією виклику в регістрі, заштовхуючи її в стек. Схожим чином, поточний вказівник стеку та/або вказівник кадра може бути збережений. Як варіант, деякі архітектури автоматично забезпечують подібну функціональність, і тоді код пролога не має виконувати ці операції.
Якщо використовується вказівник кадра, типовий вступ встановлює нове значення регістра вказівника стека з поточного значення цього вказівника. Простір для локальних змінних може бути виділений покроковою зміною адреси верхівки стека.
Мова програмування Forth дозволяє явне намотування стека викликів (це називається «стек повернення»).
Обробка повернень
Коли підпрограма готова повернути керування, вона виконує епілог який відкочує кроки пролога. Типово це відновлення значень регістрів (таких як значення вказівника кадра) зі стекового кадра, цілком виштовхує стековий кадр зміною значення вказівника стека, і насамкінець передає виконання інструкції за адресою повернення. В багатьох погодженнях викликів серед елементів виштовхнутих зі стека епілогом присутні початкові значення аргументів, в такому випадку викликова програма зазвичай не має необхідності маніпулювати стеком після повернення в неї. Однак, в деяких угодах про виклик це завдання покладається на викликову підпрограму.
Розмотування
Повернення з викликаної підпрограми виштовхне верхній кадр зі стека, можливо залишивши значення, яке повертає викликана підпрограма.
Деякі мови програмування, такі як Паскаль, дозволяють глобальні goto переходи для передачі керування назовні з вкладеної підпрограми і в попередньо викликану охоплюючу функцію. Така дія потребує розмотки стека через стільки кадрів, скільки необхідно, щоб відновити середовище зовнішньої підпрограми в якій знаходиться адреса інструкції повернення. Зазвичай таке використовують тільки для обробки помилок.
Інші мови, такі як Object Pascal, забезпечують обробку винятків, яка також потребує розмотування стека. Стековий кадр підпрограми може містити один або більше записів, що визначають обробку винятків. У випадку виникнення виняткової ситуації, стек розмотується доти, доки не буде знайдений обробник готовий прийняти (зловити) даний тип винятку. Common Lisp дозволяє проконтролювати, що відбудеться при розмотуванні стека через використання спеціального unwind-protect
оператора.
При застосуванні продовження, стек (логічно) розмотується і знов намотується зі стеком продовження.
Стек викликів і тестування програмного забезпечення
Нещодавно заявлений підхід використовує стек викликів в дуже відмінний спосіб від описаних. Він використовує його для зменшення набору тестів,. Коротко, зменшення набору тестів шукає можливості для зменшення кількості тестових прикладів в наборі тестів одночасно зберігаючі високий відсоток ефективності виявлення помилок. Два тестових приклади вважаються тотожними якщо вони утворюють однаковий набір стеків виклику під час виконання. По подробиці дивись .
Аналіз продуктивності
Перегляд стека виклику в довільний момент виконання програми може бути дуже корисним для покращення продуктивності програм. Якщо інструкція виклику підпрограми з'являться через певні проміжки часу, можливе покращення через видалення виликів. Дивись «Аналіз продуктивності» та «Глибинне вибирання».
Безпека
Змішування даних потоку керування впливаючих на виконання коду (адреса повернення, збережені вказівникі кадрів) і простих даних програми (параметри, значення до повернення, локальні змінні) у стеку викликів породжує ризики безпеки, можливість експлойтування через переповнення буферів.
Див. також
Примітки
- c2:AlternativeMicroprocessorDesign
- “Call Stack Coverage for GUI Test-Suite Reduction” by Scott McMaster and Atif M. Memon. In Proceedings of the 17th IEEE International Symposium on Software Reliability Engineering (ISSRE 2006), Nov. 2006.
- “Call-Stack Coverage for GUI Test-Suite Reduction” by Scott McMaster and Atif M. Memon. IEEE Trans. Softw. Eng., 2008, IEEE Press.
Зовнішні посилання
- Function Виклик і вказівник кадра в 68000 [ 24 липня 2010 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V informatici stek viklikiv angl call stack ce struktura danih u viglyadi steka yaka zberigaye informaciyu pro aktivni pidprogrami komp yuternoyi programi Takij tip steka takozh vidomij pid nazvami stek vikonannya stek upravlinnya abo rantajm stek chasto skorochuyetsya do prosto stek Hocha pidtrimka funkcionuvannya steka viklikiv duzhe vazhliva dlya bud yakoyi programi detali roboti zi stekom zazvichaj prihovani pid chas roboti z visokorivnevimi movami programuvannya Stek viklikiv vikoristovuyetsya dlya dekilkoh pov yazanih cilej ale golovne jogo priznachennya vidslidkovuvati tochku povernennya z kozhnoyi aktivnoyi pidprogrami tobto adresu instrukciyi kudi maye buti povernute vikonannya pislya zavershennya pidprogrami Aktivnimi pidprogramami vvazhayutsya taki sho buli viklikani ale she ne zavershili vikonannya povernennyam Yaksho napriklad pidprograma DrawSquare viklikaye pidprogramu DrawLine z chotiroh riznih misc todi kod DrawLine maye znati kudi jomu povertati vikonannya Ce zazvichaj robitsya kodom dlya kozhnogo vikliku pidprogrami vseredini DrawSquare vin zapisuye adresu instrukciyi nastupnoyi pislya konkretnogo vikliku adresi povernennya na verhivku steka viklikiv Algoritm povtoryuyetsya dlya kozhnogo nastupnogo vkladenogo vikliku Pri povernenni z pidprogrami adresa povernennya znimayetsya zi steka i keruvannya peredayetsya nastupnij instrukciyi u prizupinenij pidprogrami OpisU zv yazku z tim sho stek viklikiv vlashtovanij yak stek pidprograma sho viklikaye zashtovhuye adresu povernennya na verhivku steka a pidprograma yaku viklikayut pislya zavershennya svoyeyi roboti vishtovhuye adresu povernennya zi steka i povertaye keruvannya instrukciyi za ciyeyu adresoyu Yaksho pidprograma yaku viklikali viklikaye inshu pidprogramu abo rekursivno samu sebe todi vona zashtovhuye nastupnu adresu povernennya na verhivku steka i t d Yaksho rozmir steka poglinaye uves vidilenij pid stek prostir todi vinikaye pomilka perepovnennya steka yaka zazvichaj prizvodit do krahu programi Dodavannya zapisu pro pidprogramu inodi nazivayetsya namotuvannya angl winding vidpovidno vidalennya zapisu rozmotuvannya angl unwinding Zazvichaj z programoyu pov yazuyut lishe odin stek viklikiv abo bilsh tochno z kozhnoyu nittyu procesu hocha dodatkovij stek mozhe buti stvorenij z metoyu obrobki signaliv Cherez taku unikalnist danogo ponyattya v konkretnomu konteksti mozhna vzhivati prosto termin stek V visokorivnevih movah programuvannya specifika steka viklikiv zazvichaj prihovana vid programista yakij operuye naborom funkcij a ne pryamo pam yattyu steka Z inshogo boku bilshist asemblernih mov zaluchayut programista do manipulyuvannya stekom Podrobici manipulyuvannya stekom v pevnij movi programuvannya zalezhat vid kompilyatora operacijnoyi sistemi i dostupnogo naboru instrukcij Priznachennya steka viklikivYak zauvazheno vishe golovnim priznachennyam steka viklikiv ye Zberezhennya adresi povernennya Koli pidprograma viklikayetsya vinikaye potreba u zberezhenni misceznahodzhennya instrukciyi na yaku maye povernutisya vikonannya Vikoristannya same steka dlya zberezhennya ciyeyi adresi maye vazhlivi perevagi vidnosno inshih sposobiv Odna z nih polyagaye v tomu sho kozhne zavdannya maye svij okremij stek viklikiv takim chinom pidprograma mozhe buti povtornovikoristana riznimi zavdannyami nityami Inshoyu perevagoyu ye avtomatichna pidtrimka rekursiyi Koli funkciya viklikaye sebe rekursivno adresa povernennya shorazu maye buti zberezhena Cya mozhlivist avtomatizuyetsya stekom Stek viklikiv mozhe mati dodatkovi priznachennya zalezhno vid movi programuannya i arhitekturi komp yutera Sered nih mozhut buti Lokalne shovishe danih Pidprograma chasto potrebuye pam yat dlya zberezhennya znachen lokalnih zminnih zminnih znachennya yakih vidomi tilki pid chas vikonannya pidprogrami i ne zberigayutsya po vihodi z neyi Chasto buvaye zruchno vidilyati dlya takih zminnih misce prosto ruhayuchi verhivku steka dostatno shob zabezpechiti neobhidnij prostir Ce duzhe shvidke rishennya u porivnyanni z roztashuvannyam v kupi Zauvazhimo sho kozhna okrema pidprograma maye svij okremij prostir u steku dlya lokalnih zminnih Peredacha parametriv Pidprogami chasto vimagayut vid kodu sho yih viklikaye parametri i roztashuvannya znachen cih parametriv u steku ne ye nezvichnim rishennyam Yaksho parametriv vsogo dekilka i yihnij rozmir malij todi dlya peredachi yih v pidprogramu mozhna vikoristati registri procesora ale yaksho rozmir parameriv ne dozvolyaye zuzhitkuvati cej sposib peredachi bude neobhidnij prostir v pam yati Stek dobre pracyuye dlya peredachi takih parametriv osoblivo cherez te sho z kozhnim viklikom nastupnoyi pidprogrami znachennya parametriv zminyuyutsya shorazu dlya nih vidilyayetsya okreme misce Stek obchislennya Operandi arifmetichnih abo logichnih operacij zazvichaj roztashovuyut v registrah i todi provadyat nad nimi pevni dij Odnak v deyakih situaciyah operandi mozhut nakopichuvatisya do dovilnoyi glibini todi postaye pitannya vikoristannya chogos vidminnogo vid registriv Stek podibnih operandiv skorishe shozhij na RPN kalkulyator nazivayetsya stekom obchislennya i mozhe roztashovuvatisya u steku viklikiv Vkazivnik na potochnij ob yekt Deyaki ob yektozoriyentovani movi programuvannya napriklad C pri vikliku funkciyi zberigayut razom z argumentami funkciyi u steku Vkazivnik this vkazuye na ob yekt pov yazanij z metodom sho viklikayetsya Ohoplyuvalne seredovishe pidprogrami Deyaki movi napriklad Pascal ta Ada pidtrimuyut yaki dozvolyat vnutrishnij pidprogrami mati dostup do danih ohoplyuyuchoyi pidprogrami tobto parametriv i zminnih iz vlasnogo seredovisha ohoplyuyuchoyi pidprogrami Take statichne vkladennya mozhe povtoryuvatisya funkciya ob yavlena v funkciyi ob yalevnij v nastupnij funkciyi Realizaciya maye zabezpechiti sposib u yakij funkciya na bud yakomu statichnomu rivni vkladennya mogla b posilatisya na dani z kozhnogo rivnya vkladenosti ohoplyuvalnogo seredovisha Zazvichaj ce zdijsnyuyetsya cherez vikoristannya vkazivnika na otochuyuchij kadr vin zvetsya angl downstack link abo angl static link dlya togo shob rozriznyati z angl dynamic link sho posilayetsya na togo hto viklikaye neobov yazkovo statichnogo predka Napriklad movi yaki dozvolyayut pidprogramam viklikati sebe rekursivno z mozhlivistyu utvorennya v rezultati bagatoh kadriv vikliku dlya vnutrishnoyi pidprogrami ale vsi ci statichni posilannya vkazuyut na odin i te same seredovishe ohoplyuyuchoyi pidprogrami Zamist statichnih posilan posilannya na otochuyuchi statichni kadri mozhut buti realizovani u viglyadi masivu vkazivnikiv Inshi stani povernennya Okrim adresi povernennya v deyakih seredovishah v yakih prisutni inshi mashinnii ao programni stani sho povinni buti vidnovleni pislya povernennya z pidprogrami Ce mozhe buti riven privileyiv informaciya stosovno obrobki vinyatkiv arifmetichni rezhimi i tak dali Pri potrebi ci dani mozhut buti zberezheni u steku tak samo yak i adresa povernennya Zazvichaj stek viklikiv vikoristovuyetsya dlya adresi povernennya lokalnih parametriv i parametriv vidomih yak kadr vikliku V riznih seredovishah rizni obov yazki pokladayutsya na stek viklikiv V movi programuvannya Forth napriklad tilki adresa povernennya i lokalni zminni zberigayutsya u steku viklikiv tut vin vidomij yak stek povernennya parametri zberigayutsya v okremomu steku danih StrukturaStek viklikiv skladayetsya z stekovih kadriv inodi aktivacijnih zapisiv Ce zalezhni vid arhitekturi strukturi sho mistyat informaciyu pro stan pidprogrami Kozhnij stekovij kadr vidpovidaye pidprogrami yaka bula viklikana i she ne zavershilas Napriklad yaksho pidprogama DrawLine zaraz vikonuyetsya i bula viklikana pidprogramoyu DrawSquare verhnya chastina steka maye viglyadati podibnim chinom Stekovij kadr na gori steka vidpovidaye potochnij pidprogrami V najzagalnishomu varianti stekovij kadr vklyuchaye prostir dlya lokalnih zminnih pidprogrami adresi povernennya i znachennya parametriv peredanih v pidprogramu Adresa verhivki steka mistitsya v registri yakij nazivayut vkazivnik steku Takozh dostup do pam yati vseredini kadru mozhna otrimati cherez okremij registr chasto zgaduvanij yak vkazivnik kadru zazvichaj vin vkazuye na fiksovanu tochku v strukturi kadru taku yak roztashuvannya adresi povernennya Stekovi kadri mayut riznij rozmir Rizni pidprogrami mayut riznu kilkist parametriv tozh cya chastina mozhe mati riznij rozmir dlya riznih pidprogram Naspravdi deyaki movi programuvannya pidtrimuyut dinamichne vidilennya pam yati dlya lokalnih zminnih u steku v takomu vipadku rozmir ciyeyi chastinu kadru mozhe zminyuvatis pid chas vikonannya pidprogrami i buti nevidomim pid chas kompilyuvannya V ostannomu vipadku dostup cherez vkazivnik kadru shvidshij nizh cherez vkazivnik steku zazvichaj neobhidnij cherez nemozhlivist peredbachiti zmishennya vid verhivki steka do takih znachen yak adresa povernennya V bagatoh sistemah vkazivnik kadru mistit pole dlya zberezhennya poperednogo znachennya registra vkazivnika kadru tobto znachennya yake vin mav pid chas vikonannya pidprogrami sho viklikala Napriklad na pereduyuchij diagrami stekovij kadr DrawLine bude mati komirku pam yati vidvedenu pid zberezhennya znachennya vkazivnika kadru kotrij vikoristovuye DrawSquare Ce znachennya zberigayetsya na vhodi v pidprogramu i vidnovlyuyetsya dlya povernennya Nayavnist takogo polya v stekovomu frejmi dozvolyaye kodu mati dostup do kozhnogo kadru znizu potochnoyi pidprogrami movi programuvannya yaki pidtrimuyut vkladeni pidprogrami v stekovomu kadri mayut pole sho mistit vkazivnik na stekovij frejm ohoplyuyuchoyi pidprogrami yaka j viklikala cyu vnutrishnyu vkladenu pidprogramu Ce inodi nazivayetsya displej Cej vkazivnik zabezpechuye vnutrishnij pidprogrami mozhlivist dostupu do lokalnih zminnih i parametriv ohoplyuyuchoyi pidprogrami z yakoyi vona bula viklikana Dlya deyakih cilej stekovi kadri viklikovoyi ta viklikanoyi pidprogram mozhut peretinatisya Peretin skladayetsya z pam yati dlya parametriv V deyakih seredovishah viklikova pidprograma zashtovhuye kozhen z argumentiv na verhivku steka rozshiryuyuchi takim chinom svij stekovij kadr i potomu robit viklik V inshih seredovishah viklikova pidprograma zazdalegid otrimuye vidilene misce na gori stekovogo kadra dlya zberezhennya argumentiv yaki vona peredaye viklikanij pidprogrami Ce misce inodi nazivayut dilyanka vihidnih argumentiv abo viklikova dilyanka V comu vipadku romir takoyi dilyanki obchislyuyetsya kompilyatorom tak shob zabezpechiti vsi mozhlivi vikliki pidprogram VikoristannyaObrobka miscya vikliku Zazvichaj najmenshi diyi nad stekom viklikiv potribni same v misci vikliku pidprogrami i ce ye dobre bo mozhe buti bagato misc vikliku kozhnoyi pidprogrami Znachennya aktualnih argumentiv obchislyuyutsya na misci vikliku cherez yih osoblivist dlya kozhnogo vikliku i zashtovhuyutsya v stek abo zapisuyutsya v registri v zalezhnosti vid ugodi pro vikliki sho vikoristovuyetsya Potomu vikonuyetsya instrukciya napriklad BAL perehid i zv yazuvannya angl Branch and Link dlya peredachi keruvannya kodu cilovoyi pidprogrami Obrobka v viklikanij pidprogrami V viklikanij pidprogrami pershij vikonanij kod zazvichaj zvetsya vin vikonuye neobhidnu gospodarsku robotu pered pochatkom roboti logichnogo kodu pidprogrami Kod prologa zazvichaj zberigaye adresu povernennya zalishenu instrukciyeyu vikliku v registri zashtovhuyuchi yiyi v stek Shozhim chinom potochnij vkazivnik steku ta abo vkazivnik kadra mozhe buti zberezhenij Yak variant deyaki arhitekturi avtomatichno zabezpechuyut podibnu funkcionalnist i todi kod prologa ne maye vikonuvati ci operaciyi Yaksho vikoristovuyetsya vkazivnik kadra tipovij vstup vstanovlyuye nove znachennya registra vkazivnika steka z potochnogo znachennya cogo vkazivnika Prostir dlya lokalnih zminnih mozhe buti vidilenij pokrokovoyu zminoyu adresi verhivki steka Mova programuvannya Forth dozvolyaye yavne namotuvannya steka viklikiv ce nazivayetsya stek povernennya Obrobka povernen Koli pidprograma gotova povernuti keruvannya vona vikonuye epilog yakij vidkochuye kroki prologa Tipovo ce vidnovlennya znachen registriv takih yak znachennya vkazivnika kadra zi stekovogo kadra cilkom vishtovhuye stekovij kadr zminoyu znachennya vkazivnika steka i nasamkinec peredaye vikonannya instrukciyi za adresoyu povernennya V bagatoh pogodzhennyah viklikiv sered elementiv vishtovhnutih zi steka epilogom prisutni pochatkovi znachennya argumentiv v takomu vipadku viklikova programa zazvichaj ne maye neobhidnosti manipulyuvati stekom pislya povernennya v neyi Odnak v deyakih ugodah pro viklik ce zavdannya pokladayetsya na viklikovu pidprogramu Rozmotuvannya Povernennya z viklikanoyi pidprogrami vishtovhne verhnij kadr zi steka mozhlivo zalishivshi znachennya yake povertaye viklikana pidprograma Deyaki movi programuvannya taki yak Paskal dozvolyayut globalni goto perehodi dlya peredachi keruvannya nazovni z vkladenoyi pidprogrami i v poperedno viklikanu ohoplyuyuchu funkciyu Taka diya potrebuye rozmotki steka cherez stilki kadriv skilki neobhidno shob vidnoviti seredovishe zovnishnoyi pidprogrami v yakij znahoditsya adresa instrukciyi povernennya Zazvichaj take vikoristovuyut tilki dlya obrobki pomilok Inshi movi taki yak Object Pascal zabezpechuyut obrobku vinyatkiv yaka takozh potrebuye rozmotuvannya steka Stekovij kadr pidprogrami mozhe mistiti odin abo bilshe zapisiv sho viznachayut obrobku vinyatkiv U vipadku viniknennya vinyatkovoyi situaciyi stek rozmotuyetsya doti doki ne bude znajdenij obrobnik gotovij prijnyati zloviti danij tip vinyatku Common Lisp dozvolyaye prokontrolyuvati sho vidbudetsya pri rozmotuvanni steka cherez vikoristannya specialnogo unwind protect operatora Pri zastosuvanni prodovzhennya stek logichno rozmotuyetsya i znov namotuyetsya zi stekom prodovzhennya Stek viklikiv i testuvannya programnogo zabezpechennyaNeshodavno zayavlenij pidhid vikoristovuye stek viklikiv v duzhe vidminnij sposib vid opisanih Vin vikoristovuye jogo dlya zmenshennya naboru testiv Korotko zmenshennya naboru testiv shukaye mozhlivosti dlya zmenshennya kilkosti testovih prikladiv v nabori testiv odnochasno zberigayuchi visokij vidsotok efektivnosti viyavlennya pomilok Dva testovih prikladi vvazhayutsya totozhnimi yaksho voni utvoryuyut odnakovij nabir stekiv vikliku pid chas vikonannya Po podrobici divis Analiz produktivnostiPereglyad steka vikliku v dovilnij moment vikonannya programi mozhe buti duzhe korisnim dlya pokrashennya produktivnosti program Yaksho instrukciya vikliku pidprogrami z yavlyatsya cherez pevni promizhki chasu mozhlive pokrashennya cherez vidalennya vilikiv Divis Analiz produktivnosti ta Glibinne vibirannya BezpekaZmishuvannya danih potoku keruvannya vplivayuchih na vikonannya kodu adresa povernennya zberezheni vkazivniki kadriv i prostih danih programi parametri znachennya do povernennya lokalni zminni u steku viklikiv porodzhuye riziki bezpeki mozhlivist eksplojtuvannya cherez perepovnennya buferiv Div takozhPerepovnennya stekovogo buferaPrimitkic2 AlternativeMicroprocessorDesign Call Stack Coverage for GUI Test Suite Reduction by Scott McMaster and Atif M Memon In Proceedings of the 17th IEEE International Symposium on Software Reliability Engineering ISSRE 2006 Nov 2006 Call Stack Coverage for GUI Test Suite Reduction by Scott McMaster and Atif M Memon IEEE Trans Softw Eng 2008 IEEE Press Zovnishni posilannyaFunction Viklik i vkazivnik kadra v 68000 24 lipnya 2010 u Wayback Machine