История проекта

От желания вернуться на один шаг назад — к PyChronicle

PyChronicle появился из простой мысли: отладка программы не должна быть движением только вперёд.

НАЧАЛО

Личный опыт обычной отладки

СЕГОДНЯ

История, откат и ветви выполнения

Читать историю

Момент уже прошёл. Вернуться к нему нельзя.

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

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

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

Виртуальная машина появилась раньше самой идеи

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

−6 МЕСЯЦЕВИнтерес к устройству Python
ИДЕЯОбратимая отладка
ОСНОВАКонтроль выполнения

Откат складывался по частям

  1. 01

    Персистентные структуры

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

    list → dict → names
  2. 02

    Общее хранилище

    Сначала история каждой структуры хранилась отдельно. Новых типов становилось больше, каждому приходилось передавать одни и те же команды, а архитектура всё сильнее загрязнялась. ObjectStore собрал управление историей объектов в одном месте.

    ObjectStore
  3. 03

    Снимки выполнения

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

    snapshot(T−1)
  4. 04

    Итераторы и генераторы

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

    yield / resume
  5. 05

    Ветвление

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

    history A ↗ history B

Когда консоли стало недостаточно

Объектов, состояний и связей становилось всё больше. Историю выполнения уже было сложно описывать текстом — её нужно было видеть.

01CLI

Текст в консоли

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

02БУМАГА

Ветки от руки

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

03TKINTER

Первый GUI

Отдельное окно веток и отдельное окно переменных проверили идею визуального отладчика.

04WEB

Единый интерфейс

Редактор, управление выполнением, переменные и интерактивная карта веток в одном месте.

PyChronicle разрабатывает команда студентов из МФТИ.

Не только результат, но и весь путь к нему

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

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

От учебных программ — к более сложным проектам

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

Команда хочет постепенно преодолеть эти ограничения, чтобы PyChronicle мог работать с более крупными и сложными проектами.

  • 01Поддержка новых версий Python
  • 02Многофайловые проекты
  • 03Асинхронное программирование
  • 04Многопоточный код
  • 05Оптимизация хранения истории
  • 06Развитие серверной инфраструктуры

Есть вопрос, предложение или идея для сотрудничества?

contact@pychronicle.ru

Посмотрите, как программа выполняется во времени

Попробовать PyChronicle Технические подробности