Программирование. Введение в профессию том 9. Парадигмы в мышлении программиста....6
9.1. Загадочное слово <<парадигма>>....6
9.1.1. Терминологические трудности ....7
9.1.2. Парадигмы вне программирования ....7
9.1.3. Обзор основных стилей ....9
9.2. Рекурсия как пример парадигмы....15
9.2.1. Пример с обходом дерева ....15
9.2.2. Виды рекурсии ....16
9.2.3. Редукция (свёртка) последовательностей ....17
9.2.4. Остаточная рекурсия ....19
9.2.5. Рекурсивное мышление ....21
9.3. Парадигмы и языки программирования....22
9.3.1. О роли языка программирования ....22
9.3.2. Концептуальное отличие Си от Паскаля ....23
9.3.3. Два подхода к сравнению языков ....27
9.4. Примеры частных парадигм....28
9.4.1. Callback-функции ....28
9.4.2. Программирование в терминах явных состояний ....28
9.4.3. Метапрограммирование ....30
10. Язык Си, ООП и АТД....31
10.1. От Си к Си....31
10.2. О выборе подмножества Си....32
10.3. Методы, объекты и защита....32
10.3.1. Функции-члены (методы) ....32
10.3.2. Неявный указатель на объект ....33
10.3.3. Защита. Понятие конструктора ....33
10.3.4. Зачем нужна защита ....34
10.3.5. Классы ....35
10.3.6. Деструкторы ....35
10.4. Абстрактные типы данных в Си....36
10.4.1. Перегрузка имён функций; декорирование ....36
10.4.2. Переопределение символов стандартных операций ....38
10.4.3. Конструктор умолчания. Массивы объектов ....39
10.4.4. Конструкторы преобразования ....39
10.4.5. Ссылки ....39
10.4.6. Ссылки на константы ....40
10.4.7. Ссылки как семантический феномен ....41
10.4.8. Константные методы ....41
10.4.9. Операции работы с динамической памятью ....42
10.4.10. Конструктор копирования ....43
10.4.11. Временные и анонимные объекты ....43
10.4.12. Значения параметров по умолчанию ....44
10.4.13. Описание метода вне класса. Области видимости ....45
10.4.14. <<Подставляемые>> функции (inline) ....45
10.4.15. Инициализация членов класса в конструкторе ....46
10.4.16. Перегрузка операций простыми функциями ....46
10.4.17. Дружественные функции и классы ....47
10.4.18. Переопределение операций присваивания ....48
10.4.19. Методы, возникающие неявно ....48
10.4.20. Переопределение операции индексирования ....49
10.4.21. Переопределение операций и -- ....50
10.4.22. Переопределение операции -> ....51
10.4.23. Переопределение операции вызова функции ....51
10.4.24. Переопределение операции преобразования типа ....52
10.4.25. Пример: разреженный массив ....52
10.4.26. Статические поля и методы ....54
10.5. Обработка исключительных ситуаций....55
10.5.1. Ошибочные ситуации и проблемы их обработки ....56
10.5.2. Общая идея механизма исключений ....56
10.5.3. Возбуждение исключений ....57
10.5.4. Обработка исключений ....57
10.5.5. Обработчики с многоточием ....58
10.5.6. Объект класса в роли исключения ....58
10.5.7. Автоматическая очистка ....59
10.5.8. Преобразования типов исключений ....59
10.6. Наследование и полиморфизм....60
10.6.1. Иерархические предметные области ....60
10.6.2. Наследование структур и полиморфизм адресов ....60
10.6.3. Методы и защита при наследовании ....61
10.6.4. Конструирование и деструкция наследника ....62
10.6.5. Виртуальные функции ....62
10.6.6. Чисто виртуальные методы и абстрактные классы ....64
10.6.7. Виртуальность в конструкторах и деструкторах ....65
10.6.8. Наследование ради конструктора ....65
10.6.9. Виртуальный деструктор ....66
10.6.10. Ещё о полиморфизме ....66
10.6.11. Приватные и защищённые деструкторы ....66
10.6.12. Перегрузка функций и сокрытие имён ....67
10.6.13. Вызов в обход механизма виртуальности ....67
10.6.14. Операции приведения типа ....68
10.6.15. Иерархии исключений ....68
10.7. Шаблоны....69
10.7.1. Шаблоны функций ....70
10.7.2. Шаблоны классов ....70
10.7.3. Специализация шаблонов ....72
10.7.4. Пример: свёртка последовательностей ....73
10.7.5. Константы в роли параметров шаблона ....75
10.8. Снова о парадигмах....77
10.8.1. Спектр парадигм в Си ....77
10.8.2. ООП и АТД ....77
10.8.3. Полиморфизм без мистики ....77
10.8.4. Наследование как сужение множества ....78
10.9. Особенности оформления кода на Си....78
10.9.1. Соглашения об именах ....78
10.9.2. Форматирование заголовков классов ....79
10.9.3. Форматирование заголовка конструктора ....79
10.9.4. Тела функций в заголовке класса ....80
10.10. Пример: TCP-сервер....80
10.11. О графических интерфейсах пользователя....85
10.11.1. Знакомимся с библиотекой FLTK ....85
10.11.2. Простые кнопки и реакция на них ....87
10.11.3. Другие виды кнопок ....88
10.11.4. Виджеты для ввода текста ....90
10.11.5. Обрамление и метки ....92
10.11.6. Виджеты для вывода ....94
10.11.7. Окна, допускающие изменение размера ....94
10.11.8. Обработка аргументов командной строки ....96
10.11.9. Обзор нерассмотренных возможностей ....97
10.11.10. FLTK и парадигма ООП ....98
10.11.11. () Если нужен свой главный цикл ....100
Си: что дальше....100
11. Неразрушающие парадигмы....102
11.1. Язык Лисп и его S-выражения....102
11.1.1. Немного истории ....102
11.1.2. SBCL, GCL и ECL ....103
11.1.3. S-выражения: гетерогенная модель данных ....106
11.1.4. Вычисление S-выражений ....107
11.1.5. Пользовательские функции ....109
11.1.6. Разрушающие функции ....110
11.1.7. Функция eval ....112
11.1.8. Функции как объекты обработки ....113
11.1.9. Фунарг-проблема и лексическое связывание ....114
11.1.10. О фунарг-проблеме в других языках ....117
11.1.11. Редукция списков ....119
11.1.12. Груз устаревших парадигм ....120
11.1.13. Возможности, которых лучше бы не было ....121
11.1.14. Ввод-вывод ....122
11.1.15. Неутешительное заключение ....126
11.2. Scheme: Лисп, но не совсем....127
11.2.1. Chicken Scheme ....127
11.2.2. Видимые отличия Scheme от обычного Лиспа ....128
11.2.3. Ввод-вывод в Scheme ....129
11.2.4. Континуации (продолжения) ....131
11.2.5. () Continuation-passing style ....134
11.3. Об оформлении кода на лиспоподобных языках....134
11.4. Логическое и декларативное программирование....135
11.4.1. Язык Пролог и его история ....136
11.4.2. SWI-Prolog ....136
11.4.3. Модель данных в Прологе ....138
11.4.4. Операция унификации термов ....141
11.4.5. Отношения, предикаты и факты ....141
11.4.6. Правила и процедуры ....143
11.4.7. Обращения к процедурам, прототипы и инверсия ....144
11.4.8. Отрицание и отсечение: убийцы логики ....147
11.4.9. Арифметика ....149
11.4.10. Ввод-вывод ....151
11.4.11. Анализ атомов и термов ....153
11.4.12. Списки решений ....154
11.4.13. Работа с базой данных ....155
11.4.14. Оформление кода на Прологе ....156
11.5. Ленивые вычисления....157
11.5.1. Две возможные стратегии вычисления выражений ....157
11.5.2. Хоуп и другие <<ленивые>> языки ....157
11.5.3. Интерпретатор Hopeless ....158
11.5.4. Лексика и синтаксис языка Хоуп ....159
11.5.5. Модель данных и система типов ....159
11.5.6. Функции в Хоупе ....160
11.5.7. Операции if и let ....161
11.5.8. Полиморфные функции ....162
11.5.9. Безымянные функции и функционалы ....163
11.5.10. Операция letrec ....164
11.5.11. Редукция списков ....165
11.5.12. Бесконечные структуры данных. Примеры ....166
11.5.13. Ввод-вывод в Хоупе ....167
11.5.14. Карринг ....168
11.5.15. Комбинатор неподвижной точки ....169
12. Компиляция, интерпретация, скриптинг....172
12.1. Характерные особенности скриптовых языков....172
12.2. Язык Tcl....173
12.2.1. Интерпретатор и простейшие программы ....173
12.2.2. Переменные и их значения ....174
12.2.3. Ветвления, циклы... и строки ....175
12.2.4. Процедуры и видимость переменных ....178
12.2.5. Обработка особых ситуаций ....180
12.2.6. Файлы, потоки и внешние команды ....181
12.2.7. Ассоциативные массивы ....183
12.2.8. Если сравнить Tcl с Лиспом ....183
12.3. Интерпретатор Tcl и язык Си....184
12.3.1. Встраиваемый Tcl ....184
12.3.2. Расширение набора команд tclsh ....187
12.4. Графические интерфейсы на TclTk....187
12.4.1. Библиотека Tk и интерпретатор wish ....187
12.4.2. Взаимодействие с оконным менеджером ....189
12.4.3. Основные виджеты ....190
12.4.4. Положение и размеры ....192
12.4.5. Управление шрифтами ....194
12.4.6. Обработка событий ....195
12.4.7. <<Ресурсы>> и русификация ....196
12.5. Стратегии выполнения как парадигмы....197
12.5.1. И всё же что такое скрипт ....197
12.5.2. Дихотомия Оустерхаута и её противники ....198
12.5.3. И всё же что такое <<интерпретация>>? ....200
12.5.4. Интерпретация как парадигма ....201
12.5.5. Зависимости и самодостаточность ....203
12.5.6. Миф о переносимости ....205
12.5.7. Когда интерпретация всё же допустима ....205
12.5.8. () Размышления о чистой компиляции ....207
Приложения....209
Приложение 5. Сравнение файлов и наложение изменений....209
Приложение 6. Системы контроля версий....211
Система CVS....212
Система git....215
Заключение....220
Список литературы....221
Предметный указатель....223
Учебник «Программирование: введение в профессию» ориентирован на самостоятельное изучение и предполагает использование систем семейства Unix (в т.ч. Linux) в роли сквозной среды для обучения.