Введение в систему типов языка Ада
Данные - это то, что обрабатывает программа. Практически, любой современный язык программирования определяет свои соглашения и механизмы для разделения данных на разные типы.
Известно, что Ада - это язык со строгой типизацией. И хотя это не единственное свойство Ады, но, пожалуй, это свойство наиболее широко известно.
Понятие типа данных Ады подразумевает, что:
- каждый тип данных имеет свое имя
- каждый тип данных имеет свое множество допустимых значений
- для каждого типа данных определено свое множество допустимых операций и знаков операций
- строгое разделение объектов одного типа данных от объектов любого другого типа данных
Исходя из сказанного, в отличие от других языков программирования, Ада не допускает
прямого присваивания значений одного типа данных другому типу данных и/или любого неявного преобразования значений одного типа в значения другого типа. В случае необходимости преобразования значений одного типа в значения другого типа можно указать (или описать) требуемое правило преобразования, но такое правило преобразования должно быть указано явно.
На первый взгляд, строгое требование явного указания или описания всех правил преобразования выглядит раздражающе (особенно для тех кто привык к С) - без явного указания таких правил компилятор просто отказывается компилировать вашу программу. Однако, в последствии это предохраняет от долгих и мучительных поисков, в процессе отладки, тех "сюрпризов" неявного преобразования и/или некорректного присваивания значений различных типов, которые допускаются в других языках программирования. Таким образом, подобный подход является одним из основополагающих факторов обеспечения надежности программного обеспечения.
Ада обладает достаточным набором предопределенных встроенных типов, а также предоставляет богатые возможности для описания новых типов данных и их подтипов (subtype). Кроме того, в языке представлены средства, которые позволяют гибко управлять внутренним представлением вновь создаваемых типов данных.
Приводимая ниже диаграмма демонстрирует общую организацию системы типов Ады.
Все типы | |- Простые типы | | | |- Скалярные типы | | | | | |- Вещественные (Real) | | | | | | | |- Универсальный Вещественный (Universal_Real) -- все вещественные | | | | -- литералы | | | | | | | |- Корневой Вещественный (Root_Real) -- только Ada95 | | | | | | | |- с плавающей точкой (Floating Point) | | | |- с фиксированной точкой (Fixed Point) | | | | | | | |- с обычной фиксированной точкой | | | | (Ordinary Fixed Point) | | | | | | | |- с десятичной фиксированной точкой -- только Ada95 | | | (Decimal Fixed Point) | | | | | |- Дискретные типы | | | | | |- Целые типы | | | | | | | |- Универсальный Целый (Universal_Integer) -- все | | | | -- целочисленные | | | | -- литералы | | | | | | | |- Корневой Целый (Root_Integer) -- только Ada95 | | | | | | | |- Знаковые Целые | | | |- Модульные Целые (Modular Integer) -- только Ada95 | | | | | |- Перечислимые | | | | | |- Символьные (Character, Wide_Character) | | |- Логический (Boolean) | | |- Определяемые пользователем | | | |-- Ссылочные типы / указатели (Access) | | | |- Ссылки на объекты | |- Ссылки на подпрограммы -- только Ada95 | |- Составные типы | |-- Массивы (Array) | | | |- Строки (String) | |- Другие, определяемые пользователем массивы | |-- Записи (Record) | |-- Тэговые Записи (Tagged Record) -- только Ada95 | |-- Задачи (Task) | |-- Защищенные типы (Protected) -- только Ada95 |
Примечательно, что, в отличие от языка Паскаль, Ада не предоставляет предопределенного механизма поддержки множественных типов. Однако, богатые средства описания типов Ады, при необходимости, позволяют программисту конструировать подобные типы без значительных усилий.