Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 61
Текст из файла (страница 61)
Настраиваемые реализации пакетов рассматриваются в главе 10. ТИПЫ ВООЕЕА)ч И СНАВАСТЕК яЗЫКа Ада В дЕИСтВИтЕЛЬНОСтИ яВЛяЮтСя ВСтрОЕННЫМИ -еречислимыми типами. Обычными операциями с перечислимыми типами являются оп"езеление предшествующего и последуюшего элементов, позиции в списке величин и чачеиия данной позиции. В языке Рааса( все эти операции прелоставляются встроениыи функциями. Например, значение функции ргес((Ь1це) равно тес). В языке Аба эти зерации являются атрибутами. Например.
значение ЕЕТТЕА' РВЕО ( ' В' ) равно 'А'. 5.4.1.2. Оценка Перечислимые типы способствуют повышению и читабельности. и надежности про-змм. Читабельность улучшается непосредственно: именованные значения легко разли. тся, тогда как закодированные — нет. Закодированные элементы бессмысленны для .:х. за исключением автора программы. Предположим, что программе, написанной на ..:ке ГОКТКАХ, потребовалась переменная. принимающая значения десяти различных .- гтов. Вероятнее всего, названия цветов булуг заколированы в зиле целых чисел. с ис.ьзованием значений 1, 2, .... 10. Целочисленные значения. использованные для кодизки.
мало осмысленны. Если. например. константа 4 обозначает голубой цвет. и это -.чение присваивается переменной, то этот факт булет совсем не очевидным для чита- ..~ программы. ' точки зрения надежности перечислимые типы предоставляют лва преимущества. -первых, если целая переменная используется программистом лля кодирования.
тре- шего очень небольшого полдиапазона целых значений. то может появиться ошибка зззона. которая не будет обнаружена системой поддержки исполнения программ. на«ср, при использовании в программе команды "со1ог 121 Во-вторых, допускается 225 -' Порядковые типы, определяемые пользователем применение любого арифметического оператора к закодированным дням и любым целым числам, поскольку типы этих величин будут совпадать.
Это исключает обнаружение компилятором многих логических ошибок и опечаток, связанных с закодированными данными. (Поскольку в языках А)ч5! С и С++ перечислимые переменные рассматриваются как целые переменные, то ни одного из этих преимуществ данные языки не имеют.) Таким образом, использование вместо целого типа перечислимых типов, подобных определенному выше типу РЕТТЕКЯ языка Ада, ограничивающих присваиваемые значения небольшим диапазоном, улучшает читабельность и обеспечивает проверку типов. Типы епцт (перечислимые типы) языков С и С++ в язык )ака не включены. 5.4.2. Ограниченные тины Ограниченным типом (зцЬгапйе гуре) называется непрерывная подпоследовательность порядкового типа. Например, тип 12 ..
14 является ограниченным целым типом. Впервые ограниченные типы появились в языке Рааса), также они имеются в языках Модо)а-2 и Ада. Особых вопросов, связанных с разработкой ограниченных типов, не существует. 5А.2Л. Струкзураз В языке Разов! объявление ограниченного типа выглядит следующим образом: Щу)ре цррегсаве = 'А'..'2'; Тпс)ех = 1..100; Связь ограниченного типа с его родительским типом устанавливается путем сопоставления величин в определении ограниченного типа с соответствующими величинами в ранее объявленном или встроенном порядковом типе.
Тип цррегсаве в приведенном выше примере определен как ограниченный встроенный тип отдельных символов. Тип Тпс)ех определен как ограниченный тип целых чисел. В языке Ада ограниченные типы относятся к классу подтипов. Как указывалось в главе 4, подтипы не являются новыми типами, они лишь дают новые имена ограниченным версиям существующих типов. Предположив, что тип РАХЯ определен так же, как и в предылушем разделе, запишем следующее: аиЬФХ)ре ХЕЕКРАХЯ Еа РАХЯ галде Моп.. Ггд; ацЬСуре 1ИРЕХ ха 1нТЕЯЕК галде 1..100; В этих примерах сужение существующих типов касается лиапазона возможных значений. Все операции, определенные лля породившего типа, определены и для подтипа, за исключением операции присваивания значений, не входящих в заданный диапазон.
В следующих командах РАХ1 : РАХЯг РАХ2 : ЫЕЕКРАХЯ! РАХ := РАХ1; присваивание разрешено только до тех пор, пока значение переменной РАХ1 равно Яас или Яцп. В языках Рааса! и Моди)а-2, как и в языке Ада, подтипы наследуют все операции, разрешенные родительскому типу. 226 Главе б. Типы донных Определяемые пользователем порядковые типы чаше всего используются в качеств» индексов массивов. как это булет показано в разделе 5.5. Они также могут использоваться в качестве переменных никла. В языке Аба, например, полтины порядковых типов являются единственным способом указания переменных цикла Еок. Отметим, что в язьпсе Аба ограниченные типы значительно отличаются от производных типов, рассмотренных в главе 4.
Рассмотрим следующие обьявления типов: суре РЕВ1НЕР ЯМАЕЕ 1ИТ Зв пеи 1ИТЕ6ЕВ хапае 1,.100; виЬсуре ЯРВРАИЯЕ ЯМАЕЕ 1ИТ Дв 1ИТЕ6ЕВ капде 1..100; Переменные обоих типов, РЕВ1НЕР ЯМАЛЕ 1ИТ (производный тип) и ЯРВВАи0е ЯИА' е 1ит (ограниченный тип), наслелуют область значений и операции над переменными типа 1ИТЕВЕВ, Тем не менее, переменные типа РЕВ1НЕР ЯМАЕЕ 1ИТ не совместимы ни с каким типом 1ИТЕРЕВ, тогда как переменные типа ЯРВВАИРЕ ЯМА'Е 1И совместимы с переменными и константами типа 1ИТЕВЕВ и любого подгнив этого типа. 5.4.2.2.
Оценка Ограниченные типы улучшают читабельность программ. показывая, что переменные подтипа могут солержать только определенный диапазон значений. Надежность при использовании ограниченных типов увеличивается, поскольку присвоение переменной такого типа некоторого значения, лежащего вне заданного диапазона, диагностируется компилятором (если присваиваемое значение является литеральной величиноЯ) или системой поддержки выполнения программ (если это переменная или выражение) как ошибка.
$.4.3. Реализация порядковых типов, определяемых пользователем Для того чтобы реализовать перечислимые типы, следует установить соответствие между неотрицательными целым числами и символьными константами. Обычно первое из перечисляемых значениЯ представляется числом О, второе — числом 1 и так далее. Понятно, что операции с переменными перечислимых типов значительно отличаются от операций с целыми числами, исключением являются только операторы отношений, илентичные для обоих случаев. Как указывалось ранее, перечислимые типы языков АХЯ1 С и С++ часто рассматриваются как целые типы. Ограниченные типы реализуются так же, как и породившие их типы, за исключением того, что в каждом операторе присваивания и в каждом выражении, которые содержат переменную ограниченного типа, компилятор должен выполнять неявную проверку выхода значения переменной за пределы допустимого диапазона. Это увеличивает размер программы и время ее выполнения, но обычно с этим смиряются.
Кроме того, хорошо оптимизированный компилятор может минимизировать количество проверок. 5.5. Массивы Массивом (аггау) называется однородное множество данных, а котором каждый отдельный элемент идентифицируется его положением по отношению к первому элементу. Обращение к элементу массива в программе часто содержит один или несколько переменных индекса. Такие ссылки следует вычислять во время выполнения. чтобы опреде- 22У 5.5.Массивы лить область памяти, к которой производится обращение.
Отлельные элементы массива принадлежат к олному нз ранее определенных типов, элементарному или определенному пользователем. Всеобщая потребность в массивах очевидна, поскольку большинство компьютерных программ должны моделировать множества. состоящие из величин, значения которых принадлежат одному типу и могут одинаково обрабатываться. 5.5.1. Вопросы разработки Ниже перечислены основные вопросы разработки, характерные для массивов. ° Какие типы могут иметь индексы? ° Проверяется ли выход индекса за пределы лопустнмого диапазона в инлексированных обращениях к элементам? ° Ограничены ли области значений индексов? ° Когда массив размещается в памяти'! ° Какое количество индексов разрешено? ° Могут ли массивы инициачизнроваться после размещения нх в памяти? ° Какие разновидности сечений массивов допускаются и допускаются ли они вообще? В следующих разделах обсуждаются примеры проектных решений, касающихся массивов, принятые в самых распространенных языках прочраммирования.
5.5.2. Массивы и индексы Обращение к определенным элементам массива выполняется с помощью двухуровневого синтаксического механизма. первой частью которого является имя масссива, а второй— динамический селелтор. состоящий из одного или нескольких индексов (зцЬзспргз, адехез). Если все индексы являются константами, то селектор является статическим. в противном случае — линамическнч. Выборку можно представить как отображение имени массива и множества значений инлексов в элемент массива.
Массивы иногда называют конечными отображениями. Условно это отображение можно записать в следующем виде: имя массива(список значений индексов) -Ф элемент Синтаксис обращений к массиву является универсальным: за именем массива следует список индексов, заключенный в круглые нли квадратные скобки.
Проблема, возникающая при использовании круглых скобок, заключается в том, что они часто применяются :щя выделения параметров в вызовах подпрограмм. От этого ссылки на элементы массива становятся похожими на вызовы подпрограмм. Рассмотрим следующий оператор присваивания в языке ГОКТКАМ: ВВМ = ВОМ ч В<1> Поскольку в языке ГОКТКА1Ч круглые скобки используются и для параметров подпрограмм. н для индексов массивов. то и люли.