Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 84
Текст из файла (страница 84)
Язык Ас)а вводит дополнительные ограничения, состояшне в том, что списки констант лолжны быть исчерпывающими. обеспечивая немного большую належность, поскольку это предотврашает ошибки, вызванные неумышленным пропуском одной или нескольких констант. В выражениях оператора саве допускаются только целые и перечнслимые типы.
Большинство операторов сазе в языке Ада содержит оператор огцекз. позволяюший гарантировать, что список констант является исчерпывающим. Оператор сазе языка РОКТКАХ 90 похож на оператор саве языка Ада. Во многих случаях конструкция саве неприемлема для многовариантного выбора. Например, если выбор должен быть сделан на основе булевского выражения, а не некоторого порялкового типа, можно использовать вложенные лвухвариантные операторы ветвления для молелнровання многовариантного оператора ветвления. Чтобы избежать плохой читабельности программ, возникаюшей из-за глубоко вложенных лвухвариантных операторов ветвления, такис языки, как ЕОКТКАХ 90 и Ада, были расширены. Расширения позволяют пропускать некоторые ключевые слова. В частности, последовательности е1зе-дх заменяются одним ключевым словом, а замыкающее ключевое слово вложенного оператора кк отбрасывается. В этом случае вложенный оператор 316 Глава 7. Структуры управления нс уровне операторов .-етвления называется оператором е1здк.
Рассмотрим следуюшую конструкцию вета;чик в языке Аба: хЕ СОПИТ < 10 Кззеп ВА61: = ТКПЕ; е1зхЕ СОПИТ < 100 КЗзеп ВА62 := ТКПЕ; е1здЕ СОПИТ < 1000 Креп ВА63 := ТКПЕ; а 1Ег з эквивалентна следуюшей конструкции: хГ СОПИТ < 10 сЬеп ВА61 := ТЕПЕ; е1зе 1Е СОПИТ < 100 сззеп ВА62 := ТКПЕ; е1зе 1Е СОПИТ < 1000 Вйеп ВА63 := ТКПЕз а 1Е; епс1 1кз епсз дйг !!з этих двух вариантов версия е1зхк более читабельна.
Отметим. что данный приер довольно непросто моделируется с помощью оператора сазе. поскольку выбор каго оператора произволится на основе булевского выражения. Слеловательно, констция е1здЕ не является избыточной формой оператора оазе. В действительности, ни злн из операторов многовариантного ветвления в современных языках не распростратак, как оператор 1Е-к!зеп-е1здЕ. Описание операционной семантики обшего ";ратора ветвления на основе операторов е1здЕ, в котором буквы Е с цифрами обо-зчают логические выражения.
а буквы Ь с цифрами — операторы, приведено ниже: 1Г Е1 дово 1 Ы Е1 дово 1 51 досо оцс 62 досо оцв -, описание позволяет увидеть разницу между структурами многовариантного еетьле. и конструкциямн е1здЕ. Она заключается в том. что в конструкции многовариантветвления все выражения, обозначенные буквами Е, можно свести к сравнениям ..
лу значениями отдельных выражений н некоторыми другичн значениями. Языки, не включающие в себя конструкцию е1здЕ, могут использовать ту же управ-' шую структуру, лишь с ненамного большим количеством типов. Конструкции е1здЕ основываются на обшей математической конструкции — услов- и выражении. Функциональные языки программирования. которые будут обсуждаться лаве !4, часто используют условные выражения в качестве одной из основных управ:юшнх конструкций. 31У .3.
Операторы ветвления 7.4. Операторы цикла Операторы цикла (йегабче згаге>пепгз) — это операторы, вынуждающие оператор или набор операторов выполняться один и сколько угодно раз, или не выполняться ни разу. Бажлый язык программирования, начиная с языка Р!апхаЫ1, содержал некоторый метод дзя повторения выполнения сегмента кола. Если бы цикл был невозможен, программист был бы вынужден указывать каждое действие в последовательности операторов: полезные программы стали бы огромными, а их написание заняло бы громадный объем времени. Новгоряюшееся выполнение операторов часто реализуется в.функциональных языках с помошью рекурсии, а не итеративных структур. Рекурсия в функциональных языках будет оос) ждаться в главе 14.
Первые циклические конструкции в языках программирования были непосредственно свя>аны с массивами. Это было следствием того факта, что на заре компьютерной эры выч>мления были пренмушественно числовыми по своей природе н часто использовали циклы .шя обработки данных, хранящихся в массивах. Было разработано несколько видов операторов управления циклами. Основные виды э> и..
операторов зависели от того, как разработчик решал две главные проблемы проек>ирования, ° Еак осушествляется управление циклом? ° В какол>месте цикла находится механизм управления? Основные возможности управления циклом — логические выражения, индексирование или комбинация этих способов. Основные способы расположения механизма управления -- в начале цикла или в конце цикла. Начало и конец цикла — это логические, а не физические понятия.
Вопрос заключается не в физическом размещении механизма управ>» ния. а в том, может ли этот механизм выполняться и осуществлять управление перез плп после выполнения тела цикта. Третья возможность, позволяющая пользователи> сачочу решать. где разместить механизм управления циклом, обсуждается в разделе 7.4 3. Тело цикла — это набор операторов, выполнение которых управляется опера>ором цикла. Мы используем термин предварительная проверка (рге1езг) для того, чжюы отметить тот факт. что проверка условия завершения цикла осуществляется после выполнения тела цикла, а термин последующая проверка (розпезг) означает, что эта проверка производится после выполнения тела цикла.
Оператор цикла и связанное с ним тело цикла вместе образуют итеративную конструкцию (йегабоп сопзггцсг). Броме основных операторов цикла, мы обсудим также альтернативную форму, которая сача по себе принадлежит некоторому классу операторов — определенным пользова>елец механизмам управления циклом. 7.4.1.
Циклы со счетчиком Оператор цикла со счетчиком имеет переменную, называемую счетчиком цикла (1оор тзпаЫс), в которой хранится значение счетчика. Он также обладает некоторыми срем сэип лля указания начального и конечного значений счетчика цикла и разности ч>ж.>з юслезовательными значениями счетчика цикла, которую часто называют величинои шага. Начальное и конечное значения счетчика, а также величина шага цикла назъ>еав . я параметрамн цикла. Глава 7. Структуры управления иа уровне операторов 418 : 1есчотря на то что логически управляемые циклы имеют более обший вил, чем пик;о счетчиком, это не значит, что они более широко используются.
Поскольку циклы . четчиком сложнее, к их разработке предъявляются повышенные требования. .]палы со счетчиком часто поддерживаются машинными командами. К сожалению. зьютерная архитектура зачастую переживает методы программирования, бывшие гчшствуюшими во время разработки этой архитектуры. Например. в компьютерах -'.Х есть команда, очень удобная лля реализации циклов со счетчиком и последуюшей ...веркой, которая была в языке РОКТКАХ во время проектирования этих компьютеОднако сейчас язык ГОКТКАХ больше не содержит такого цикла, в то время как . "пьютеры ЧАХ стали широко распространеннымн.
Конечно, языковые конструкции намного переживают машинную архитектуру. Начер. автору неизвестен ни один современный компьютер, который имел бы трехвачтную команду ветвления для реализации арифметического оператора '.: языка - . КТКАХ. 7.4. 1.1. Вопросы разработки Природа счетчика цикла и параметров цикла вызывает много вопросов. Типы счетчиикла и параметров цикла, очевидно, должны быть одинаковыми или. по крайней чс;овместимыми, но какие именно типы следует считать допустимыми" .Одно из оче.- =иых решений — целые числа, но как насчет перечислимых и символьных типов, а -;" +е чисел с плавающей точкой".
Другой вопрос заключается в том, является ли счетчик . - зз обычной переменной с точки зрения области видимости или у него должна быть .:-. з специальная область видимости. Связан с вопросом об области видимости и вопрос -. ч. какое значение имеет счетчик цикла после его завершения. Разрешение пользова.:.ю изменять счетчик или параметры цикла внутри цикла может привести к созланию "а. очень трудного для понимания, поэтому следуюший вопрос состоит в том. компен. г?ет ли дополнительная гибкость. созданная таким решением, повышенную слож-;ть. Аналогичный вопрос возникает и в отношении того, сколько раз и когда конкретзычисляются параметры цикла: если они вычисляются только олин раз.
это привозит : -ростым, но менее гибким циклам. Эти вопросы можно сформулировать следуюшим образом. ° Какой тип и какую область видимости имеет счетчик цикла! ° Чему равен счетчик цикла после завершения цикла? ° Следует ли разрешать изменения счетчика и параметров цикла внутри цикла. и если да, влияет ли такое изменение на управление циклом". ° Следует ли вычислять параметры цикла только олин раз или это след! ет лслаз ь ~ ш каждой итерации? 7.4.1.2. Оператор РО е языках РОЯТЯАИ 77 и ЕОЯТЯАИ 90 Язык ГОКТКАХ !содержал оператор со счетчиком 00, оставшийся без изиенсния а ыыках ЕОКТКАХ 11 и! Ч. Этот оператор имел последуюшую проверку, что отличгшо его , т циклов со счетчиком во всех других языках программирования.
Обший аид кго~ о оператора приведен ниже: О метка переменная = начальное значение, конечное значили величина шага] 319 7.4. Операторы цикла Здесь метка — последний оператор в теле цикла, а величина шага, если она не указывается явно, по умолчанию равна 1. Параметры цикла могут быть лишь беззнаковыми целымн константалзи или простыми целыми переменными, принимающими положительные значения. Оператор 00 языка ГОКТ)(АН 77 по внешнему виду похож на аналогичный оператор языка РО)(ТВАХ!Ч, за исключениел~ последующей проверки условий. Счетчик цикла может иметь типы 1ЫТЕСЕЕ, йЕА или 000йьЕ-РйЕ01010)Ч.