Текст в консоли
Первый способ управлять отладчиком и читать состояние программы.
История проекта
PyChronicle появился из простой мысли: отладка программы не должна быть движением только вперёд.
Личный опыт обычной отладки
СЕГОДНЯИстория, откат и ветви выполнения
01 / ПОЧЕМУ
Во время пошагового выполнения мы часто не успевали проследить за нужной переменной или слишком быстро проходили несколько шагов и перескакивали момент, который хотели изучить. Вернуться назад уже было нельзя — приходилось перезапускать программу и снова доходить до нужного места.
Особенно сильно это мешало при написании алгоритмов и структур данных. Некоторые ошибки было трудно поймать, а после каждого исправления приходилось заново запускать код и восстанавливать нужные условия. Один ошибочный ввод в самостоятельно написанном стресс-тесте мог заставить повторять весь путь сначала.
Так появилась идея отладчика, в котором можно вернуться к прошлому состоянию, изменить данные и продолжить выполнение, не проходя всю программу заново.
02 / ОСНОВА
Примерно за полгода до PyChronicle мы начали писать собственную виртуальную машину — нам было интересно разобраться, как Python работает под капотом. Когда возникла идея обратимой отладки, мы сразу поняли, что можем использовать её потенциал и контролировать выполнение отдельных команд программы.
03 / РАЗВИТИЕ
Первым шагом стал список, который запоминал предыдущие состояния и изначально проектировался с возможностью отката. Затем появились словарь и имена с историей — стало важно помнить не только изменения объектов, но и то, на какой объект указывало каждое имя.
list → dict → namesСначала история каждой структуры хранилась отдельно. Новых типов становилось больше, каждому приходилось передавать одни и те же команды, а архитектура всё сильнее загрязнялась. ObjectStore собрал управление историей объектов в одном месте.
ObjectStoreСледующим этапом стали снимки виртуальной машины. Теперь сохранялись не только объекты, но и само выполнение: текущая команда, стек и вызовы функций. Это позволило откатывать всю программу целиком.
snapshot(T−1)Итератор должен был восстанавливать позицию, до которой уже дошёл. С генераторами всё оказалось сложнее: их функции приостанавливаются внутри выполнения и сохраняют внутреннее состояние. Для корректного возврата пришлось придумывать отдельные хитрости.
yield / resumeЕсли вернуться назад и изменить данные, первоначальное продолжение не должно исчезать. PyChronicle сохраняет старый путь выполнения и создаёт новую ветку, в которой можно проверить альтернативный вариант.
history A ↗ history B04 / ИНТЕРФЕЙС
Объектов, состояний и связей становилось всё больше. Историю выполнения уже было сложно описывать текстом — её нужно было видеть.
Первый способ управлять отладчиком и читать состояние программы.
До визуального интерфейса схемы ветвления приходилось буквально рисовать на листочке.
Отдельное окно веток и отдельное окно переменных проверили идею визуального отладчика.
Редактор, управление выполнением, переменные и интерактивная карта веток в одном месте.
05 / КОМАНДА
06 / ОБУЧЕНИЕ
PyChronicle может быть особенно полезен при изучении Python, алгоритмов и структур данных. Он показывает, как менялись переменные и объекты, как выполнялись циклы и функции, где появилась ошибка и какие действия к ней привели.
Возможность возвращаться назад помогает спокойно разбирать сложные участки кода, не боясь пропустить важный момент и не повторяя выполнение с самого начала.
07 / ЧТО ДАЛЬШЕ
Сохранение подробной истории требует значительного количества памяти. Поэтому программы с миллионными массивами и тысячами итераций могут упираться как в текущий уровень оптимизации, так и в доступные ресурсы серверов.
Команда хочет постепенно преодолеть эти ограничения, чтобы PyChronicle мог работать с более крупными и сложными проектами.
ИСТОРИЮ ЛУЧШЕ УВИДЕТЬ