Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 62
Текст из файла (страница 62)
читающие программу, и компиляторы вынужлены пользоваться другой информацией. позволяющей определить, является ли выражение 1 в этом операторе присваивания вызовом функции или элементом массива. Если программу читает человек. то для него это может оказаться просто невозможным. Разработчики версий языка ГОКТКА1Ч. предшествовавших языку ГОКТКАХ 90, а также разработчики языка РЫ решили использовать круглые скобки лля обозначения 228 Глава 5.
Типы данных индексов массивов. поскольку в то время других удобных символов не было. Если в программах на этих языках встречается идентификатор. за которым следует выражение или список выражений в круглых скобках. компилятор определяет. является это обращением к массиву или вызовом функции. сопоставляя данное имя с именами всех массивов. обьявленных в среде ссылок. Если соответствия не обнаружено. то обращение считается вызовом функции.
Если нмя не соответствует локатьно определенной подпрограмме. то оно считается соответствующим подпрограмме. определенной во внешних модулях. Если произошло обрашеннс к массиву с прон>шенным объявлением. то компилятор не сможет обнаружить этот факт, поскольку в указанных языках используется раздельная компиляция, и подпрограмь1ы. использ>емые в программе. но определенные в другом модуле, не обязательно объявлять как внешние.
В языке Аба, также использующем круглые скобки для выделения параметров подпрограмм и индексов массивов. компилятор всегда способен определить. к какой сущности выполняется обращение; к массиву или к функции, поскольку он имеет доступ к информации (из ранее откомпилированных программ! обо всех именах блока комп ьтируемой программы, к которым можно обращаться.
Этим язык Ада отличается от версий языка ГОКТКАХ, предшествовавших версии ЕОКТКА1ч 90. и от языка РЕ Е в которых компилятор не имеет доступа к информации о ранее скомпилированных программах. Разработчики языка Аба преднамеренно выбрали круглые скобки лля выдечения индексов массивов — они хотели лобиться единообразия в выражениям, содержащих ссылки на массив и вызовы функций, несмотря на проблемы. возникающие при чтении программы. Выбор был слелан. исходя из того факта.
что и обращения к элементам массива. и вызовы функций являются отображениями. Обращения к элементам массива отображают индексы в отдельные элементы массива. Вызовы функций отображают фактические параметры в описание функции н. в конечном итоге, в значение функции.
В языках Разов!. С. С+я, Модо!а-2 и >ата для вьшеления индексов массивов используются квадратные скобки. Тип массива содержит лва различных типа; тип элемента и тнп индексов. Тнп индексов часто является полтипом целых чисел. хотя в языках Разса1. Модо!а-2 и Ада в качестве индексов могут использоваться переменные таких типов. как булевский, символьный и перечислимый. В ранних языках программирования неявной проверки выхода ннлекса за пределы допустимого диапазона не требовалось. Поскольку такие ошибки в программах встречаются часто. то соответствующая проверка повышает надежность языка. В современных языках программирования С.
С+ ' и РОКТКАН нет проверки выхода индекса за пределы допустимого диапазона, а в языках Рааса!. Ада и 3ача она есть. 5.$.3. Связывание индексов и категории массивов Связывание типа индекса массива с переменной массива обычно является статическим, но диапазон значений индексов иногла связывается динамически. В некоторых языках неявно задается нижняя граница лиапазона значений индексов. Например, в языках С. С++ и Зата нижняя граница всех диапазонов значений индексов равна нулю; в языках ГОКТКАХ 1, П и 1Ч она была зафиксирована на единице; в языках ГОКТКАХ 77 и РОКТКА!ч 90 она по умолчанию равна 1.
В большинстве других языков диапазоны значений индексов должны полностью задаваться программистом. 229 5.5.Массивы Как и скалярные переменные, массивы делятся на четыре категории. В этом случае распределение по категориям основано на связывании с диапазонами значений индексоь и с памятью. Повторимся, имена категорий указывают, котла и где вылеляется память.
Статическим массивом (жабе аггау) называется массив, в котором диапазоны значений индексов связываются статически и размещение в памяти также является статическим (происходит до выполнения программы). Достоинствами статических массивов является их эффективность: динамического размещения в памяти и удаления из нее не требуется. Фиксированным автоматическим массивом (Вхед з(ас)с-дупаш(с аггау) называется массив, в котором диапазоны значений индексов связываются статически. но размещение в памяти происхолит во время обработки объявлений при выполнении программы Достоинстввми массивов этого типа по сравнению со статическими явлветсв эффеятнв. ность использования памяти: большой массив одной процедуры может использовать т) же область памяти, что и большой массив другой процедуры, причем так может продолжаться до тех пор, пока обе процедуры не окажутся активными одновременно, Автоматическим массивом (з(ас)с-бупаш(с аггау) называется массив, в котором диапазоны значений индексов связываются статически, а.размещение в памяти — динамическое (происходит во время выполнения программы).
Однако после связывания диапазонов значений индексов и размещения массива в памяти и диапазоны, и адрес массива в памяти не изменяются в течение всей жизни переменной. Достоинством массивов этого типа по сравнению с двумя предыдущими является гибкость: не нужно заранее знать размер массива. Динамическим массивом ()зеар-купаю(с штау) называется массив, в котором связывание диапазонов значений индексов и размещение в памяти являются динамическими.
причем ячейки памяти, содержащие массив, за время жизни массива могут меняться сколько угодно. Достоинством этого типа массива по сравнению с вышеописанными является гибкость: размеры массива по мере необходимости могут увеличиваться и уменьшаться во время выполнения программы. Примеры всех четырех категорий массивов приведены в следующих абзацах. В языке РОКТКАХ 77 тип индексов связан с массивом во время разработки струит)- ры языка: все индексы принадлежат к целому типу.
Диапазоны значений индексов связываются статически; размещение в памяти также происходит статически; следовательно, массивы языка РОКТКА)ч относятся к статическим. Массивы, объявляемые в процелурах языка Рааса! и функциях языка С (в отсутствие спецификатора вааМ.о), являются примерами фиксированных автоматических массивов. Как показано ниже, массивы языка Аба могут быть автоматическими: СЕТ (ЫЯТ ЬЕ(Ч) ) дасйаке ЫЯТ : аккау (1..1 1ЯТ ЬЕИ) ос 1ИТЕЯЕК) Ьепдп (г В этом примере пользователь вводит в список массивов количество требуемых элементов, которые затем динамически размещаются в памяти при переходе к блоку с(ео1ака Когда выполнение доходит ло конца блока, массив Ы ЯТ из памяти удаляется. гзо Глава 5.
Типы данных В языке ГОКТКА)ч 90 предусмотрены динамические массивы. Размещаться в памяти и открепляться от нее они могут по требованию. Диапазоны значений индексов этих массивов могут изменяться при сохранении. улаленнн или повторном размещении массива в памяти. В языке ЕОКТКАХ 90, например, можно следующим образом объявить динамический массив: 1МТЕОЕК, А1,ЬОСАТАВЬЕ, АКВАУ (:,:) :: ИАТ В этом выражении выполняется объявление матрицы МАТ с элементами типа 1МТЕОЕК, которые могут линамически размещаться в памяти. Размещение в памяти залается оператором АЬЬОСАТЕ, например: йЬЬОСАТЕ (МАТ(10, ЫОМВЕК ОГ СОЬЗ)) Диапазоны значений индексов могут задаваться переменными программы или литералами.
Нижние границы диапазонов значений индексов по умолчанию равны 1. Удалить линамические массивы из памяти можно с помощью оператора ОЕАЬЬОСАТЕ: ОЕАЬЬОСАТЕ (ИАТ) Для увеличения или уменьшения существующего динамического массива его элементы слелует временно записать в другом массиве, после чего старый массив должен быть удален из памяти и повторно размещен в ней. но уже с новым размером. В языках С и С++ также прелусмотрены динамические массивы.
В массивах языка С могут использоваться станлартные библиотечные функции аа11оо и агав, выполняющие, соответственно, общие операции вылеления и освобождения динамической памяти. В языке С++ лля управления лннамической памятью используются операторы пеи и с1в1вка.
Поскольку в языках С и С++ нет проверки выхода индекса за пределы диапазона, то ллина массива не интересует систему поддержки выполнения программ, поэтому уменьшение и увеличение массивов выполняется легко. Как описывается в разделе 5.10.6, массивы интерпретируются как указатели на некоторый набор ячеек памяти, причем эти указатели могут быть пронумерованы.
Другой тип динамических массивов существует в языке Рег!. Эти массивы растут при присваивании значений элементам, находящимся за текущим последним элементом. Уменьшение же массива происходит при присвоении ему пустого множества, задаваемогосимволами ( ). В исхолной версии языка Рааса! диапазон или диапазоны значений индексов массива являлись частью его типа. Это, наряду с использованием эквивалентности имен, обеспечивающим совместимость, запрещало существование подпрограмм, обрабатывающих массивы различной длины.