Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ооп экзамент.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
235.52 Кб
Скачать

5.Роль типов данных и их становление

Параллельным явлением в совершенствовании техники программирования стало развитие концепции типа данных. Это понятие стало одним из ключевых понятий языка программирования в начале 70-х годов. С ним связаны как проблематика новых языков программирования, так и методические аспекты использования средств программирования. Введение этого понятия в программирование обусловлено практикой восприятия действительности человеком. Сталкиваясь в своей жизни и деятельности с объектами различной природы, он привык классифицировать их, объединять в одну группу объекты со сходными признаками и применять к ним одни и те же способы обработки, наиболее им свойственные (например, числа обрабатываются одними операциями, а строки – другими). Ранние языки программирования, такие как Fortran и Algol-60, обеспечивали небольшой набор стандартных типов данных, необходимых для решения математических задач. Коренным образом ситуация изменилась на рубеже 70-х годов, когда применение ЭВМ вышло за рамки математических задач, что потребовало от языков программирования более мощных средств моделирования по сравнению со средствами стандартных типов данных. Поэтому такие языки программирования, как PL-1, Algol-68 и Pascal, были оснащены механизмами конструкторов типов данных, позволяющими определять в программе необходимое количество типов массивов, типов записей, типов множеств, типов файлов и т.п. Типы данных, порождаемые конструкторами типов, обычно называются структурными типами данных. Их использование позволяет упростить работу программиста при отображении структур обрабатываемых данных на структуры, предлагаемые языком программирования и тем самым сократить объем рутинной работы при написании программы. Важно отметить, что при работе со структурными данными конкретного типа данных программист пользуется операциями, предоставляемыми этим типом данных (например, выборка элемента по индексу в массиве или выборка поля по его имени в записи). Тем не менее ограниченное количество конструкторов типов не позволяет адекватно представить в программе любой необходимый тип данных с тем наборам операций, который естественно отражает семантику данного типа данных. Например, оба и тип даты, и тип лица могут быть представлены на Паскале типом записи и тогда программист будет работать с ними, используя операции типа записи. В то же время даты и лица – совершенно разные сущности с совершенно разным поведением (например, можно увеличить дату на единицу, а лицо сочетать браком с другим лицом), учет чего может существенно снизить сложность программы и усилить ее понимаемость. Чтобы дать программисту возможность определять в программе нужные ему типы данных (в дополнение к стандартным и структурным типам данных), в 70-х годах была разработана концепция абстрактных типов данных, обладающих интерфейсом и реализацией. Вся необходимая пользователю информация (имена операций, типы их параметров и типы результатов) сосредотачивалась в доступном ему интерфейсе, а детали реализации типа данных (представление его значений посредством значений известных типов данных и тела операций) были скрыты от него. Реализация типа данных в свою очередь, состоит из представления и тел операций. Интерфейс типа данных предоставляет пользователю информацию об именах и профилях операций. Имя операции – это либо идентификатор, либо – специальный символ (знак). Профиль операции указывает имена типов аргументов и типа результата операции. Если интерфейс типа данных фиксируется автором языка программирования, а реализация – разработчиком компилятора (интерпретатора), то такой тип данных называется встроенным, или стандартным. Если же и интерфейс и реализация создаются программирующим на данном языке, то такой тип данных называется произвольным, или пользовательским. Представление встроенного типа всегда выражается каким-то количеством байтов памяти. Поскольку представление пользовательского типа в конечном итоге может быть выражено в байтах, имеет смысл операция определения размера типа данных. Например, в С++ операция sizeof(T) вырабатывает количество байтов, занимаемых значением типа Т. Как встроенные, так и пользовательские типы данных разделяются, в свою очередь, на конкретные и родовые (параметризованные) типы. Конкретный тип характеризует определенное множество значений, он не требует дальнейшего уточнения и готов к непосредственному использованию. Родовой тип характеризует множество множеств значений, он обладает параметрами и требует конкретизации путем подстановки аргументов. Фактически, родовой тип – это функция высокого уровня (типовая функция), порождающая типы данных с родственными интерфейсами. Другой вариант родового типа данных – это макрос, который в результате макроподстановки превращается в определение конкретного типа данных. По последнему варианту трактуются шаблоны в C++.