"Що це" прийшло в стек, "що це" повернулося назад: абстрактний фундамент реальності
Можливо, в якомусь майбутньому обчислювальний справу забуде про нулі і одиниці, а процесори будуть оперувати НЕ байтами і словами, але поки все представлено двійковим світом і живе за її правилами. Що таке стек і де він застосовується, - швидше за все, стане абсолютно не ясно. Ще на початку своєї появи перший процесор мав регістри, а логіка його роботи потребувала пам`яті. В результаті реалізації простих ідей стек «що це» став де факто «так треба».
Функції, процесор, двійкова логіка
Процесор керує пам`яттю і реалізує логіку циклічного виконання коду. Програма - це одна або набір функцій, які представляють собою послідовність операцій: вибрати щось, зробити так-то, покласти туди-то. Операційна система - теж код, більш відповідальний: йому доручено виконувати і контролювати інші програми.
Власне функція (самостійний елемент алгоритму) - всього лише послідовність двійкових операцій. Програма відрізняється від функції тим, що реалізує себе і координує інші частини коду.
Прийнято алгоритм розробляти у вигляді послідовності окремих самостійних елементів. Кожен виконує власну (зазвичай тільки одну) функцію - це зручно для налагодження, наочно, практично. Таке програмування дозволяє спростити процес розробки, створювати бібліотеки алгоритмів і використовувати їх в інших проектах.
Передача і повернення управління
Програма викликає функцію і, передаючи їй дані, розраховує отримати результат. Так виконання іншої ділянки коду ініціюється ззовні, тому повернення управління повинен бути здійснений на наступну за викликом операцію. Цим механізмом забезпечується порядок виконання коду і досягнення результату програми в цілому.
Код завантажується в пам`ять і послідовно виконується. Щоб викликати функцію (іншу ділянку коду), використовується стек. Що це? Пам`ять (і покажчик до неї), що відрізняється від звичайної тим, що кожен наступний елемент поміщається над попереднім. Тому, щоб отримати кожен, що знаходиться нижче, потрібно взяти і відпрацювати всі, що знаходяться над ним. Покажчик завжди вказує на поточну позицію в стеці.
Спочатку в стек потрапляє адресаповернення - адреса наступної за викликом операції. Потім туди поміщаються всі необхідні для викликається функції дані. Викликана функція вибирає дані, обробляє їх, формує результат і повертає управління з останнього елемента стека. Команда: «стек, що це» переміщує покажчик на попереднє дане, а вбрання «це» надходить в обробку.
Регістри AX, BX, CX, DX, EX стали свого роду символами епохи початку інформаційної ери, але SP і SS - це її головний талісман. Як застосовують стек в програмуванні? Приклади минулого не стануть пам`ятниками архітектури початку ери. Стек прийшов в двійковий світ разом зі словами "функція" і "рекурсія" і розчинився в загальній логіці розвитку практики програмування.
Сервірувати дані, щоб вирішити, що робити
Стековий механізм допускає численні виклики різних ділянок коду, в тому числі і рекурсию: виклик функцією самої себе. Є природні обмеження: розміри пам`яті під стек і під код повинні бути достатніми. Якщо програма коректна, то її виконання буде стабільним, передача / повернення управління - точними.
Стек заповнюється, як тарілки лягають в стопку, яка відправляється сервірувати стіл. Доля тарілок, тобто їх наповнення, вирішується в місці, куди вона передана. За логікою взаємодії, команда «стек, що це" дає заздалегідь узгоджене дане тим часом, хто викликав, і тим, кого він викликав. По завершенні процесу важливо повернути управління за адресою, наступного за тим, що відправив стопку на стіл.
Дуже проста і ефективна логіка. Що робиться на столі, як приймається рішення - справа функції, як вона надійде до отриманих даних - її турбота, на який стіл вона відправить свою стопку даних - її турбота, головне в тому, щоб управління завжди поверталося на наступну за викликом операцію. Функція може викликати саму себе, тільки якщо вона допускає рекурсію, а рекурсія можлива тільки в тому випадку, якщо дані лягають в стек.
фундаментальні абстракції
Коли буденне і практичне стає основою віртуально-перспективного, можна обґрунтовано розраховувати на об`єктивність і довге життя останнього. Стос тарілок дала життя стеку, а стек забезпечив роботу процесорів, операційних систем, програм, функцій і сфери високих технологій в цілому.
Класичний випадок, коли просте стало основою, але рідкісний випадок, коли це можна оцінити без порожніх суперечок про синтаксис, семантику, механізмах програмування і пріоритети в боротьбі мов за виживання.
Змінна, як була осередком пам`яті, так і залишилася нею донині, тільки ось уявлення про неї змінилися. Впевнено пройшовши крізь пекло суворої типізації, вони сьогодні стверджують: щось може бути чим завгодно і займати в реальному пам`яті що завгодно, оскільки саме це вже зовсім не важливо.
Оператори присвоювання, умов, циклів, блоків… змінилися набагато менше в смисловому плані, ну а синтаксис вже давно не має значення. Боротьба мов програмування за ідеали не дала шанс на перемогу одного з них. Інструмент (компілятор / інтерпретатор / оболонка) зобов`язаний просто працювати, бути стабільним і повнофункціональним, а як і що написати / використовувати - турбота програміста, а не автора мови.
Стек набув нового значення в цьому глобальному процесі розвитку уявлень і технологій. Змінні в тому вигляді, в якому їм бути зручно, нашаровуються один на одного, а алгоритми і оператори включаються один в одного. Часто можна чути про стекупротоколів, коли один забезпечує роботу іншого.
Стек, функціональність і рекурсія - зовсім синоніми, але вони прекрасно доповнюють один одного, дозволяючи створювати унікальні варіанти представлення і обробки інформації.