Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 51
Текст из файла (страница 51)
Строго типизированные языки позволяют также обнаружить (в процессе выполнения) использование величин некорректных типов в переменных, которые могут содержать величины нескольких типов. Язык РОйТКА)9 не принадлежит к строго типизированным языкам, поскольку отношения между фактическими и формальными параметрами не подвергаются проверке соответствия типов. Кроме того, использование оператора е!701НАЬе!чСЕ между переменными различных типов позволяет переменной одного типа ссылаться на переменную другого тиПа. ПРИЧЕМ, ЕСЛИ На ОдНу ИЗ ПЕРЕМЕННЫХ, ВХОЛящИХ В ОПЕратОр Е001НАЬЕ!чСЕ, ССЫЛаЮтСя нлн присваивают ей значение, то система не может проверить тип этой величины.
Проверка типов переменных, входящих в оператор ЕО01НАЬЕНСЕ, фактически сводит на нет большинство достоинств этих переменных. Язык Рааса! относится к почти строго типизированным языкам, причем этим "почти" он обязан своей структуре вариантных записей, поскольку последние позволяют опускать метку, содержащую текущий тип переменной и являющуюся средством проверки корректного типа величины. Вариантные записи и потенциальные проблемы, возникающие при их йспользовании, рассматриваются в главе 5. Язык Ада также является почти строго типизированным языком. Ссылки на переменные. входящие в вариантные записи, динамически проверяются на наличие величин корректных типов. Это значительное усовершенствование по сравнению с языками Рааса! и Модо!а-2.
в которых проверка вообще невозможна и намного менее необходима. Однако язык Ада позволяет программистам нарушать правила проверки типов, вводя отдельное требование о временной отсрочке проверки лля конкретного преобразования типов. Такая отстрочка возможна только при использовании библиотечной функции СКСЦЕСКЕ!З СО!ЧНЕАЯ10!Ч. Эта функция, версия которой может существовать для любого типа данных, принимает переменную ее типа в качестве параметра и возвращает .
року битов, представляющую собой текущее значение этой переменной. Действительго преобразования при этом не происходит; это просто средство извлечения значения гсременной одного типа и использования его в качестве значения переменной другого 188 Глава 4. Имена, связывание, проверка типов и области видимости типа. Это может оказаться полезным в определяемых пользователем операциях по размещению переменных в памяти и освобождению памяти. при которых с адресами обращаются как с целыми числами, в то время как они должны использоваться как указатели.
Поскольку в функции НИСНЕСКЕО СОНм'ЕНЯ1ОН нет проверки типов. то за осмысленное использование переменных, полученных из этой функции, ответственность несет программист. Те же функции, что и функция (ЗНСНЕСКЕР СОНЧЕННЕОН языка Ада. выполняет имеющаяся в языке Модо(а-3 встроенная процедура ЕООРНО1 Е.
Языки С и С.ь.ь не относятся к строго типизированным языкам. поскольку в них допускается существование функций, тип параметров которых не проверяется. Более того, типы обьединений этих языков также не проверяются. Строго типизированным языком является язык М!., правда с некоторыми отличиями от императивных языков. В языке МЕ есть переменные, все типы которых известны статически или из объявлений, или из правил логического вывода типов, описанных в разделе 4.4.2.3. Язык Зама, хотя он в значительной степени создан на основе языка С++, является строго типизированным в том же смысле, что и язык Ада.
Типы могут приводиться явно, что может вызвать ошибку определения типа. Тем не менее, не существует неявных путей, позволяющих ошибкам определения типа остаться незамеченными. Правила приведения типов языка значительно влияют на результат проверки типов. Например, выражения в языке Рааса! являются строго типизированными. Несмотря на это, допускается использование арифметического оператора с одним операндом, являющимся числом с плавающей точкой (в языке Разса! называемым геа1) и одним целым операндом.
Значение целого операнда приводится к виду числа с плавающей точкой. и в результате получается операция над числами с плавающей точкой. Обычно это — именно то, что задумывал программист. Тем не менее, зто также приводит к потере одной из причин строгой типизации — обнаружения ошибок. Таким образом, приведение типов снижает результат строгой типизации. Языки, в которых широко используется приведение типов, например ГОНТНАХ, С и С++, значительно менее надежны, чем языки. в которых приведение типов применяется нечасто, например Аба. В языке Зама содержится в лва раза меньше разновилностей приведений типов, чем в языке С++. Подробнее вопрос приведения типов освещается в главе 6.
4.7. Совместимость тинов Понятие совместимости типов было опрелелено при освещении вопроса проверки типов. В данном разделе мы рассмотрим различные правила совместимости типов. Структура существующих в языке правил совместимости типов важна, поскольку она влияет на структуру типов данных и операции, производимые над величинами этих типов. Вероятно, важнейшим следствием того, что две переменные имеют совместимые типы, является то. что любой из них может быть присвоено значение другой.
Существуют лва различных вида совместимости типов: совместимость имен типов и совместимость структур типов. Совместимость имен типов (паще туре согора!!Ь|(!Зу) означает, что две переменные имеют совместимые типы только в том случае, если они были объявлены в одном объявлении или в объявлении, использующем одно и то же имя типа. Совместимость структур типов (зтгцсгоге гуре сотраЗ!Ь|)!зу) означает, что лве пе- 1В9 4.7.
Совместимость типов ременные имеют совместимые типы в том случае, если у нх типов одинаковые структуры. Существуют некоторые разновидности этих двух методов, и в большинстве языков используются комбинации различных способов. Совместимость имен типов легко реализуется, но крайне ограничивает программиста. При строгой интерпретации переменная, принадлежащая к ограниченному типу целых чисел, не будет совместимой с переменной, имеющей целый тип. Предположим, что в языке Рааса! используется строгая совместимость типов имен, и рассмотрим следующий фрагмент программы: Туре 1пбехгуре = 1.. 100; (ограниченный тип) чек соцпс : упсе9ег! 1пс1ех : 1пс)ехсурег Переменные соцпг и 1пс)ех не будут совместимы; значение переменной ооцпс не сможет присваиваться переменной 1пс!ех, и наоборот. Другая проблема, связанная с совместимостью имен типов, возникает при передаче структурированного типа между подпрограммами через параметры.
Такой тип должен определяться только один раз, глобально. Подпрограмма не может устанавливать тип подобных формальных параметров локально, как было в исходной версии языка Рааса!. Совместимость структур типов значительно более гибкая, чем совместимость имен типов, но гораздо сложнее реализуется. При определении совместимости имен типов должны сравниваться только имена двух типов, а при использовании совместимости структур типов — целые структуры двух типов.
Выполнить это сравнение не всегда легко. (Рассмотрите, например, такую структуру данных, ссылающуюся на собственный тип, как связный список.) При этом может возникнуть еше один вопрос. Являются ли, например, лва комбинированных или структурных типа совместимыми, если они имеют одинаковую структуру, но разные имена полей? Совместимы лн два одномерных массива в программе на языке Риса! или Ада, если они содержат элементы одного типа, но различаются областью значений индекса: 0 .. 10 и 1.. 1 1? Совместимы ли два перечислимых типа, если они содержат одинаковое число компонентов, но по-разному образовывают литеральные константы? Еще одной трудностью, связанной с совместимостью структур типов, является то, что она не признает различий между типами, имеющими одинаковую структуру.
Рассмотрим следующее объявление, которое могло бы появиться в программе на языке Разса1: суре се1здиа = геа1; 1апгепйеус геа1; Переменные указанных типов считаются совместимыми при проверке совместимости структур типов. Это позволяет им смешиваться в выражениях, что, очевидно, в данном случае нежелательно. Вообще, типы с различными именами, вероятнее всего, являются абстракциями различных категорий сущностей задачи, и не должны рассматриваться как эквивалентные. В исходном определении языка Рааса! (%птп, 1971) явно не устанавливается, когда должна использоваться совместимость структур типов, а когда — совместимость их имен.
Это крайне вредно для мобильности программ, поскольку программа, корректная в одной системе реализации языка, не должна быть некорректной в другой. Стандарт языка Разса!, созданный Международной организацией по стандартизации (180, 1982), явно з90 Глава 4. Имена, связывание, проверка типов и области видимости устанавливает правила совместимости типов лля данного языка, частично — по имени, частично — по структуре. В большинстве случаев используется структура, а имя применяется для формальных параметров и в некоторых других ситуациях.