Development of an interactive environment for visualizing step-by-step execution of algorithms on dynamic data structures

UDC 004.42:004.932
Publication date: 30.06.2026
International Journal of Professional Science №6(2)-26

Development of an interactive environment for visualizing step-by-step execution of algorithms on dynamic data structures

Разработка интерактивной среды визуализации пошагового исполнения алгоритмов над динамическими структурами данных

Evstigneev Nikita Alekseevich,
Trofimenko Elena Vladimirovna
1. Student of the Faculty of Applied Mathematics, Informatics and Mechanics,
Voronezh State University, Voronezh
2. Candidate of Physical and Mathematical Sciences, Associate Professor of the Department of Mathematical Support of Computers, Voronezh State University, Voronezh

Евстигнеев Никита Алексеевич,
Трофименко Елена Владимировна
1. обучающийся факультета прикладной математики, информатики и механики, Воронежский государственный университет, г. Воронеж
2. кандидат физико-математических наук, доцент кафедры математического обеспечения ЭВМ, Воронежский государственный университет, г. Воронеж
Аннотация: В статье рассматривается разработка интерактивной образовательной среды, предназначенной для визуализации пошагового исполнения алгоритмов над динамическими структурами данных. Актуальность темы связана с тем, что при изучении алгоритмов обучающиеся часто испытывают трудности не только с пониманием исходного кода, но и с представлением внутренних процессов выполнения программы: изменения значений переменных, создания объектов в динамической памяти, перенаправления указателей и формирования стека вызовов функций. Предлагаемая программа решает данную проблему за счёт выполнения пользовательского кода в контролируемой интерпретируемой среде и синхронного отображения состояния виртуальной памяти. В работе описаны основные этапы обработки программы: лексический анализ, синтаксический анализ, построение абстрактного синтаксического дерева, интерпретация инструкций, сохранение снимков состояния и построение графического представления структур данных. Особое внимание уделяется модели виртуальной памяти, позволяющей отображать динамические объекты и связи между ними в виде графа. Разработанная среда реализована с применением Godot Engine и ориентирована на использование в учебном процессе при изучении указателей, связных списков, бинарных деревьев поиска, рекурсии и принципов пошагового выполнения программ.

Abstract: The article discusses the development of an interactive educational environment designed to visualize the step-by-step execution of algorithms operating on dynamic data structures. The relevance of the topic is determined by the fact that students often have difficulties not only with understanding source code, but also with representing the internal processes of program execution: changes in variable values, creation of objects in dynamic memory, pointer redirection and formation of the function call stack. The proposed system addresses this problem by executing user code in a controlled interpreted environment and by synchronously displaying the state of virtual memory. The paper describes the main stages of program processing: lexical analysis, syntax analysis, construction of an abstract syntax tree, interpretation of instructions, saving state snapshots and creating a graphical representation of data structures. Special attention is paid to the virtual memory model, which makes it possible to display dynamic objects and relations between them as a graph. The developed environment is implemented using Godot Engine and is intended for use in the educational process when studying pointers, linked lists, binary search trees, recursion and the principles of step-by-step program execution.
Ключевые слова: визуализация алгоритмов, динамические структуры данных, интерпретатор, абстрактное синтаксическое дерево, виртуальная память, стек вызовов, Godot Engine.

Keywords: algorithm visualization, dynamic data structures, interpreter, abstract syntax tree, virtual memory, call stack, Godot Engine.


Введение

Изучение алгоритмов и структур данных является одной из базовых задач подготовки специалистов в области программирования. Однако для начинающих разработчиков эта тема часто оказывается затруднительной, поскольку большинство процессов, происходящих во время выполнения программы, скрыто от пользователя. По исходному коду не всегда очевидно, каким образом изменяются значения переменных, как создаются объекты в памяти, как формируются связи между элементами структуры данных и как выполняются вложенные или рекурсивные вызовы функций [1].

Традиционные учебные материалы позволяют объяснить теоретическую сторону алгоритма, но в основном демонстрируют отдельные статические состояния. Такой формат полезен для первичного знакомства с темой, однако он не всегда помогает проследить динамику выполнения программы. Например, при изучении связного списка важно увидеть не только конечную последовательность узлов, но и момент создания каждого узла, изменение указателя next, обработку пустого списка и переход к следующему элементу. Аналогичная проблема возникает при изучении бинарных деревьев поиска, где необходимо понимать, как новая вершина проходит путь от корня к месту вставки.

Существующие онлайн-визуализаторы алгоритмов существенно повышают наглядность обучения, но часто ограничены заранее подготовленными сценариями, фиксированными структурами данных или конкретным языком программирования [2, 3]. Классические отладчики, напротив, позволяют анализировать реальные программы, но их интерфейс ориентирован на профессиональную разработку и не всегда удобен для учебных целей. Кроме того, многие отладчики показывают сложные структуры данных в текстовом виде, из-за чего связи между объектами воспринимаются недостаточно наглядно.

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

Цель и постановка задачи

Целью работы является разработка интерактивной программной среды, обеспечивающей пошаговое выполнение пользовательских алгоритмов и визуальное отображение состояния динамических структур данных. В качестве предметной области выбраны алгоритмы, работающие со связными списками и бинарными деревьями поиска, поскольку данные структуры хорошо демонстрируют роль динамической памяти, указателей и ссылочных связей.

Для достижения цели были определены следующие основные задачи: разработать лексический анализатор для выделения токенов исходного текста; реализовать синтаксический анализатор для построения внутреннего представления программы; спроектировать модель абстрактного синтаксического дерева; реализовать интерпретатор, поддерживающий пошаговое выполнение; создать подсистему виртуальной памяти для моделирования динамических объектов; разработать механизм сохранения состояний программы; реализовать графическую визуализацию объектов памяти, связей между ними и стека вызовов.

Входными данными программы является программа на специально разработанном подмножестве C-подобного языка. Такой выбор синтаксиса обусловлен тем, что большинство базовых курсов алгоритмов и структур данных использует конструкции, близкие к языкам C и C++. Поддерживаемое подмножество включает объявления переменных, арифметические и логические выражения, условные операторы, циклы, пользовательские функции, рекурсивные вызовы, указатели и операции работы с динамической памятью.

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

Методы и архитектура программы

В основе разработанного решения лежит интерпретационный подход. В отличие от компиляции в машинный код, интерпретация позволяет сохранять полный контроль над выполнением каждой инструкции. После обработки отдельного оператора подсистема может зафиксировать состояние памяти, сохранить текущую позицию выполнения и обновить визуальное представление. Для образовательной программы такой подход оказывается более удобным, чем компиляция, поскольку главным критерием является не максимальная скорость выполнения, а возможность детального наблюдения за процессом [4].

Архитектура программы построена как последовательный конвейер обработки данных. На первом этапе исходный текст поступает в лексический анализатор. Лексер выполняет посимвольный просмотр входной строки и формирует последовательность токенов: ключевых слов, идентификаторов, числовых литералов, операторов, разделителей и специальных символов. Наличие отдельного этапа лексического анализа упрощает последующий синтаксический разбор, поскольку парсер работает уже не с отдельными символами, а со структурированным потоком элементов языка.

На втором этапе токены передаются синтаксическому анализатору. В подсистеме используется разделение разбора на две части: анализатор структурных конструкций и анализатор выражений. Первый отвечает за функции, блоки инструкций, условные операторы, циклы и операторы возврата. Второй используется для построения выражений с учётом приоритетов операций, вложенных скобок, вызовов функций и операций доступа к полям объектов.

Результатом синтаксического анализа является абстрактное синтаксическое дерево, или AST. Использование AST позволяет отделить исходный текст от дальнейшего выполнения программы. Интерпретатор работает уже не со строками кода, а с унифицированной древовидной структурой, в которой каждый узел соответствует конкретной конструкции языка. Такой подход широко применяется в компиляторах и интерпретаторах, поскольку облегчает анализ и выполнение программ [5, 6].

Центральным компонентом программы является интерпретатор. Он выполняет обход AST и обрабатывает узлы в соответствии с их типом. Для объявлений переменных создаются записи в текущей области видимости, для присваиваний вычисляется правая часть и изменяется значение левой части, для условных операторов проверяется логическое выражение, а для циклов выполняется повторная обработка тела до нарушения условия. При вызове функции создаётся новый кадр стека, содержащий параметры, локальные переменные и служебную информацию о текущей позиции выполнения.

Для моделирования динамических структур данных реализована виртуальная память. Она условно разделяется на область локальных переменных в кадрах стека и динамическую область, в которой размещаются создаваемые во время выполнения объекты. Каждый объект имеет уникальный идентификатор, тип и набор полей. Указатели моделируются как связи между переменными и объектами либо между объектами динамической памяти. Такое представление позволяет строить граф объектов, пригодный для визуализации связных списков, деревьев и других структур.

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

В таблице 1 представлены основные компоненты разработанной программы и их назначение.

Таблица 1.

Основные компоненты разработанной программы

Компонент Назначение
Лексический анализатор Преобразует исходный текст в последовательность токенов.
Синтаксический анализатор Проверяет структуру программы и формирует AST.
Интерпретатор Выполняет узлы AST и управляет пошаговым исполнением.
Виртуальная память Хранит переменные, динамические объекты и связи между ними.
Хранилище состояний Фиксирует снимки выполнения для навигации по истории.
Визуализатор Отображает объекты, связи, структуры данных и стек вызовов.

 

Реализация визуализации

Графическая часть проекта реализована средствами Godot Engine. Выбор игрового движка обусловлен наличием готовых инструментов для работы с двумерной графикой, сценами, узлами интерфейса и пользовательским вводом. Каждый объект виртуальной памяти отображается как отдельный графический элемент, а связи между объектами показываются линиями или направленными стрелками. Такой способ представления особенно полезен при изучении структур, в которых важную роль играют ссылки между элементами [7].

При визуализации связного списка узлы размещаются в линейной последовательности. Пользователь может наблюдать, как после добавления нового элемента изменяется поле next предыдущего узла, а при работе с двусвязным списком дополнительно отображаются обратные связи. Подобное представление помогает понять, почему изменение одного указателя может повлиять на доступность всей структуры данных.

При отображении бинарного дерева поиска используется иерархическая компоновка. Корневой узел располагается выше дочерних, левая и правая ветви визуально разделяются. После каждой операции вставки можно проследить путь сравнения значений и увидеть, в какой ветви появляется новый элемент. Для более сложных деревьев важной задачей становится автоматическое размещение узлов так, чтобы связи не пересекались и структура оставалась читаемой [8].

Отдельно визуализируется стек вызовов функций. Каждый кадр стека содержит имя функции, параметры и локальные переменные. Верхний кадр соответствует функции, выполняемой в текущий момент. При рекурсивных вызовах пользователь видит постепенное увеличение глубины стека, а затем последовательное удаление кадров при возврате из функций. Это особенно важно при объяснении рекурсии, поскольку позволяет связать математическое определение рекурсивной функции с реальным процессом выполнения программы.

Результаты работы

Проверка работоспособности программы проводилась на наборе программ, содержащих основные конструкции поддерживаемого языка. На первом этапе была подтверждена корректность лексического анализа: исходный код разбивался на ключевые слова, идентификаторы, литералы, операторы и разделители. Далее синтаксический анализатор строил AST, в котором отражались функции, объявления переменных, выражения и управляющие конструкции.

Интерпретатор был проверен на обработке арифметических выражений, условных операторов, циклов, пользовательских функций и рекурсивных вызовов. В частности, вычисление выражений выполнялось с учётом приоритета операций, условные операторы корректно выбирали ветвь исполнения, а циклы обновляли состояние переменных на каждой итерации. При вызове пользовательской функции создавался новый кадр стека, в который передавались значения аргументов.

Для проверки рекурсивных вызовов использовалась программа вычисления факториала. Во время выполнения подсистема последовательно создавала кадры стека для каждого уровня рекурсии, сохраняла локальные значения параметров и затем возвращала результат в вызывающую функцию. Визуализация стека позволила наблюдать не только итоговое значение, но и сам процесс накопления и возврата вычислений.

Работа виртуальной памяти была рассмотрена на программах, создающих узлы бинарного дерева и связного списка. После выполнения операций создания объектов в динамической памяти появлялись узлы с уникальными идентификаторами, а присваивание полей формировало связи между ними. Визуализатор корректно отображал созданные объекты и перестраивал графическое представление после изменения состояния памяти.

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

Обсуждение

Предложенный подход отличается от обычных статических материалов тем, что демонстрирует алгоритм как процесс, разворачивающийся во времени. В отличие от универсальных онлайн-визуализаторов, программа ориентирована на работу с пользовательским кодом и на отображение динамической памяти. В отличие от классических отладчиков, интерфейс сосредоточен на учебной задаче: показать переменные, объекты, связи и стек вызовов в форме, понятной начинающему разработчику.

К преимуществам разработанной архитектуры можно отнести модульность и расширяемость. Лексический анализатор, синтаксический анализатор, интерпретатор, виртуальная память и визуализатор реализованы как отдельные подсистемы. Это позволяет в дальнейшем добавлять новые конструкции языка, новые типы данных и новые способы визуального представления без полной переработки программного продукта.

В то же время разработанное решение имеет ряд ограничений. Поддерживается только ограниченное подмножество C-подобного языка, отсутствует работа с внешними библиотеками, файловой системой и многопоточностью. Кроме того, визуализация ориентирована преимущественно на небольшие учебные примеры. При большом количестве объектов потребуется развитие алгоритмов автоматической компоновки и масштабирования сцены.

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

Заключение

В статье рассмотрена разработка интерактивной среды визуализации пошагового исполнения алгоритмов над динамическими структурами данных. Предложенная реализация основана на собственной цепочке анализа и выполнения программ: лексический анализ, синтаксический анализ, построение абстрактного синтаксического дерева, интерпретация инструкций и сохранение снимков состояния.

Реализованная виртуальная модель памяти позволяет представлять динамические объекты и указательные связи в виде графа, удобного для визуализации. Пошаговый режим и история состояний дают пользователю возможность анализировать выполнение программы не только по конечному результату, но и по последовательности промежуточных изменений. Отображение стека вызовов дополняет визуализацию памяти и помогает изучать функции и рекурсию.

Таким образом, разработанная среда может использоваться при изучении алгоритмов, структур данных и основ управления памятью. Её применение способствует более наглядному пониманию связи между исходным кодом программы и изменением внутреннего состояния программы в процессе выполнения.

References

1. Кормен Т. Х., Лейзерсон Ч. И., Ривест Р. Л., Штайн К. Алгоритмы: построение и анализ. 3-е изд. М.: Вильямс, 2013. 1323 с.
2. Hundhausen C. D., Douglas S. A., Stasko J. T. A Meta-Study of Algorithm Visualization Effectiveness // Journal of Visual Languages & Computing. 2002. Vol. 13. No. 3. P. 259-290.
3. Naps T. L. et al. Exploring the role of visualization and engagement in computer science education // ACM SIGCSE Bulletin. 2003. Vol. 35. No. 2. P. 131-152.
4. Guo P. J. Online Python Tutor: Embeddable Web-Based Program Visualization for CS Education // Proceedings of the 44th ACM Technical Symposium on Computer Science Education. New York: ACM, 2013. P. 579-584.
5. Ахо А. В., Лам М. С., Сети Р., Ульман Д. Д. Компиляторы: принципы, технологии и инструментарий. 2-е изд. М.: Вильямс, 2008. 1175 с.
6. Nystrom R. Crafting Interpreters. Genever Benning, 2021. 639 p.
7. Седжвик Р., Уэйн К. Алгоритмы на Java. 4-е изд. М.: Вильямс, 2013. 843 с.
8. Reingold E. M., Tilford J. S. Tidier Drawings of Trees // IEEE Transactions on Software Engineering. 1981. Vol. SE-7. No. 2. P. 223-228.
9. Godot Engine Documentation. URL: https://docs.godotengine.org/ (дата обращения: 10.03.2026).
10. Pressman R. S., Maxim B. R. Software Engineering: A Practitioner’s Approach. 9th ed. New York: McGraw-Hill Education, 2020. 671 p.