Найти тему
IT. Как это работает?

От транзистора до фреймворка. Часть 10. Циклы в языках программирования

Источник: http://академия-разработчиков.рф

Видео: YouTube

Рассмотрим организацию циклов в процессорах. Кто еще не знаком со структурной схемой процессора и системой команд рекомендую ознакомиться в предыдущих статьях.

Структура процессора и система команд
Структура процессора и система команд

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

Вычисление значения линейной функции
Вычисление значения линейной функции

Проблема в том, что в нашем процессоре нет команды умножения. Однако, мы знаем, что умножение это многократно повторяющееся сложение (подробнее в материале об арифметико-логическом устройстве). Команда сложения (в прошлом уроке мы писали на Си как раз программу сложения) в процессоре есть, поэтому это станет простым и хорошим примером того, как на самом низком уровне организованы циклические конструкции.

Пример цикла в языке Си.

При помощи языка С запишем решение этой задачи. Для начала установим значение исходных данных, это параметры линейной функции и значение переменной х. Конструкции, организующие многократное выполнение участка программы называются циклом, а многократно выполняющийся участок программы называют телом цикла. Тут начинается циклическая конструкция while.

Циклическая конструкция while
Циклическая конструкция while

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

Блок-схема алгоритма
Блок-схема алгоритма

К результату добавляется значение переменной a . Потом из переменной цикла вычитается единица. При вычитании бит переноса, он же флаг переноса, приобретает одно из двух значений. Если он равен 1, то продолжаем выполнение. При этом флаг переноса будет сброшен в 0. Следующая проверка заставит программу перейти к началу тела цикла. Чем это все обусловлено? Прежде всего тем, что команда условного перехода всего лишь одна и работает она именно так. После очередного выполнения тела цикла, скоро окажется, что флаг переноса 0. Тогда будет произведен выход из цикла к оставшимся операциям. Это добавления к результату b, вывод результата.

Бит переноса.

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

Появление бита переноса при вычитании
Появление бита переноса при вычитании

Как можно заметить, бит переноса при этом будет единичный, кроме одного случая. Этот случай вычитания единицы из 0. Таким образом, чтобы цикл выполнился три раза, переменная цикла должна будет иметь три значения. Это 2, 1, 0. После этого будет произведен выход из цикла. А еще это означает, что из переменной цикла нужно будет заранее вычесть 1.

Отладка программы цикла.

Выполним отладку программы после ее компиляции из исходного кода на языке C. На первом шаге в аккумулятор загружается значение x, он же переменная цикла. X лежит в 4 ячейке.

-7

Заранее вычитаем из него единицу. Сохраняем его обратно.

-8

Сейчас уже выполняется тело цикла. Заносим в аккумулятор промежуточное значение результата из ячейки 6. Добавляем к нему переменную. Сохраняем промежуточный результат.

-9

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

-10

Флаг переноса на первом выполнении тела цикла будет 1. Поэтому произойдет сброс флага и следующая проверка.

-11

Переход на начало тела цикла.

-12

Далее все повторится до тех пор, пока флаг переноса не станет нулевым.

После выхода из цикла остается добавить к результату b. Сохранить и вывести результат.

-13

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