Когда мы писали тетрис на JavaScript, то использовали в нём флаг остановки игры:
// ставим флаг окончания
gameOver = true;
В тот раз мы не останавливались на флагах подробно, поэтому сделаем это сегодня — расскажем, что такое флаг в программировании и для чего он нужен.
Флаг — это индикатор
Когда водитель садится за руль машины, то он видит много индикаторов — приборов и лампочек, которые:
- показывают нам состояние различных узлов в машине (обороты двигателя);
- показывают, включён или выключен какой-то прибор (например, кондиционер или ближний свет);
- напоминают, что нужно что-то сделать (пристегнуться);
- сигнализируют о неисправности (контрольная лампа давления масла, если уровень масла в двигателе слишком низкий).
Глядя на эти индикаторы, водитель понимает, что ему нужно сделать — пристегнуться, остановиться, чтобы долить масло в двигатель или ничего делать не нужно.
Флаги в программировании делают то же самое — показывают, что происходит в программе, чтобы алгоритм или человек мог принять решение.
Программные флаги — это переменные, а аппаратные флаги используются в процессорах.
Откуда такое название
В программирование флаги пришли из армии и флота, когда с помощью разноцветных флагов корабли передавали сигналы друг другу. Также флаги используют военные, когда подают сигналы для управления техникой — например, поднятый красный флаг запрещает движение.
Программный флаг — это переменная
В случае с тетрисом мы взяли логическую переменную gameOver и присвоили ей значение true — это называется «установить флаг». Эта переменная показывает, закончилась игра или нет: если true, то да, закончилась, а если false — можно играть дальше.
Но флаг сам по себе бесполезен, если на него никто не смотрит. Если мы просто установим флаг, то игра не закончится сама по себе — нам нужно периодически проверять, в каком состоянии флаг. Для этого в код в нужных местах добавляют проверку флага: смотрят, чему равен флаг, и если он сработал — выполняют определённые действия. В тетрисе мы делаем это в самом начале обработчика нажатия клавиш — если флаг сработал, то сразу останавливаем игру и выводим надпись Game Over.
Аппаратный флаг — регистр в процессоре
Процессор — это микросхема из миллиардов транзисторов, но ему тоже иногда нужны флаги, чтобы понять:
- перед ним чётное число или нет;
- произошло ли переполнение буфера;
- есть ли что-то в стеке, куда нужно вернуться после этой операции;
- в каком режиме работать.
Для этого в процессоре есть специальные регистры — хранилища данных, которые могут принимать различные значения. Технически это тоже как бы виртуальные переменные, только они влияют не на одну программу, а на весь процессор.
Аппаратные флаги в процессоре обрабатываются автоматически, в зависимости от используемых команд.
Зачем нужны флаги
Главная задача флага в программировании — показать, что что-то изменилось и что нужно на это отреагировать. Например:
- кубик вылез за игровое поле и нужно остановить игру;
- пользователь слишком много раз ввёл неправильный пароль — тогда программа поставит флаг и в ближайший час не пустит его в систему;
- процедура закончила рисовать интерфейс и установила свой флаг — в этом случае система поймёт, что можно разрешить пользователю нажимать на кнопки;
- система заметила подозрительную активность и установила специальный флаг — в этом случае она будет записывать все действия пользователя, пока флаг не снимется.
👉 Короче:
Флаг — удобный способ передать информацию внутри алгоритма, чтобы в нужный момент принять верное решение.