Граф вызовов
Граф вызовов — это схема, которая показывает, какие подпрограммы вызывают друг друга в программе. По нему можно быстро понять структуру программы и проследить цепочку выполнения от одной подпрограммы к другой.
Как читать граф
Каждую подпрограмму изображают вершиной, обычно прямоугольником или кругом. Стрелка направлена от вызывающей подпрограммы к вызываемой. Если одна подпрограмма вызывает другую несколько раз, обычно достаточно одного ребра: граф показывает сам факт вызова, а не количество повторений.
Например, если основная программа вызывает \(A\), а \(A\) вызывает \(B\) и \(C\), то в графе будут рёбра «Основная программа» \(→ A\), \(A → B\) и \(A → C\). Такой граф помогает определить, какие подпрограммы зависят от других. При анализе выполнения полезно отличать граф вызовов от стека вызовов: граф описывает возможные связи в программе, а стек — текущую цепочку активных вызовов.
Пусть процедура start вызывает read_data и sort, а sort вызывает compare. Тогда схема имеет вид: start → read_data, start → sort, sort → compare. Из графа видно, что compare запускается не напрямую из start, а через sort.
Граф вызовов не показывает порядок всех отдельных команд и не является стеком вызовов. Кроме того, стрелка означает именно вызов, а не передачу значения аргумента или направление движения данных. При рекурсии подпрограмма может иметь стрелку в саму себя.
Процедура P вызывает Q, а Q вызывает R. Какое ребро обязательно есть в графе вызовов?
P к R не указано.Q из P.Главное
- Граф вызовов — ориентированный граф подпрограмм.
- Ребро \(A \to B\) означает, что \(A\) вызывает \(B\).
- Граф показывает структуру возможных вызовов, а стек вызовов — текущую цепочку выполнения.