Как программа работает
и как её чинить

Среда программирования. Методы отладки.
10 класс, углублённый уровень — занятие второе.

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

Процессор не понимает print

Он понимает только числа — машинный код.

print("Привет")           # так пишете вы

b8 21 0a 00 00 e8 f4 ...  # так это выглядит для процессора

Два переводчика

Компилятор

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

C, C++, Pascal

Интерпретатор

Переводит и выполняет по ходу дела, строку за строкой. Отдельного файла не остаётся.

Python, JavaScript

Разницу видно на ошибке

print("первая строка")
print("вторая строка")
print(10 / 0)
print("третья строка")

У Python дорога длиннее

Текст → байт-код → виртуальная машина → процессор

  • Текст программы переводится не в команды процессора, а в промежуточный байт-код.
  • Байт-код выполняет виртуальная машина — программа, которая притворяется процессором.
  • Готовый байт-код складывается в папку __pycache__, чтобы в следующий раз не переводить заново.

Зачем такая сложность

Что выигрываем

Байт-код одинаков везде, а виртуальные машины написаны под каждую систему. Программа переезжает с Windows на Linux и на телефон без единой правки.

Чем платим

Скоростью. Между программой и процессором стоит лишний слой, и тяжёлые вычисления на Python идут в десятки раз медленнее, чем на C++.

Среда разработки: всё в одном окне

IDLE, в которой вы работаете, — тоже IDE, просто самая скромная.

  • Редактор — подсветка синтаксиса, автоотступы;
  • Запуск — F5, не выходя из редактора;
  • Shell — проверить одну строчку, не заводя файла;
  • Отладчик — то, ради чего сегодня всё;
  • во взрослых средах ещё профилировщик — меряет, на что программа тратит время.

Программа работает.
Ответ неправильный.

Самая частая и самая неприятная ситуация.

Ошибки бывают двух видов

Не запускается

Красный текст, SyntaxError, ValueError, TypeError.

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

Работает, но врёт

Ошибок нет, программа что-то печатает — и это «что-то» неверное.

Python здесь молчит. Он выполнил ровно то, что написано. Написано не то, что задумано.

Инструмент 1: трассировочная таблица

Компьютер не нужен. Нужен лист бумаги.

s = 0
for i in range(1, 5):
    s = s + 2 * i
print(s)

Как таблица находит ошибку

Программа должна сложить пробег за смену. А складывает неправильно.

n = int(input())
for i in range(n):
    total = 0
    km = int(input())
    total = total + km
print(total)

Инструмент 2: отладочный вывод

Временный print там, где хочется посмотреть.

for i in range(n):
    km = int(input())
    total = total + km
    print("шаг", i, "прочитал", km, "накопил", total)   # временно!

Инструмент 3: отладчик

Он не находит ошибку. Он показывает, что происходит на самом деле.

  • Главное окно IDLE → Debug → Debugger;
  • галочки Locals и Globals — иначе значений не видно;
  • F5 в окне программы — она встанет на первой строке;
  • Step шаг · Over не заходя в функцию · Out выйти · Go до точки останова · Quit прервать.

Точка останова: не жать Step сто раз

Правой кнопкой по строке → Set Breakpoint. Строка станет жёлтой. Теперь Go домчит программу до неё и остановится перед этой строкой.

n = int(input())
total = 0
for i in range(n):
    km = int(input())
    total = total + km      # сюда точку останова
print(total)

Отдельный случай: программа зависла

Работает и не заканчивается — значит, цикл не может выйти.

  1. Останови: Ctrl+C в окне Shell. Python напечатает KeyboardInterrupt и покажет строку, на которой его прервали, — она внутри вечного цикла.
  2. Найди переменную из условия цикла.
  3. Проверь, меняется ли она внутри. Не меняется — вот и причина.

Что делаем сегодня

Тренажёр

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

Считаем в уме и на бумаге. Запустить — значит узнать ответ, но не научиться.

Три сломанные программы

broken1.py, broken2.py, broken3.py в общей папке. В каждой описано, что она должна делать, и есть ровно одна ошибка.

Чиним и сохраняем в свою папку как zadanie1.py … zadanie3.py.

Как работаем

ЧтоГдеСколько
Тренажёр трассировкипрактикум, наверху страницы 20 минут
Три починкиIDLE, файлы из общей папки 20 минут
ПроверкаПроверка.bat попыток сколько угодно

За работу

Открывайте практикум. Начинаем с тренажёра.

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

Материалы подготовлены с использованием технологий искусственного интеллекта. Пробел раскрыть и дальше · ← → слайды