Тираж данной книги закончился.
|
Книга, ставшая бестселлером в США, посвящена всестороннему обсуждению основных концепций языков программирования. Автор описывает фундаментальные понятия программирования на примере вопросов разработки различных языковых конструкций, подвергая критическому анализу их реализацию в широком спектре языков программирования, таких как FORTRAN, PASCAL, PL/1, C, C++, Ada, Java, Smalltalk, Eiffel и LISP. Материал книги охватывает все парадигмы программирования, начиная с функциональной и заканчивая объектно-ориентированной, и, несомненно, представляет интерес и как учебник по современным методологиям.
Понравилась книга? Порекомендуйте её друзьям и коллегам: Твитнуть |
Книги, рекомендуемые вместе с этой книгой:
Раздел каталога:
Предисловие 18
Глава 1. Вводные замечания 23
Глава 2. Обзор основных языков программирования 57
Глава 3. Описание синтаксиса и семантики 123
Глава 4. Имена, связывание, проверка типов и области видимости 173
Глава 5. Типы данных 213
Глава 6. Выражения и операторы присваивания 275
Глава 7. Структуры управления на уровне операторов 303
Глава 8. Подпрограммы 345
Глава 9. Реализация подпрограмм 393
Глава 10. Абстрактные типы данных 429
Глава 11. Поддержка объектно-ориентированного программирования 451
Глава 12. Параллельность 503
Глава 13. Обработка исключительных ситуаций 545
Глава 14. Функциональные языки программирования 579
Глава 15. Языки логического программирования 615
ЛИТЕРАТУРА 649
Предметный указатель 661
ПРЕДИСЛОВИЕ | 10 |
Изменения, внесенные в пятом издании | 11 |
Указания преподавателю | 12 |
Приложения | 12 |
Доступность языкового процессора | 12 |
Благодарности | 12 |
Об авторе | 13 |
1. ВВОДНЫЕ ЗАМЕЧАНИЯ | 13 |
1.1. Для чего нужно изучать концепции языков программирования | 16 |
1.2. Области применения программирования | 18 |
1.2.1. Научные приложения | 18 |
1.2.2. Коммерческие приложения | 18 |
1.2.3. Искусственный интеллект | 18 |
1.2.4. Системное программирование | 19 |
1.2.5. Языки подготовки сценариев | 19 |
1.2.6. Специализированные языки программирования | 20 |
1.3. Критерии оценки языков программирования | 20 |
1.3.1. Читабельность | 21 |
1.3.2. Легкость создания программ | 25 |
1.3.3. Надежность | 27 |
1.3.4. Стоимость | 28 |
1.4. Факторы, влияющие на разработку языка | 29 |
1.4.1. Архитектура компьютера | 29 |
1.4.2. Методологии программирования | 31 |
1.5. Категории языков | 32 |
1.6. Компромиссы при разработке языка | 32 |
1.7. Методы реализации | 33 |
1.7.1. Компиляция | 34 |
1.7.2. Чистая интерпретация | 37 |
1.7.3. Смешанные системы реализации | 38 |
1.8. Среды программирования | 39 |
2. ОБЗОР ОСНОВНЫХ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ | 42 |
2.5. Первый шаг к совершенствованию: язык ALGOL 60 | 42 |
2.1. Язык Plankalkül Конрада Цузе | 44 |
2.1.1. Исторические предпосылки | 44 |
2.1.2. Обзор языка | 45 |
2.2. Минимальное программирование на аппаратном уровне: псевдокоды | 46 |
2.2.1. Язык Short Code | 46 |
2.2.2. Система Speedcoding | 47 |
2.2.3. Система "компиляции" UNIVAC | 47 |
2.2.4. Смежная работа | 47 |
2.3. Компьютер IBM 704 и язык FORTRAN | 47 |
2.3.1. Историческая ретроспектива | 48 |
2.3.2. Процесс разработки | 48 |
2.3.3. Обзор языка FORTRAN I | 49 |
2.3.4. Обзор языка FORTRAN II | 50 |
2.3.5. Языки FORTRAN IV, FORTRAN 77 и FORTRAN 90 | 50 |
2.3.6. Оценка | 51 |
2.4. Функциональное программирование: язык LISP | 52 |
2.4.1. Истоки работ в области искусственного интеллекта и обработка списков | 52 |
2.4.2. Процесс разработки языка LISP | 52 |
2.4.3. Обзор языка | 53 |
2.4.4. Оценка | 54 |
2.4.5. Два потомка языка LISP | 55 |
2.4.6. Родственные языки | 55 |
2.5. Первый шаг к совершенствованию: язык ALGOL 60 | 56 |
2.5.1. Историческая ретроспектива | 56 |
2.5.2. Начальная стадия разработки | 56 |
2.5.3. Обзор языка ALGOL 58 | 57 |
2.5.4. Принятие отчета о языке ALGOL 58 | 57 |
2.5.5. Процесс разработки языка ALGOL 60 | 58 |
2.5.6. Обзор языка ALGOL 60 | 58 |
2.5.7. Оценка языка ALGOL 60 | 59 |
2.6. Компьютеризация коммерческих записей: язык COBOL | 60 |
2.6.1. Исторические предпосылки | 60 |
2.6.2. Язык FLOW-MATIC | 60 |
2.6.3. Процесс разработки языка COBOL | 61 |
2.6.4. Оценка | 61 |
2.7. Начало разделения времени: язык BASIC | 63 |
2.7.1. Процесс разработки | 63 |
2.7.2. Обзор языка | 64 |
2.7.3. Оценка | 64 |
2.8. Все для всех: язык PL/I | 65 |
2.8.1. Исторические предпосылки | 65 |
2.8.2. Процесс разработки | 66 |
2.8.3. Обзор языка | 66 |
2.8.4. Оценка | 67 |
2.9. Два ранних динамических языка: APL и SNOBOL | 68 |
2.9.1. Истоки и характеристики языка APL | 68 |
2.9.2. Происхождение и характеристики языка SNOBOL | 68 |
2.10. Возникновение абстракции данных: язык SIMULA 67 | 69 |
2.10.1. Процесс разработки | 69 |
2.10.2. Обзор языка | 69 |
2.11. Ортогональная структура: язык ALGOL 68 | 70 |
2.11.1. Процесс разработки | 70 |
2.11.2. Обзор языка | 70 |
2.11.3. Оценка | 70 |
2.12. Несколько важных наследников семейства языков ALGOL | 71 |
2.12.1. Преднамеренная простота: язык Pascal | 71 |
2.12.2. Машинно-независимый язык: С | 73 |
2.12.3. Другие потомки языка ALGOL | 75 |
2.13. Программирование, основанное на логике: язык Prolog | 76 |
2.13.1. Процесс разработки | 76 |
2.13.2. Обзор языка | 76 |
2.13.3. Оценка | 77 |
2.14. Величайший проект в истории: язык Ada | 77 |
2.14.1. Историческая ретроспектива | 77 |
2.14.2. Процесс разработки | 77 |
2.14.3. Обзор языка | 78 |
2.14.4. Оценка | 79 |
2.14.5. Язык Ada 95 | 80 |
2.15. Объектно-ориентированное программирование: язык Smalltalk | 80 |
2.15.1. Процесс разработки | 81 |
2.15.2. Обзор языка | 81 |
2.15.3. Оценка | 82 |
2.16. Объединение императивных и объектно-ориентированных свойств: язык C++ | 83 |
2.16.1. Процесс разработки | 83 |
2.16.2. Обзор языка | 84 |
2.16.3. Оценка | 84 |
2.16.4. Родственный язык: Eiffel | 84 |
2.17. Программирование в World Wide Web: язык Java | 85 |
2.17.1. Процесс разработки | 85 |
2.17.2. Обзор языка | 85 |
2.17.3. Оценка | 86 |
3. ОПИСАНИЕ СИНТАКСИСА И СЕМАНТИКИ | 90 |
3.1. Предисловие | 91 |
3.2. Общая задача описания синтаксиса | 91 |
3.2.1. Устройства распознавания языков | 92 |
3.2.2. Генераторы языков | 92 |
3.3. Формальные методы описания синтаксиса | 93 |
3.3.1. Форма Бэкуса-Наура и контекстно-свободные грамматики | 93 |
3.3.2. Расширенная форма БНФ | 101 |
3.3.3. Синтаксические графы | 102 |
3.3.4. Грамматики и устройства распознавания языков | 103 |
3.4. Рекурсивный нисходящий синтаксический анализ | 103 |
3.5. Атрибутивные грамматики | 105 |
3.5.1. Статическая семантика | 105 |
3.5.2. Основные понятия | 105 |
3.5.3. Определение атрибутивных грамматик | 105 |
3.5.4. Внутренние атрибуты | 106 |
3.5.5. Примеры атрибутивных грамматик | 106 |
3.5.6. Вычисление значений атрибутов | 108 |
3.5.7. Оценка | 109 |
3.6. Описание смысла программ: динамическая семантика | 109 |
3.6.1. Операционная семантика | 109 |
3.6.2. Аксиоматическая семантика | 111 |
3.6.3. Денотационная семантика | 118 |
4. ИМЕНА, СВЯЗЫВАНИЕ, ПРОВЕРКА ТИПОВ И ОБЛАСТИ ВИДИМОСТИ | 125 |
4.1. Предисловие | 127 |
4.2. Имена | 127 |
4.2.1. Вопросы структуры | 127 |
4.2.2. Виды имен | 127 |
4.2.3. Специальные слова | 128 |
4.3. Переменные | 129 |
4.3.1. Имя | 129 |
4.3.2. Адрес | 129 |
4.3.3. Тип | 130 |
4.3.4. Значение | 130 |
4.4. Концепция связывания | 131 |
4.4.1. Связывание атрибутов с переменными | 131 |
4.4.2. Связывание типов | 131 |
4.4.3. Связывание переменных с ячейками памяти и время их жизни | 134 |
4.5. Проверка типов | 136 |
4.6. Строгая типизация | 137 |
4.7. Совместимость типов | 138 |
4.8. Область видимости | 140 |
4.8.1. Статическая область видимости | 140 |
4.8.2. Блоки | 141 |
4.8.3. Оценка статического обзора данных | 142 |
4.8.4. Динамические области видимости | 144 |
4.8.5. Оценка динамического обзора данных | 145 |
4.9. Область видимости переменных и время их жизни | 146 |
4.10. Среды ссылок | 146 |
4.11. Именованные константы | 148 |
4.12. Инициализация переменных | 149 |
5. ТИПЫ ДАННЫХ | 155 |
5.1. Введение | 156 |
5.2. Элементарные типы данных | 158 |
5.2.1. Числовые типы | 158 |
5.2.2. Булевские типы | 159 |
5.2.3. Символьные типы | 160 |
5.3. Символьные строки | 160 |
5.3.1. Вопросы разработки | 160 |
5.3.2. Строки и действия над ними | 160 |
5.3.3. Варианты длины строк | 162 |
5.3.4. Оценка | 162 |
5.3.5. Реализация символьных строк | 163 |
5.4. Порядковые типы, определяемые пользователем | 163 |
5.4.1. Перечислимые типы | 164 |
5.4.2. Ограниченные типы | 165 |
5.4.3. Реализация порядковых типов, определяемых пользователем | 166 |
5.5. Массивы | 166 |
5.5.1. Вопросы разработки | 167 |
5.5.2. Массивы и индексы | 167 |
5.5.3. Связывания индексов и категории массивов | 168 |
5.5.4. Количество индексов массива | 170 |
5.5.5. Инициализация массива | 170 |
5.5.6. Операции над массивами | 171 |
5.5.7. Сечения | 172 |
5.5.8. Оценка | 173 |
5.5.9. Реализация типов массивов | 173 |
5.6. Ассоциативные массивы | 176 |
5.6.1. Структура и операции | 176 |
5.6.2. Реализация ассоциативных массивов | 177 |
5.7. Записи | 177 |
5.7.1. Описания записей | 178 |
5.7.2. Ссылки на поля записи | 178 |
5.7.3. Операции над записями | 179 |
5.7.4. Оценка | 180 |
5.7.5. Реализация записей | 180 |
5.8. Объединения | 181 |
5.8.1. Вопросы разработки | 181 |
5.8.2. Свободные объединения | 181 |
5.8.3. Размеченные объединения языка ALGOL 68 | 181 |
5.8.4. Типы объединения в языке Pascal | 182 |
5.8.5. Объединения в языке Ada | 184 |
5.8.6. Оценка | 185 |
5.8.7. Реализация объединений | 185 |
5.9. Множества | 185 |
5.9.1. Множества в языках Pascal и Modula-2 | 186 |
5.9.2. Оценка | 187 |
5.9.3. Реализация множественных типов данных | 187 |
5.10. Указатели | 187 |
5.10.1. Вопросы разработки | 188 |
5.10.2. Операции над указателями | 188 |
5.10.3. Проблемы, возникающие при использовании указателей | 189 |
5.10.4. Указатели в языке Pascal | 190 |
5.10.5. Указатели в языке Ada | 190 |
5.10.6. Указатели в языках C и C++ | 191 |
5.10.7. Указатели в языке FORTRAN 90 | 192 |
5.10.8. Ссылки | 192 |
5.10.9. Оценка | 193 |
5.10.10. Реализация ссылок и указателей | 194 |
6. ВЫРАЖЕНИЯ И ОПЕРАТОРЫ ПРИСВАИВАНИЯ | 202 |
6.1. Вступление | 204 |
6.2. Арифметические выражения | 204 |
6.2.1. Порядок вычисления операторов | 205 |
6.2.2. Порядок вычисления операндов | 208 |
6.3. Перегруженные операторы | 210 |
6.4. Преобразования типов | 211 |
6.4.1. Приведение типов в выражениях | 212 |
6.4.2. Явное преобразование типов | 213 |
6.4.3. Ошибки в выражениях | 213 |
6.5. Выражения отношений и булевские выражения | 213 |
6.5.1. Выражения отношения | 214 |
6.5.2. Булевские выражения | 214 |
6.6. Сокращенное вычисление | 215 |
6.7. Операторы присваивания | 216 |
6.7.1. Простые присваивания | 216 |
6.7.2. Множественные целевые объекты | 217 |
6.7.3. Условные целевые объекты | 217 |
6.7.4. Составные операторы присваивания | 217 |
6.7.5. Унарные операторы присваивания | 218 |
6.7.6. Присваивание как выражение | 218 |
6.8. Смешанные присваивания | 219 |
7. СТРУКТУРЫ УПРАВЛЕНИЯ НА УРОВНЕ ОПЕРАТОРОВ | 223 |
7.1. Введение | 225 |
7.2. Составные операторы | 225 |
7.3. Операторы ветвления | 226 |
7.3.1. Двухвариантные операторы ветвления | 226 |
7.3.2. Конструкции многовариантного ветвления | 230 |
7.4. Операторы цикла | 234 |
7.4.1. Циклы со счетчиком | 235 |
7.4.2. Логически управляемые циклы | 240 |
7.4.3. Циклы с механизмами управления, размещенными пользователем | 242 |
7.4.4. Циклы, основанные на структурах данных | 243 |
7.5. Безусловный переход | 244 |
7.5.1. Проблемы безусловного перехода | 244 |
7.5.2. Виды меток | 245 |
7.5.3. Ограничения переходов | 245 |
7.6. Защищенные команды | 246 |
7.7. Выводы | 249 |
8. ПОДПРОГРАММЫ | 253 |
8.1. Введение | 254 |
8.2. Основы подпрограмм | 255 |
8.2.1. Общие свойства подпрограмм | 255 |
8.2.2. Основные определения | 255 |
8.2.3. Параметры | 256 |
8.2.4. Процедуры и функции | 258 |
8.3. Вопросы разработки подпрограмм | 258 |
8.4. Среды локальных ссылок | 259 |
8.5. Методы передачи параметров | 260 |
8.5.1. Семантические модели передачи параметров | 260 |
8.5.2. Модели реализации передачи параметров | 261 |
8.5.3. Методы передачи параметров в основных языках программирования | 265 |
8.5.4. Проверка типов параметров | 266 |
8.5.5. Методы реализации передачи параметров | 267 |
8.5.6. Многомерные массивы в качестве параметров | 269 |
8.5.7. Вопросы разработки | 271 |
8.5.8. Примеры передачи параметров | 271 |
8.6. Параметры, являющиеся именами подпрограмм | 274 |
8.7. Перегруженные подпрограммы | 276 |
8.8. Настраиваемые подпрограммы | 277 |
8.8.1. Настраиваемые подпрограммы в языке Ada | 277 |
8.8.2. Настраиваемые подпрограммы в языке C++ | 278 |
8.9. Раздельная и независимая компиляция | 280 |
8.10. Вопросы разработки функций | 281 |
8.10.1. Побочные эффекты функций | 281 |
8.10.2. Типы возвращаемых значений | 281 |
8.11. Доступ к нелокальным средам | 281 |
8.11.1. Блоки COMMON языка FORTRAN | 282 |
8.11.2. Внешние объявления и модули | 283 |
8.12. Перегруженные операторы, определяемые пользователем | 284 |
8.13. Сопрограммы | 284 |
9. РЕАЛИЗАЦИЯ ПОДПРОГРАММ | 289 |
9.1. Общая семантика вызовов и возвратов | 290 |
9.2. Реализация подпрограмм на языке FORTRAN 77 | 290 |
9.3. Реализация подпрограмм на языках, подобных языку ALGOL | 292 |
9.3.1. Более сложные записи активации | 293 |
9.3.2. Пример без рекурсии и нелокальных ссылок | 294 |
9.3.3. Рекурсия | 296 |
9.3.4. Механизмы реализации нелокальных ссылок | 299 |
9.4. Блоки | 307 |
9.5. Реализация методов динамического обзора данных | 308 |
9.5.1. Глубокий доступ | 309 |
9.5.2. Теневой доступ | 310 |
9.6. Реализация параметров, являющихся именами подпрограмм | 311 |
9.6.1. Статические цепочки | 311 |
9.6.2. Индикаторы | 312 |
9.6.3. Ошибочное повторное обращение к среде ссылок | 312 |
10. АБСТРАКТНЫЕ ТИПЫ ДАННЫХ | 317 |
10.1. Понятие абстракции | 318 |
10.2. Инкапсуляция | 319 |
10.3. Введение в абстракцию данных | 319 |
10.3.1. Число с плавающей точкой как абстрактный тип данных | 320 |
10.3.2. Абстрактные типы данных, определяемые пользователем | 320 |
10.3.3. Пример | 321 |
10.4. Вопросы разработки типов | 321 |
10.5. Примеры абстракции данных в разных языках | 322 |
10.5.1. Классы в языке SIMULA 67 | 322 |
10.5.2. Абстрактные типы данных в языке Ada | 323 |
10.5.3. Абстрактные типы данных в языке C++ | 326 |
10.6. Параметризованные абстрактные типы данных | 329 |
10.6.1. Язык Ada | 330 |
10.6.2. Язык C++ | 330 |
11. ПОДДЕРЖКА ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ | 334 |
11.1. Введение | 335 |
11.2. Объектно-ориентированное программирование | 336 |
11.2.1. Введение | 336 |
11.2.2. Наследование | 336 |
11.2.3. Полиморфизм и динамическое связывание | 338 |
11.2.4. Вычисления в объектно-ориентированных языках | 339 |
11.3. Вопросы разработки объектно-ориентированных языков | 339 |
11.3.1. Исключительность объектов | 339 |
11.3.2. Являются ли подклассы подтипами? | 339 |
11.3.3. Реализация и наследование интерфейса | 340 |
11.3.4. Проверка типов и полиморфизм | 340 |
11.3.5. Одиночное и множественное наследование | 341 |
11.3.6. Размещение в памяти и удаление из памяти объектов | 342 |
11.3.7. Динамическое и статическое связывание | 342 |
11.4. Обзор языка Smalltalk | 342 |
11.4.1. Общие характеристики | 342 |
11.4.2. Среда языка Smalltalk | 343 |
11.5. Введение в язык Smalltalk | 343 |
11.5.1. Выражения | 343 |
11.5.2. Методы | 345 |
11.5.3. Операторы присваивания | 346 |
11.5.4. Блоки и управляющие структуры | 347 |
11.5.5. Классы | 349 |
11.5.6. Дополнительные сведения о методах | 350 |
11.6. Примеры программ на языке Smalltalk | 351 |
11.6.1. Простой обработчик таблиц | 351 |
11.6.2. Графика в LOGO | 353 |
11.7. Главные особенности языка Smalltalk | 356 |
11.7.1. Проверка типов и полиморфизм | 356 |
11.7.2. Наследование | 356 |
11.8. Оценка языка Smalltalk | 357 |
11.9. Поддержка объектно-ориентированного программирования в языке C++ | 357 |
11.9.1. Общие свойства | 357 |
11.9.2. Наследование | 358 |
11.9.3. Динамическое связывание | 361 |
11.9.4. Оценка | 362 |
11.10. Поддержка объектно-ориентированного программирования в языке Java | 363 |
11.10.1. Общие свойства | 363 |
11.10.2. Наследование | 363 |
11.10.3. Динамическое связывание | 364 |
11.10.4. Инкапсуляция | 364 |
11.10.5. Оценка | 365 |
11.11. Поддержка объектно-ориентированного программирования в языке Ada 95 | 365 |
11.11.1. Общие свойства | 365 |
11.11.2. Наследование | 365 |
11.11.3. Динамическое связывание | 366 |
11.11.4. Оценка | 367 |
11.12. Поддержка объектно-ориентированного программирования в языке Eiffel | 367 |
11.12.1. Общие свойства | 368 |
11.12.2. Наследование | 368 |
11.12.3. Динамическое связывание | 369 |
11.12.4. Оценка | 369 |
11.13. Реализация объектно-ориентированных конструкций | 369 |
11.13.1. Хранение данных экземпляра | 370 |
11.13.2. Динамическое связывание сообщений с методами | 370 |
12. ПАРАЛЛЕЛЬНОСТЬ | 374 |
12.1. Введение | 376 |
12.1.1. Многопроцессорные архитектуры | 376 |
12.1.2. Разновидности параллельности | 377 |
12.1.3. Почему нужно изучать параллельность | 377 |
12.2. Введение в параллельность на уровне подпрограмм | 378 |
12.2.1. Основные понятия | 378 |
12.2.2. Разработка языков для поддержки параллельности | 380 |
12.2.3. Вопросы разработки языков программирования | 380 |
12.3. Семафоры | 381 |
12.3.1. Введение | 381 |
12.3.2. Синхронизация взаимодействия | 381 |
12.3.3. Синхронизация конкуренции | 383 |
12.3.4. Оценка | 384 |
12.4. Мониторы | 384 |
12.4.1. Введение | 384 |
12.4.2. Синхронизация взаимодействия | 385 |
12.4.3. Синхронизация конкуренции | 385 |
12.4.4. Оценка | 387 |
12.5. Передача сообщений | 387 |
12.5.1. Введение | 388 |
12.5.2. Концепция синхронной передачи сообщений | 388 |
12.5.3. Модель передачи сообщения в языке Ada 95 | 388 |
12.5.4. Синхронизация взаимодействия | 392 |
12.5.5. Синхронизация крнкуренции | 392 |
12.5.6. Завершение задачи | 394 |
12.5.7. Приоритеты | 394 |
12.5.8. Бинарные семафоры | 394 |
12.5.9. Оценка | 395 |
12.6. Параллельность в языке Ada 95 | 395 |
12.6.1. Защищенные объекты | 395 |
12.6.2. Асинхронные сообщения | 396 |
12.7. Потоки языка Java | 397 |
12.7.1. Класс Thread | 397 |
12.7.2. Приоритеты | 398 |
12.7.3. Синхронизация взаимодействия | 398 |
12.7.4. Синхронизация конкуренции | 399 |
12.7.5. Оценка | 401 |
12.8. Параллельность на уровне операторов | 401 |
12.8.1. Язык High-Performance FORTRAN | 401 |
13. ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ | 405 |
13.1. Введение в обработку исключительных ситуаций | 406 |
13.1.1. Основные понятия | 407 |
13.1.2. Вопросы разработки | 408 |
13.1.3. Исторический обзор | 410 |
13.2. Обработка исключительных ситуаций в языке PL/1 | 410 |
13.2.1. Обработчики исключительных ситуаций | 410 |
13.2.2. Связывание исключительных ситуаций с обработчиками | 411 |
13.2.3. Продолжение | 411 |
13.2.4. Другие проектные решения | 411 |
13.2.5. Пример | 412 |
13.2.6. Оценка | 413 |
13.3. Обработка исключительных ситуаций в языке Ada | 414 |
13.3.1. Обработчики исключительных ситуаций | 414 |
13.3.2. Связывание исключительных ситуаций с обработчиками | 414 |
13.3.3. Продолжение | 415 |
13.3.4. Другие проектные решения | 416 |
13.3.5. Пример | 417 |
13.3.6. Оценка | 418 |
13.4. Обработка исключительных ситуаций в языке C++ | 418 |
13.4.1. Обработчики исключительных ситуаций | 418 |
13.4.2. Связывание исключительных ситуаций с обработчиками | 419 |
13.4.3. Продолжение выполнения программы | 419 |
13.4.4. Другие проектные решения | 420 |
13.4.5. Пример | 420 |
13.4.6. Оценка | 421 |
13.5. Обработка исключительных ситуаций в языке Java | 421 |
13.5.1. Классы исключительных ситуаций | 421 |
13.5.2. Обработчики исключительных ситуаций | 422 |
13.4.3. Связывание исключительных ситуаций с обработчиками | 422 |
13.4.4. Продолжение выполнения программы | 423 |
13.4.5. Другие проектные решения | 423 |
13.4.6. Пример | 424 |
13.4.7. Оператор finally | 425 |
13.4.8. Оценка | 426 |
14. ФУНКЦИОНАЛЬНЫЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ | 430 |
14.1. Введение | 432 |
14.2. Математические функции | 432 |
14.2.1. Простые функции | 433 |
14.2.2. Функциональные формы | 433 |
14.3. Основы функциональных языков программирования | 434 |
14.4. Первый язык функционального программирования - LISP | 434 |
14.4.1. Типы и структуры данных | 435 |
14.4.2. Первый интерпретатор языка LISP | 436 |
14.5. Введение в язык Scheme | 437 |
14.5.1. Происхождение языка Scheme | 437 |
14.5.2. Элементарные функции | 437 |
14.5.3. Функции для построения функций | 440 |
14.5.4. Поток управления | 442 |
14.5.5. Пример функции на языке Scheme | 443 |
14.5.6. Функциональные формы | 446 |
14.5.7. Функции для создания кода | 446 |
14.5.8. Императивные свойства языка Scheme | 447 |
14.6. Язык COMMON LISP | 448 |
14.7. Язык ML | 449 |
14.8. Язык Haskell | 450 |
14.9. Применение функциональных языков | 453 |
14.10. Сравнение функциональных и императивных языков | 453 |
15. ЯЗЫКИ ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ | 457 |
15.1. Введение | 458 |
15.2. Краткое введение в исчисление предикатов | 459 |
15.2.1. Высказывания | 459 |
15.2.2. Дизъюнктивные формы | 460 |
15.3. Исчисление предикатов и доказательство теорем | 461 |
15.4. Обзор логического программирования | 463 |
15.5. Происхождение языка Prolog | 464 |
15.6. Основные элементы языка Prolog | 464 |
15.6.1. Термы | 464 |
15.6.2. Факты | 465 |
15.6.3. Правила | 465 |
15.6.4. Цель | 466 |
15.6.5. Процесс логического вывода в языке Prolog | 466 |
15.6.6. Простая арифметика | 468 |
15.6.7. Списковые структуры | 471 |
15.7. Недостатки языка Prolog | 474 |
15.7.1. Управление порядком выполнения резолюции | 474 |
15.7.2. Предположение о закрытом мире | 476 |
15.7.3. Проблема логического отрицания | 476 |
15.7.4. Внутренние ограничения | 478 |
15.8. Применение логического программирования | 478 |
15.8.1. Системы управления реляционными базами данных | 478 |
15.8.2. Экспертные системы | 479 |
15.8.3. Системы обработки естественных языков | 479 |
15.8.4. Образование | 480 |
15.9. Выводы | 480 |
ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ | 491 |
Copyright © 1992-2019 Издательская группа "Диалектика-Вильямс" |