Новинки компьютерных книг ->> Основные концепции языков программирования
ПРЕДИСЛОВИЕ | 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 |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||