Найти тему

Стековые диаграммы и диаграммы состояний

Сразу скажу, что я этим никогда не пользовался, не пользуюсь, и не собираюсь пользоваться. Но в литературе это встречается. Также может встретиться на экзаменах или в задачах по программированию. Поэтому решил рассказать.

Начнём с состояний…

Обычный способ записи переменных на бумаге (вряд ли кто сегодня так делает, но раньше, в эпоху дороговизны и малой распространённости компьютеров это бывало) - это написать имя переменной со стрелкой, которая указывает на значение переменной. Такое обозначение называется диаграммой состояний, потому что оно показывает, в каком состоянии находится каждая переменная в данное время. Выглядит это примерно так:

Диаграмма состояний
Диаграмма состояний

Таким образом, диаграмма состояний - это графическое представление набора переменных и их значений.

Ну а стековая диаграмма - это графическое представление стека функций, их переменных, и значений этих переменных.

Как и диаграмма состояний, стековая диаграмма отображает значение каждой переменной, но кроме этого она ещё показывает функцию, которой принадлежит переменная (ну или переменные).

Каждая функция представлена отдельным фреймом (рамкой, кадром).

Фрейм - это блок, рядом с которым записывается имя функции. А внутри этого блока располагаются параметры и переменные функции.

Фреймы расположены в стеке (в пачке, один за одним в порядке очерёдности вызова), который указывает, какая функция вызвала какую.

Для примера рассмотрим вот такую программку на Python:

Пример программы на Python
Пример программы на Python

Программа никакой особой пользы не представляет, и служит исключительно для того, чтобы показать, какой вид для неё может иметь стековая диаграмма:

Стековая диаграмма
Стековая диаграмма

Здесь видно, что сначала вызывается главная функция программы, где есть переменная v, которой присваивается значение 15. Затем вызывается функция xyz, куда передаются два параметра. Кроме того, в функции есть ещё и локальные переменные. Ну а затем уже из этой функции вызывается стандартная функция print, куда уже передаётся результат вычислений в функции xyz.

Не знаю, кто это всё придумал. По моему так не сильно понятно и довольно муторно. Имеет смысл разве что в тех случаях, когда вы действительно пишите программу на бумаге. Хотя я бы, наверно, даже для этого придумал что-то другое.

Но, как говорится, что уж есть. Если кого-то вдруг преподаватели мучают этой фигнёй - пользуйтесь.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.