Предисловие | 5 |
|
ЧАСТЬ 1. ВВЕДЕНИЕ В ЯЗЫКИ ПРОГРАММИРОВАНИЯ |
|
Глава 1. Что такое языки программирования | 11 |
1.1. Некорректный вопрос | 11 |
1.2. Процедурные языки | 13 |
1.3. Языки, ориентированные на данные | 18 |
1.4. Объектно-ориентированные языки | 22 |
1.5. Непроцедурные языки | 23 |
1.6. Стандартизация | 24 |
1.7. Архитектура компьютера | 25 |
1.8. *Вычислимость | 28 |
1.9. Упражнения | 29 |
|
Глава 2. Элементы языков программирования | 30 |
2.1. Синтаксис | 30 |
2.2. * Семантика | 32 |
2.3. Данные | 34 |
2.4. Оператор присваивания | 35 |
2.5. Контроль соответствия типов | 36 |
2.6. Управляющие операторы | 37 |
2.7. Подпрограммы | 37 |
2.8. Модули | 38 |
2.9. Упражнения | 39 |
|
Глава 3. Среды программирования | 41 |
3.1. Редактор | 42 |
3.2. Компилятор | 42 |
3.3. Библиотекарь | 45 |
3.4. Компоновщик | 46 |
3.5. Загрузчик | 47 |
3.6. Отладчик | 47 |
3.7. Профилировщик | 48 |
3.8. Средства тестирования | 49 |
3.9. Средства конфигурирования | 49 |
3.10. Интерпретаторы | 50 |
3.11. Упражнения | 51 |
|
ЧАСТЬ 2. ОСНОВНЫЕ ПОНЯТИЯ |
|
Глава 4. Элементарные типы данных | 53 |
4.1. Целочисленные типы | 53 |
4.2. Типы перечисления | 58 |
4.3. Символьный тип | 62 |
4.4. Булев тип | 63 |
4.5. * Подтипы | 64 |
4.6. * Производные типы | 66 |
4.7. Выражения | 67 |
4.8. Операторы присваивания | 71 |
4.9. Упражнения | 73 |
|
Глава 5. Составные типы данных | 75 |
5.1. Записи | 75 |
5.2. Массивы | 78 |
5.3. Массивы и контроль соответствия типов | 81 |
5.4. * Подтипы массивов в языке Ada | 84 |
5.5. Строковый тип | 85 |
5.6. Многомерные массивы | 87 |
5.7. Реализация массивов | 88 |
5.8. * Спецификация представления | 92 |
5.9. Упражнения | 96 |
|
Глава б. Управляющие структуры | 99 |
6.1. Операторы switch и case | 99 |
6.2. Условные операторы | 104 |
6.3. Операторы цикла | 109 |
6.4. Цикл for | 112 |
6.5. «Часовые» | 118 |
6.6. * Инварианты | 119 |
6.7. Операторы goto | 121 |
6.8. Упражнения | 123 |
|
Глава 7. Подпрограммы | 124 |
7.1. Подпрограммы: процедуры и функции | 124 |
7.2. Параметры | 126 |
7.3. Передача параметров подпрограмме | 128 |
7.4. Блочная структура | 138 |
7.5. Рекурсия | 144 |
7.6. Стековая архитектура | 146 |
7.7. Ещё о стековой архитектуре | 153 |
7.8. * Реализация на процессоре Intel 8086 | 156 |
7.9. Упражнения | 158 |
|
ЧАСТЬ 3. БОЛЕЕ СЛОЖНЫЕ ПОНЯТИЯ |
|
Глава 8. Указатели | 160 |
8.1. Указательные типы | 160 |
8.2. Структуры данных | 167 |
8.3. Распределение памяти | 173 |
8.4. Алгоритмы распределения динамической памяти | 176 |
8.5. Упражнения | 179 |
|
Глава 9. Вещественные числа | 181 |
9.1. Представление вещественных чисел | 181 |
9.2. Языковая поддержка вещественных чисел | 185 |
9.3. Три смертных греха | 189 |
9.4. * Вещественные типы в языке Ada | 191 |
9.5. Упражнения | 192 |
|
Глава 10. Полиморфизм | 194 |
10.1. Преобразование типов | 195 |
10.2. Перегрузка | 196 |
10.3. Родовые (настраиваемые) сегменты | 197 |
10.4. Вариантные записи | 201 |
10.5. Динамическая диспетчеризация | 205 |
10.6. Упражнения | 206 |
|
Глава 11. Исключительные ситуации | 207 |
11.1. Требования обработки исключительных ситуаций | 207 |
11.2. Исключения в языке PL/1 | 209 |
11.3. Исключения в Ada | 209 |
11.4. Исключения в C++ | 212 |
11.5. Обработка ошибок в языке Eiffel | 214 |
11.6. Упражнения | 217 |
|
Глава 12. Параллелизм | 219 |
12.1. Что такое параллелизм? | 219 |
12.2. Общая память | 220 |
12.3. Проблема взаимных исключений | 222 |
12.4. Мониторы и защищённые переменные | 224 |
12.5. Передача сообщений | 225 |
12.6. Язык параллельного программирования occam | 226 |
12.7. Рандеву в языке Ada | 227 |
12.8. Linda | 229 |
12.9. Упражнения | 231 |
|
ЧАСТЬ 4. ПРОГРАММИРОВАНИЕ БОЛЬШИХ СИСТЕМ |
|
Глава 13. Декомпозиция программ | 233 |
13.1. Раздельная компиляция | 234 |
13.2. Почему необходимы модули? | 239 |
13.3. Пакеты в языке Ada | 240 |
13.4. Абстрактные типы данных в языке Ada | 245 |
13.5. Как писать модули на языке C++ | 251 |
13.6. Упражнения | 254 |
|
Глава 14. Объектно-ориентированное программирование | 256 |
14.1. Объектно-ориентированное проектирование | 256 |
14.2. Объектно-ориентированное программирование на языке C++ | 259 |
14.3. Наследование | 261 |
14.4. Динамический полиморфизм в языке C++ | 263 |
14.5. Объектно-ориентированное программирование на языке Ada 95 | 270 |
14.6. Упражнения | 276 |
|
Глава 15. Ещё об объектно-ориентированном программировании | 277 |
15.1. Структурированные классы | 278 |
15.2. Доступ к приватным компонентам | 285 |
15.3. Данные класса | 290 |
15.4. Язык программирования Eiffel | 293 |
15.5. Проектные соображения | 300 |
15.6. Методы динамического полиморфизма | 304 |
15.7. Упражнения | 305 |
|
ЧАСТЬ 5. НЕПРОЦЕДУРНЫЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ |
|
Глава 16. Функциональное программирование | 307 |
16.1. Почему именно функциональное программирование? | 307 |
16.2. Функции | 308 |
16.3. Составные типы | 310 |
16.4. Функции более высокого порядка | 313 |
16.5. Ленивые и жадные вычисления | 315 |
16.6. Исключения | 317 |
16.7. Среда | 318 |
16.8. Упражнения | 319 |
|
Глава 17. Логическое программирование | 321 |
17.1. Чистое логическое программирование | 322 |
17.2. Унификация | 325 |
17.3. Язык Prolog | 327 |
17.4. Более сложные понятия логического программирования | 335 |
17.5. Упражнения | 337 |
|
Глава 18. Java | 338 |
18.1. Модель Java | 338 |
18.2. Язык Java | 340 |
18.3. Семантика ссылки | 341 |
18.4. Полиморфные структуры данных | 345 |
18.5. Инкапсуляция | 346 |
18.6. Параллелизм | 348 |
18.7. Библиотеки Java | 350 |
18.8. Упражнения | 351 |
|
Приложение А. Где получить компиляторы? | 353 |
Приложение Б. Библиографический список | 355 |
Предметный указатель | 358 |