7.2. ПОТОКОВАЯ ОБРАБОТКА
327
Например, во фрагменте
for ( i = 0; i < 100; i++ )
...
оператор,обозначенный многоточием, выполняется при i, равном 0,1, ...,99.
i —это параметр данного цикла. В других языках параметр цикла —понятие,
выделенное синтаксически. Например, в языке
Pascal
for i:=0 to 99 do S
переменная
i
внутри
S
имеет статус параметра цикла.В частности, явное при-
сваивание ей нового значения сигнализируется транслятором как серьезное
предупреждение. В языке
Алгол-68
цикл имеет еще более изощренную фор-
му:
for i from 0 to 99 while P<i> do S<i> od
Соответственно, здесь конец цикла отмечен скобкой, парной к его началу,
параметр цикла выделен явно и, более того, чтобы окончательно исключить
недоразумения, объявляется константой, которая описана данным операто-
ром и имеет областью действия лишь условие
P
и оператор
S
. Так что все
вопросы, связанные с присваиванием параметру цикла, отпадают сами со-
бой. Естественно, что при следующей итерации значение параметра цикла
будет новым, а после выхода из цикла любым способом параметр просто пе-
рестает существовать, и вопрос о его последнем значении также сам собой
отпадает. Решение, принятое в языке
Ada
, синтаксически ближе к решению
Алгола-68
, а семантически — к принятому в языке
Pascal
.
Если переменная
i
будет размещена на быстром регистре, то цикл будет
выполняться быстрее по сравнению со случаем размещения этой перемен-
ной в основной памяти. Возможно, что цикл допускает другой порядок пе-
ребора итераций с эквивалентными результатами счета, а для вычислитель-
ной машины этот другой порядок окажется более эффективным.Выясняются
подобные свойства при анализе оператора цикла, учет их весьма желателен
для качества объектного кода, и поэтому преобразование цикла (в качестве
неявной процедуры) вставляется в оптимизацию, производимую промыш-
ленными трансляторами.
9
Чтобы позволить транслятору осуществлять оптимизирующие преобра-
9
Эта услуга порою превращается в медвежью, поскольку автор программы может даже
не подозревать, что итерации цикла идут, по решению “сверхкомпетентного” транслятора, в
другом порядке. Тем более бывает шокирован программист, когда после вставки в цикл вро-
де бы ничего не меняющего оператора программа перестает работать в том месте, где она
уже была полностью отлажена, а затем, после череды панических хаотических изменений,
внезапно вновь начинает работать как надо. А последствия паники и хаоса будут расхлебы-
ваться еще долго...