Copyright (C) А.Гавва V-0.4w май 2004

Содержание

Авторские права.

Введение

Благодарности

Некоторые исторические сведения

История языка программирования Ада
Цели разработки

Применение языка программирования Ада


Часть 1. Обзор средств языка Ада.


1. Элементарные понятия.

1.1 "Сюрпризы" переводной терминологии
1.2 Первая программа
1.3 Библиотека и компилируемые модули
1.4 Лексические соглашения
1.4.1 Комментарии
1.4.2 Идентификаторы
1.4.3 Литералы
1.4.4 Зарезервированные слова
1.5 Методы Ады: подпрограммы, операции и знаки операций
1.6 Инструкции, выражения и элаборация
1.7 Директивы компилятора

2. Скалярные типы данных языка Ада

2.1 Введение в систему типов языка Ада
2.2 Целочисленные типы
2.2.1 Предопределенный тип Integer
2.2.2 Тип Universal_Integer
2.2.3 Описание целочисленных констант
2.2.4 Тип Root_Integer
2.2.5 Примеры целочисленных описаний
2.2.6 Предопределенные знаки операций для целочисленных типов
2.2.7 Модульные типы
2.2.8 Дополнительные целочисленные типы системы компилятора GNAT
2.3 Вещественные типы
2.3.1 Вещественные типы с плавающей точкой, тип Float
2.3.2 Вещественные типы с фиксированной точкой, тип Duration
2.3.3 Вещественные типы с десятичной фиксированной точкой
2.3.4 Типы Universal_Float и Root_Float
2.3.5 Пакеты для численной обработки
2.4 Преобразование численных типов
2.5 Перечислимые типы
2.5.1 Описание перечислимого типа
2.5.2 Предопределенный логический тип Boolean
2.5.3 Символьные типы Ады (Character, Wide_Character)
2.6 Типы и подтипы
2.7 Производные типы
2.8 Атрибуты

3. Управляющие структуры

3.1 Пустая инструкция
3.2 Инструкция присваивания
3.3 Блоки
3.4 Условные инструкции if
3.5 Инструкция выбора сase
3.6 Организация циклических вычислений
3.6.1 Простые циклы (loop)
3.6.2 Цикл while
3.6.3 Цикл for
3.6.4 Инструкции exit и exit when
3.6.5 Именованые циклы
3.7 Инструкция перехода goto

4. Массивы (array)

4.1 Простые массивы
4.1.1 Описание простого массива
4.1.2 Анонимные массивы
4.1.3 Организация доступа к отдельным элементам массива
4.1.4 Агрегаты для массивов
4.1.5 Отрезки (array slices)
4.1.6 Массивы-константы
4.1.7 Атрибуты массивов
4.2 Многомерные массивы
4.3 Типы неограниченных массивов (unconstrained array),
      предопределенный тип String

4.4 Стандартные операции для массивов
4.4.1 Присваивание
4.4.2 Проверки на равенство и на неравенство
4.4.3 Конкатенация
4.4.4 Сравнение массивов
4.4.5 Логические операции
4.5 Динамические массивы

5. Записи (record)

5.1 Простые записи
5.1.1 Описание простой записи
5.1.2 Значения полей записи по-умолчанию
5.1.3 Доступ к полям записи
5.1.4 Агрегаты для записей
5.1.5 Записи-константы
5.1.6 Лимитированные записи
5.2 Вложенные структуры
5.2.1 Поля типа массив
5.2.2 Поля записей типа String
5.2.3 Вложенные записи
5.3 Дискриминанты
5.3.1 Вариантные записи
5.3.2 Ограниченные записи (constrained records)
5.3.3 Неограниченные записи (unconstrained records)
5.3.4 Другие использования дискриминантов

6. Подпрограммы

6.1 Общие сведения о подпрограммах
6.1.1 Процедуры
6.1.2 Функции
6.1.3 Локальные переменные
6.1.4 Локальные подпрограммы
6.1.5 Раздельная компиляция
6.1.6 Подпрограммы как библиотечные модули
6.2 Режимы передачи параметров
6.2.1 Режим in
6.2.2 Режим in out
6.2.3 Режим out
6.2.4 Режим access
6.3 Сопоставление формальных и фактических параметров
6.3.1 Позиционное сопоставление
6.3.2 Именованное сопоставление
6.3.3 Смешивание позиционного и именованного сопоставления
6.4 Указание значения параметра по-умолчанию
6.5 Совмещение (overloading)
6.5.1 Совмещение подпрограмм (subprogram overloading)
6.5.2 Совмещение знаков операций (operator overloading)
6.5.3 Спецификатор "use type"

7. Пакеты

7.1 Общие сведения о пакетах Ады
7.1.1 Идеология концепции пакетов
7.1.2 Спецификация пакета
7.1.3 Тело пакета
7.2 Средства сокрытия деталей реализации внутреннего представления данных
7.2.1 Приватные типы (private types)
7.2.2 Лимитированные приватные типы (limited private types)
7.2.3 Отложенные константы (deferred constants)
7.3 Дочерние модули (child units) (Ada95)
7.3.1 Расширение существующего пакета
7.3.2 Иерархия модулей как подсистема
7.3.3 Приватные дочерние модули (private child units)

8. Переименования

8.1 Уменьшение длин имен
8.2 Переименование знаков операций
8.3 Переименование исключений
8.4 Переименование компонентов
8.4.1 Переименование отрезка массива
8.4.2 Переименование поля записи
8.5 Переименование библиотечного модуля

9. Настраиваемые модули в языке Ада (generics)

9.1 Общие сведения о настраиваемых модулях
9.1.1 Настраиваемые подпрограммы
9.1.2 Настраиваемые пакеты
9.1.3 Дочерние настраиваемые модули
9.2 Параметры настройки для настраиваемых модулей
9.2.1 Параметры-типы
9.2.2 Параметры-значения
9.2.3 Параметры-подпрограммы
9.4 Преимущества и недостатки настраиваемых модулей

10. Исключения

10.1 Предопределенные исключения
10.1.1 Исключение Constraint_Error
10.1.2 Исключение Numeric_Error
10.1.3 Исключение Program_Error
10.1.4 Исключение Storage_Error
10.1.5 Исключение Tasking_Error
10.2 Исключения определяемые пользователем
10.2.1 Описание исключения пользователя
10.2.2 Возбуждение исключений
10.3 Обработка исключений
10.3.1 Обработчики исключений
10.3.2 Распространение исключений
10.3.3 Проблемы с областью видимости
          при обработке исключений
          определяемых пользователем

10.3.4 Пакет Ada.Exceptions
10.4 Подавление исключений
10.4.1 Принцип подавления исключений
10.4.2 Выполнение подавления исключений

11. Организация ввода/вывода

11.1 Текстовый ввод/вывод
11.1.1 Пакет Ada.Text_IO
11.1.2 Искючения ввода/вывода
11.1.3 Файлы ввода/вывода по-умолчанию
11.1.4 Настраиваемые пакеты текстового ввода/вывода
11.2 Ввод/вывод двоичных данных
11.2.1 Пакет Ada.Sequential_IO
11.2.2 Пакет Ada.Direct_IO
11.3 Потоки ввода/вывода
11.4 Взаимодействие с командной строкой и окружением
11.4.1 Параметры командной строки
11.4.2 Переменные окружения программы

12. Ссылочные типы (указатели)

12.1 Ссылочные типы для динамической памяти
12.1.1 Элементарные сведения: описание, создание, инициализация
12.1.2 Структуры данных со ссылками на себя
12.1.3 Освобождение пространства динамической памяти
12.1.4 Пулы динамической памяти
12.1.5 Проблемы обусловленные применением ссылочных типов
12.2 Обобщенные ссылочные типы
12.2.1 Правила области видимости для обобщенных ссылочных типов
12.3 Ссылочные типы для подпрограмм
12.3.1 Правила области видимости ссылочных типов для подпрограмм
12.4 Низкоуровневая средства работы со ссылочными типами
       и физическими адресами памяти

13. Тэговые типы (tagged types)

13.1 Механизмы наследования
13.1.1 Расширение существующего типа данных
13.1.2 Описание переменных и преобразование типов
13.1.3 Примитивные и не примитивные операции над тэговыми типами
          Наследование операций

13.1.4 "Пустые" записи (null record) и расширения
13.1.5 Абстрактные типы и подпрограммы
13.2 Динамическое связывание и полиморфизм
13.2.1 Надклассовые типы (wide class types)
13.2.2 Проверка типа объекта во время выполнения программы
13.2.3 Динамическая диспетчеризация
13.2.4 Модель механизма диспетчеризации
13.2.5 Вызов переопределенной операции предка
13.2.6 Динамическая передиспетчеризация
13.2.7 Двойная диспетчеризация
13.3 Стандартные низкоуровневые средства, пакет Ada.Tags

14. Контролируемые типы (controlled types)

14.1 Общие сведения
14.2 Управление динамическими объектами
14.3 Счетчик использования
14.4 Блокировка ресурса
14.5 Отладка контролируемых типов
       Некоторые рекомендации

15. Многозадачность

15.1 Задачи
15.1.1 Типы и объекты задач
15.1.2 Инструкции задержки выполнения (delays)
15.1.3 Динамическое создание объектов задач
15.1.4 Принудительное завершение abort
15.1.5 Приоритеты задач
15.2 Взаимодействие задач
15.2.1 Концепция рандеву
15.2.2 Описание входов
15.2.3 Простое принятие обращений к входам
15.2.4 Простой вызов входа
15.2.5 Селекция принятия рандеву
15.2.6 Селекция вызова рандеву
15.2.7 Идентификация задач и атрибуты
15.2.8 Разделяемые (общие) переменные
15.3 Защищенные модули (protected units)
15.3.1 Проблемы механизма рандеву
15.3.2 Защищенные типы и объекты
          Защищенные подпрограммы

15.3.3 Защищенные входы и барьеры
15.3.4 Особенности программирования защищенных входов и подпрограмм
15.3.5 Атрибуты входов защищенных объектов
15.4 Перенаправление requeue
15.4.1 Проблема предпочтительного управления
15.4.2 Инструкция перенаправления в очередь requeue
15.5 Цикл жизни задачи
15.5.1 Создание задачи
15.5.2 Активация задачи
15.5.3 Завершение задачи
15.6 Прерывания
15.6.1 Модель прерываний Ады
15.6.2 Защищенные процедуры обработки прерываний
15.6.3 Пакет Ada.Interrupts
15.6.4 Приоритеты

16. Интерфейс с другими языками

16.1 Связь с другими языками в Ada83
16.2 Связь с другими языками в Ada95
16.2.1 Директивы компилятора
16.2.2 Интерфейсные пакеты
16.3 Взаимодействие с программами написанными на C
16.3.1 Численные и символьные типы
16.3.2 Строки языка C
16.3.3 Примеры организации взаимодействия с C

17. Низкоуровневые средства для системного программирования

17.1 Спецификация внутреннего представления данных
17.2 Привязка объекта к фиксированному адресу памяти
17.3 Организация доступа к индивидуальным битам


Часть 2. Идеология и рекомендации


1. Язык Ада - взгляд "сверху вниз"

2. Абстракция данных

2.1 Объектно-ориентированное программирование
2.2 Сущность абстрактного типа данных
2.2.1 Структура абстрактного типа данных
2.2.2 Средства Ады для работы с абстрактными типами данных
2.3 Пакеты в языке Ада
2.3.1 Пакеты как средство абстракции данных
2.3.2 Сравнение пакетов и классов

3. Общие приемы программирования

3.1 Абстракция стека
3.2 Приватное наследование
3.2.1 Абстракция очереди
3.2.2 Еще один пример стека
3.3 Использование настраиваемых модулей
3.3.1 Создание абстракций из настраиваемых абстракций
3.3.2 Настраиваемый модуль как параметр настройки
3.3.3 Тэговый тип как параметр настройки
3.3.4 Производный тип как параметр настройки
3.4 Построение абстракции путем композиции
3.5 Абстрагирование общей функциональности
3.6 Многоуровневые абстракции
3.7 Комбинирование абстракций, множественное наследование
3.7.1 Смешанное наследование
3.7.2 Родственное наследование
3.8 Пример программирования посредством расширения

4. Контекст, видимость и подсистемы

4.1 Контекст и видимость
4.2 Управление видимостью
4.3 Подсистемы

5. Элаборация

5.1 Код элаборации
5.2 Проверка порядка элаборации
5.3 Управление порядком элаборации

6. Трудности и рекомендации

6.1 "Сюрпризы" численных типов
6.2 Принудительная инициализация
6.3 Взаимно рекурсивные типы
6.4 Рекомендации по построению абстракций
6.4.1 Тэговые типы - не для всех абстракций!
6.4.2 Контролируемые или не контролируемые?
6.4.3 Никогда не используйте неинициализированные объекты
6.4.4 Создание и удаление объектов
6.4.5 Именование тэговых типов
6.4.6 Именование методов
6.4.7 Опасность наследования
6.5 Советы Паскаль-программистам
6.5.1 Описания и их последовательность
6.5.2 Структуры управления
6.5.3 Типы и структуры данных
6.5.4 Совместимость типов и подтипов
6.5.5 Параметры подпрограмм
6.5.6 Пакеты Ады и их соответствие модулям Паскаля
6.5.7 Использование "is"
        и символа точки с запятой ';'


Часть 3. Средства разработки


1. Средства разработки

1.1 Доступность средств разработки
1.2 Система Ада-компилятора GNAT

2. Установка GNAT

2.1 Установка GNAT на Windows
2.2 Установка GNAT на Linux
2.2.1 Установка бинарных файлов от ACT
2.2.2 Установка RPM-пакетов ALT

3. От исходного текста к загружаемому файлу программы

3.1 Соглашения GNAT по наименованиям файлов
3.1.1 Общие правила наименования файлов
3.1.2 Использование других имен файлов
3.1.3 Альтернативные схемы именования
3.2 Сборка первой программы
3.3 Три этапа сборки проекта
3.3.1 Опции компилятора
3.3.1.1 Проверка ошибок во время выполнения программы
3.3.1.2 Проверка ошибок в исходном тексте без компиляции
3.3.1.3 Обнаружение большого количества ошибок при компиляции
3.3.2 Связывание Ада-программы
3.3.2.1 Опции редактора связей gnatbind
3.3.2.2 Правила поиска файлов для gnatbind
3.3.3 Компоновка проекта
3.3.3.1 Компоновщик gnatlink
3.3.3.2 Опции компоновщика gnatlink
3.3.4 Утилита gnatmake
3.3.4.1 Опции gnatmake
3.3.4.2 Указание путей поиска файлов для gnatmake
3.3.4.3 Управление режимами gnatmake
3.3.4.4 Примечания для командной строки gnatmake
3.3.5 Связывание и линковка, утилита gnatbl
3.4 Сравнение моделей компиляции
3.4.1 Модели компиляции GNAT и C/C++
3.4.2 Модель компиляции GNAT и общая согласованная Ада-библиотека
3.5 Директивы конфигурации
3.5.1 Обработка директив конфигурации
3.5.2 Файлы директив конфигурации

4. Вспомогательные утилиты

4.1 Уменьшение затрат времени с помощью утилиты gnatstub
4.2 Утилита перекрестных ссылок gnatxref
4.3 Оценка "мертвого" кода с помощью утилиты gnatelim
4.4 Отслеживание состояния стека и обнаружение утечек памяти
      во время выполнения программы

4.4.1 Утилита gnatmem
4.4.2 Средства GNAT.Debug_Pools
4.5 Условная компиляция с помощью препроцессора gnatprep
4.6 Утилиты gnatpsys и gnatpsta
4.7 Произвольное именование файлов, утилита gnatname

5. Оптимизация проекта

5.1 Опции оптимизации компилятора
5.2 Средства оптимизации GNAT, используемые в исходном тексте
5.3 Оптимизация для специфического типа процессора

6. GNAT и библиотеки

6.1 Создание Ада-библиотеки
6.2 Установка Ада-библиотеки
6.3 Использование Ада-библиотеки
6.4 Перекомпиляция библиотеки времени выполнения GNAT

7. Средства управления проектами в системе GNAT

7.1 Файлы проектов GNAT
7.2 Примеры файлов проектов
7.2.1 Различные опции сборки и каталоги выходных результатов
        для общих исходных файлов

7.2.2 Использование внешних переменных
7.2.3 Импорт других проектов
7.2.4 Расширение существующего проекта
7.3 Синтаксис файлов проектов
7.3.1 Базовый синтаксис
7.3.2 Пакеты
7.3.3 Выражения
7.3.4 Строковые типы
7.3.5 Переменные
7.3.6 Атрибуты
7.3.7 Атрибуты как ассоциативные массивы
7.3.8 Конструкция "case"
7.4 Исходные, объектные и исполняемые файлы проекта
7.4.1 Каталог объектных файлов
7.4.2 Каталог исполняемых файлов
7.4.3 Каталоги исходных файлов
7.4.4 Имена исходных файлов
7.5 Импорт проектов
7.6 Расширение проекта
7.7 Обращение к внешним переменным в файлах проектов
7.8 Пакеты файлов проектов
7.9 Переменные импортируемых проектов
7.10 Схемы именования файлов
7.11 Проекты библиотек
7.12 Опции командной строки, относящиеся к файлам проектов
7.13 Инструментальные средства поддерживающие файлы проектов
7.13.1 Утилита gnatmake и файлы проектов
7.13.2 Управляющая программа gnat и файлы проектов
7.14 Расширенный пример
7.15 Диаграмма полного синтаксиса файлов проектов

8. Построение больших проектов

8.1 Использование утилиты GNU make
8.1.1 Общие сведения о GNU make
8.1.2 Использование утилиты gnatmake в файлах Makefile
8.1.3 Автоматическое создание списка каталогов
8.1.4 Генерация опций командной строки для gnatmake
8.1.5 Преодоление ограничения на длину командной строки
8.2 Переносимость в UNIX, пакеты GNU Automake и GNU Autoconf

9. Использование встроенного ассемблера

9.1 Общие сведения
9.1.1 Пакет System.Machine_Code
9.1.2 Различия в использовании внешнего и встроенного ассемблера
9.1.3 Особенности реализации компилятора GNAT
9.2 Особенности используемого ассемблера
9.2.1 Именование регистров процессора
9.2.2 Порядок следования операндов источника и приемника
9.2.3 Значения констант
9.2.4 Шестнадцатеричные значения
9.2.5 Суффиксы размера
9.2.6 Загрузка содержимого памяти
9.2.7 Косвенная адресация
9.2.8 Инструкции повторения
9.3 Использование пакета System.Machine_Code
9.3.1 Пример элементарной программы
9.3.2 Проверка примера элементарной программы
9.3.3 Поиск ошибок в коде ассемблера
9.3.4 Более реальный пример
9.3.5 Параметры вывода
9.3.6 Ограничения
9.3.7 Использование самостоятельно описываемых типов
9.3.8 Параметры ввода
9.3.9 Встроенная подстановка (inline) для кода на встроенном ассемблере
9.3.10 "Затирание" содержимого регистров
9.3.11 Изменяемые инструкции
9.4 Синтаксис GNAT

10. Отладка проекта

10.1 Директивы компилятора для отладки
10.2 Получение расширенной информации компилятора
10.3 Использование отладчика GNU GDB
10.3.1 Общие сведения об отладчике GNU GDB
10.3.2 Знакомство с командами GDB
10.3.3 Использование выражений Ады
10.3.4 Вызов подпрограмм определяемых пользователем
10.3.5 Исключения и точки прерывания
10.3.6 Задачи Ады
10.3.7 Отладка настраиваемых модулей
10.4 Ограничение возможностей языка

11. Дополнительные сведения о компиляторе GNAT

11.1 Некорректное завершение работы компилятора
11.2 Получение внутренней отладочной информации
11.3 Соглашения по наименованию исходных файлов GNAT


Часть 4. Приложения


1. Директивы компилятора.

1.1 Стандартные директивы Ады
1.2 Директивы определенные в реализации компилятора GNAT

2. Атрибуты типов.

2.1 Стандартно определенные атрибуты типов
2.2 Атрибуты типов определенные в реализации компилятора GNAT

3. Спецификация пакета System.

4. Спецификация пакета Standard.

5. Спецификации пакетов ввода/вывода.

5.1 Пакеты текстового ввода/вывода
5.1.1 Пакет Ada.Text_IO
5.1.2 Пакет Ada.Text_IO.Integer_IO
5.1.3 Пакет Ada.Text_IO.Modular_IO
5.1.4 Пакет Ada.Text_IO.Float_IO
5.1.5 Пакет Ada.Text_IO.Fixed_IO
5.1.6 Пакет Ada.Text_IO.Decimal_IO
5.1.7 Пакет Ada.Text_IO.Enumeration_IO
5.2 Пакет Ada.Sequential_IO
5.3 Пакет Ada.Direct_IO
5.4 Пакет Ada.Streams.Stream_IO

6. Глоссарий.

7. Литература.


Copyright (C) А.Гавва V-0.4w май 2004