- •Предисловие
- •Введение
- •1Архитектура эвм
- •1.1 Биты и их хранение
- •1.1.1Вентили и триггеры
- •1.1.2Другие способы хранения битов
- •1.1.3Шестнадцатеричная система счисления
- •1.2 Оперативная память
- •1.2.1Структура памяти
- •1.2.2Измерение емкости памяти
- •1.3 Устройства хранения данных
- •1.3.1Магнитные диски
- •1.3.2Компакт-диски
- •1.3.3Магнитные ленты
- •1.3.4Хранение и поиск файлов
- •1.4 Представление информации в виде двоичного кода
- •1.4.1Представление текста
- •1.4.2Американский национальный институт стандартов
- •1.4.3Iso - международная организация по стандартизации
- •1.4.4Представление числовых значений
- •1.4.5Представление изображений
- •1.4.6Представление звука
- •1.5 Двоичная система счисления
- •1.5.1Альтернатива двоичной системе счисления
- •1.5.2Дроби в двоичной системе счисления
- •1.5.3Аналоговые и цифровые устройства
- •1.6 Хранение целых чисел
- •1.6.1Представление в двоичном дополнительном коде
- •1.6.2Сложение в двоичном дополнительном коде
- •1.6.3Проблема переполнения
- •1.6.4Представление с избытком
- •1.7 Хранение дробей
- •1.7.1Представление с плавающей точкой
- •1.7.2Ошибка усечения
- •1.8 Сжатие данных
- •1.8.1Общие методы сжатия данных
- •1.8.2Сжатие звука
- •1.8.3Сжатие изображений
- •1.9 Ошибки передачи данных
- •1.9.1Контрольный разряд четности
- •1.9.2Коды с исправлением ошибок
- •2Манипулирование данными
- •2.1 Архитектура эвм
- •2.1.1Сложение двух чисел, хранящихся в оперативной памяти
- •2.1.2Кто и что изобрел?
- •2.2 Машинный язык
- •2.2.1Система команд
- •2.2.2Кэш-память
- •2.2.3Арифметико-логические команды
- •2.2.4Команды управления
- •2.2.5Деление двух значений, хранящихся в памяти
- •2.3 Выполнение программы
- •2.3.1Пример выполнения программы
- •2.3.2Команды переменной длины
- •2.3.3Программы и данные
- •2.4 Арифметические и логические операции
- •2.4.1Логические операции
- •2.4.2Сравнение вычислительной мощности эвм
- •2.4.3Операции сдвига
- •2.4.4Арифметические операции
- •2.5 Связь с другими устройствами
- •2.5.1Связь через контроллер
- •2.5.2Строение шины
- •2.5.3Скорость передачи данных
- •2.6 Другие архитектуры
- •2.6.1Конвейерная обработка
- •3Операционные системы и организация сетей
- •3.13.1. Эволюция операционных систем
- •3.1.1Однопроцессорные системы
- •3.1.2Многопроцессорные системы
- •3.2 Архитектура операционной системы
- •3.2.1Программное обеспечение
- •3.2.2Полезное единообразие или вредная монополия?
- •3.2.3Компоненты операционной системы
- •3.2.4Операционная система linux
- •3.2.5Начало работы операционной системы
- •3.3 Координирование действий машины
- •3.3.1Понятие процесса
- •3.3.2Управление процессами
- •3.3.3Модель «клиент-сервер»
- •3.4 Обработка конкуренции между процессами
- •3.4.1Семафор
- •3.4.2Взаимная блокировка
- •3.5 Сети
- •3.5.1Основы организации сетей
- •3.5.2Интернет
- •3.5.3Топология сети Интернет
- •3.5.4Система адресов Интернета
- •3.5.5Электронная почта
- •3.5.6Всемирная паутина
- •3.6 Сетевые протоколы
- •3.6.1Управление правом отправки сообщений
- •3.6.2Сеть ethernet
- •3.6.3Javascript, апплеты, cgi и сервлеты
- •3.6.4Многоуровневый принцип программного обеспечения Интернета
- •3.6.5Комплект протоколов tcp/ip
- •3.6.6Протоколы рорз и imap
- •3.7 Безопасность
- •3.7.1Протокол защищенных сокетов
- •3.7.2Группа компьютерной «скорой помощи»
- •4Алгоритмы
- •4.1 Понятие алгоритма
- •4.1.1Предварительные замечания
- •4.1.2Формальное определение алгоритма
- •4.1.3Определение алгоритма
- •4.1.4Абстрактная природа алгоритма
- •4.2 Представление алгоритма
- •4.2.1Примитивы
- •4.2.2Псевдокод
- •4.3 Создание алгоритма
- •4.3.1Искусство решения задач
- •4.3.2Итеративные структуры в музыке
- •4.3.3Первый шаг в решении задачи
- •4.4 Итеративные структуры
- •4.4.1Алгоритм последовательного поиска
- •4.4.2Управление циклом
- •4.4.3Алгоритм сортировки методом вставок
- •4.5Рекурсивные структуры
- •4.5.1Поиск и сортировка
- •4.5.2Алгоритм двоичного поиска
- •4.5.3Управление рекурсивными структурами
- •4.6 Эффективность и правильность
- •4.6.1Эффективность алгоритма
- •4.6.2Проверка правильности программного обеспечения
- •4.6.3По ту сторону проверки правильности программ
- •5Языки программирования
- •5.1 Исторический обзор
- •5.1.1Ранние поколения
- •5.1.2Интерплатформенное программное обеспечение
- •5.1.3Независимость от машины
- •5.1.4Парадигмы программирования
- •5.2 Основные понятия традиционного программирования
- •5.2.1Культуры языков программирования
- •5.2.2Переменные и типы данных
- •5.2.3Структуры данных
- •5.2.4Константы и литералы
- •5.2.5Операторы присваивания
- •5.2.6Управляющие операторы
- •5.2.7Комментарии
- •5.3 Процедурные единицы
- •5.3.1Процедуры
- •5.3.2Событийно-управляемые программные системы
- •5.3.3Параметры
- •5.3.4Функции
- •5.3.5Операторы ввода-вывода
- •5.4 Реализация языка программирования
- •5.4.1Процесс трансляции программы
- •5.4.2Реализация java
- •5.4.3Компоновка и загрузка
- •5.4.4Пакеты разработки программного обеспечения
- •5.5 Объектно-ориентированное программирование
- •5.5.1Классы и объекты
- •5.5.3Конструкторы
- •5.5.4Дополнительные возможности
- •5.6 Параллельные операции
- •5.7 Декларативное программирование
- •5.7.1Логическая дедукция
- •5.7.2Язык программирования Prolog
- •6Разработка программного обеспечения
- •6.1 Разработка программного обеспечения
- •6.1.1Ассоциация по вычислительной технике
- •6.1.2Институт инженеров по электротехнике и электронике
- •6.2 Жизненный цикл программы
- •6.2.1Цикл как единое целое
- •6.2.2Разработка программного обеспечения на практике
- •6.2.3Этапы разработки программного обеспечения
- •6.2.4Анализ
- •6.2.5Проектирование
- •6.2.6Реализация
- •6.2.7Тестирование
- •6.2.8Современные тенденции
- •6.3 Модульность
- •6.3.1Модульная реализация программы
- •6.3.2Связь модулей системы
- •6.3.3Связность модуля
- •6.4 Методики проектирования
- •6.4.1Нисходящее и восходящее проектирование
- •6.4.2Модели проектирования
- •6.4.3Разработка открытых программных продуктов
- •6.5 Инструменты проектирования
- •6.6 Тестирование
- •6.7 Документация
- •6.8 Право собственности на программное обеспечение и ответственность
- •Часть 3 организация данных
- •7Структуры данных
- •7.1 Основы структур данных
- •7.1.1Опять абстракция
- •7.1.2Статические и динамические структуры
- •7.1.3Указатели
- •7.2 Массивы
- •7.3 Списки
- •7.3.1Непрерывные списки
- •7.3.2Реализация непрерывных списков
- •7.3.3Связные списки
- •7.3.4Поддержка абстрактного списка
- •7.4 Стеки
- •7.4.1Откат
- •7.4.2Реализация стека
- •7.5 Очереди
- •7.5.1Проблема указателей
- •7.6 Деревья
- •7.6.1Реализация дерева
- •7.6.2Сбор мусора
- •7.6.3Пакет бинарного дерева
- •7.7 Пользовательские типы данных
- •7.7.1Пользовательские типы
- •7.7.2Классы
- •7.7.3Описательное и процедурное знание
- •7.7.4Стандартная библиотека шаблонов
- •7.8 Указатели в машинном языке
- •8Файловые структуры
- •8.1 Роль операционной системы
- •8.1.1Таблицы размещения файлов
- •8.2 Последовательные файлы
- •8.2.1Обработка последовательных файлов
- •8.2.2Консорциум производителей программного обеспечения для www
- •8.2.3Текстовые файлы
- •8.2.4Текстовые и двоичные файлы
- •8.2.5Вопросы программирования
- •8.2.6Семантическая сеть
- •8.3 Индексация
- •8.3.1Основные положения индексации
- •8.3.2Вопросы программирования
- •8.3.3Расположение файлов на дисках
- •8.4 Хэширование
- •8.4.1Хэш-система
- •8.4.2Проблемы распределения
- •8.4.3Аутентификация посредством хэширования
- •8.4.4Вопросы программирования
- •9Структуры баз данных
- •9.1 Общие вопросы
- •9.2 Многоуровневый подход к реализации базы данных
- •9.2.1Система управления базой данных
- •9.2.2Распределенные базы данных
- •9.2.3Модели баз данных
- •9.3 Реляционная модель баз данных
- •9.3.1Вопросы реляционного проектирования
- •9.3.2Системы баз данных для персональных компьютеров
- •9.3.3Хронологические базы данных
- •9.3.4Реляционные операции
- •9.3.5Вопросы реализации
- •9.3.6Язык sql
- •9.4 Объектно-ориентированные базы данных
- •9.5 Поддержка целостности базы данных
- •9.5.1Пространственные базы данных
- •9.5.2Протоколы фиксации/отката изменений
- •9.5.3Блокировка
- •9.6 Воздействие технологий баз данных на общество
- •10Искусственный интеллект
- •10.1 Интеллект и машины
- •10.1.1Конечный результат или имитация
- •10.1.2Истоки искусственного интеллекта
- •10.1.3Тест Тьюринга
- •10.1.4Машина для решения головоломки из восьми фишек
- •10.2 Распознавание образов
- •10.3 Мышление
- •10.3.1Продукционные системы
- •10.3.2Интеллект, основанный на поведении
- •10.3.3Деревья поиска
- •10.3.4Эвристика
- •10.4 Искусственные нейронные сети
- •10.4.1Основные свойства
- •10.4.2Приложение теории
- •10.4.3Ассоциативная память
- •10.5 Генетические алгоритмы
- •10.6 Прочие области исследования
- •10.6.1Обработка лингвистической информации
- •10.6.2Рекурсия в естественных языках
- •10.6.3Роботы
- •10.6.4Системы баз данных
- •10.6.5Экспертные системы
- •10.7 Обдумывая последствия
- •10.7.1Сильный искусственный интеллект против слабого
- •11Теория вычислений
- •11.1 Функции и их вычисление
- •11.1.1Теория рекурсивных функций
- •11.2 Машины Тьюринга
- •11.2.1Основы машины Тьюринга
- •11.2.2Истоки машины Тьюринга
- •11.2.3Тезис Черча-Тьюринга
- •11.3 Универсальные языки программирования
- •11.3.1Скелетный язык
- •11.3.2Существуют ли инопланетяне?
- •11.3.3Универсальность скелетного языка
- •11.4 Невычислимая функция
- •11.4.1Проблема останова
- •11.4.2Неразрешимость проблемы останова
- •11.5 Сложность задач
- •11.5.1Измерение сложности задачи
- •11.5.2Пространственная сложность
- •11.5.3Полиномиальные и не полиномиальные задачи
- •11.5.5Детерминированность против недетерминированности
- •11.6Шифрование с открытым ключом
- •11.6.1Шифрование при помощи задачи о ранце
- •11.6.2Популярные системы шифрования
- •11.6.3Модульная арифметика
- •11.6.4Обратно к шифрованию
СОДЕРЖАНИЕ
ПРЕДИСЛОВИЕ 7
ВЕБ-СТРАНИЦЫ 8
ВВЕДЕНИЕ 11
1 АРХИТЕКТУРА ЭВМ 21
1.1 Биты и их хранение 21
1.1.1 Вентили и триггеры 21
1.1.2 Другие способы хранения битов 24
1.1.3 Шестнадцатеричная система счисления 24
1.2 Оперативная память 25
1.2.1 Структура памяти 25
1.2.2 Измерение емкости памяти 27
1.3 Устройства хранения данных 27
1.3.1 Магнитные диски 28
1.3.2 Компакт-диски 29
1.3.3 Магнитные ленты 30
1.3.4 Хранение и поиск файлов 31
1.4 Представление информации в виде двоичного кода 32
1.4.1 Представление текста 32
1.4.2 Американский национальный институт стандартов 32
1.4.3 ISO - международная организация по стандартизации 33
1.4.4 Представление числовых значений 33
1.4.5 Представление изображений 35
1.4.6 Представление звука 36
1.5 Двоичная система счисления 37
1.5.1 Альтернатива двоичной системе счисления 38
1.5.2 Дроби в двоичной системе счисления 38
1.5.3 Аналоговые и цифровые устройства 39
1.6 Хранение целых чисел 39
1.6.1 Представление в двоичном дополнительном коде 39
1.6.2 Сложение в двоичном дополнительном коде 41
1.6.3 Проблема переполнения 41
1.6.4 Представление с избытком 42
1.7 Хранение дробей 43
1.7.1 Представление с плавающей точкой 43
1.7.2 Ошибка усечения 45
1.8 Сжатие данных 46
1.8.1 Общие методы сжатия данных 46
1.8.2 Сжатие звука 47
1.8.3 Сжатие изображений 48
1.9 Ошибки передачи данных 49
1.9.1 Контрольный разряд четности 50
1.9.2 Коды с исправлением ошибок 51
2 МАНИПУЛИРОВАНИЕ ДАННЫМИ 52
2.1 Архитектура ЭВМ 52
2.1.1 Сложение двух чисел, хранящихся в оперативной памяти 53
2.1.2 Кто и что изобрел? 53
2.2 Машинный язык 54
2.2.1 Система команд 54
2.2.2 Кэш-память 54
2.2.3 Арифметико-логические команды 55
2.2.4 Команды управления 55
2.2.5 Деление двух значений, хранящихся в памяти 55
2.3 Выполнение программы 58
2.3.1 Пример выполнения программы 59
2.3.2 Команды переменной длины 61
2.3.3 Программы и данные 61
2.4 Арифметические и логические операции 61
2.4.1 Логические операции 61
2.4.2 Сравнение вычислительной мощности эвм 63
2.4.3 Операции сдвига 63
2.4.4 Арифметические операции 64
2.5 Связь с другими устройствами 64
2.5.1 Связь через контроллер 65
2.5.2 Строение шины 66
2.5.3 Скорость передачи данных 67
2.6 Другие архитектуры 68
2.6.1 Конвейерная обработка 68
3 ОПЕРАЦИОННЫЕ СИСТЕМЫ И ОРГАНИЗАЦИЯ СЕТЕЙ 71
3.1 3.1. Эволюция операционных систем 71
3.1.1 Однопроцессорные системы 71
3.1.2 Многопроцессорные системы 73
3.2 Архитектура операционной системы 74
3.2.1 Программное обеспечение 74
3.2.2 Полезное единообразие или вредная монополия? 75
3.2.3 Компоненты операционной системы 76
3.2.4 Операционная система linux 76
3.2.5 Начало работы операционной системы 78
3.3 Координирование действий машины 79
3.3.1 Понятие процесса 79
3.3.2 Управление процессами 80
3.3.3 Модель «клиент-сервер» 81
3.4 Обработка конкуренции между процессами 82
3.4.1 Семафор 82
3.4.2 Взаимная блокировка 84
3.5 Сети 85
3.5.1 Основы организации сетей 85
3.5.2 Интернет 87
3.5.3 Топология сети Интернет 87
3.5.4 Система адресов Интернета 88
3.5.5 Электронная почта 89
3.5.6 Всемирная паутина 89
3.6 Сетевые протоколы 91
3.6.1 Управление правом отправки сообщений 91
3.6.2 Сеть ethernet 92
3.6.3 JAVASCRIPT, апплеты, CGI и сервлеты 93
3.6.4 Многоуровневый принцип программного обеспечения Интернета 93
3.6.5 Комплект протоколов TCP/IP 96
3.6.6 Протоколы РОРЗ и IMAP 97
3.7 Безопасность 98
3.7.1 Протокол защищенных сокетов 99
3.7.2 Группа компьютерной «скорой помощи» 100
4 АЛГОРИТМЫ 102
4.1 Понятие алгоритма 102
4.1.1 Предварительные замечания 102
4.1.2 Формальное определение алгоритма 102
4.1.3 Определение алгоритма 102
4.1.4 Абстрактная природа алгоритма 103
4.2 Представление алгоритма 104
4.2.1 Примитивы 104
4.2.2 Псевдокод 106
4.3 Создание алгоритма 109
4.3.1 Искусство решения задач 109
4.3.2 Итеративные структуры в музыке 110
4.3.3 Первый шаг в решении задачи 111
4.4 Итеративные структуры 113
4.4.1 Алгоритм последовательного поиска 113
4.4.2 Управление циклом 114
4.4.3 Алгоритм сортировки методом вставок 116
4.5 Рекурсивные структуры 119
4.5.1 Поиск и сортировка 119
4.5.2 Алгоритм двоичного поиска 119
4.5.3 Управление рекурсивными структурами 124
4.6 Эффективность и правильность 125
4.6.1 Эффективность алгоритма 125
4.6.2 Проверка правильности программного обеспечения 128
4.6.3 По ту сторону проверки правильности программ 128
5 ЯЗЫКИ ПРОГРАММИРОВАНИЯ 132
5.1 Исторический обзор 132
5.1.1 Ранние поколения 132
5.1.2 Интерплатформенное программное обеспечение 133
5.1.3 Независимость от машины 134
5.1.4 Парадигмы программирования 135
5.2 Основные понятия традиционного программирования 139
5.2.1 Культуры языков программирования 139
5.2.2 Переменные и типы данных 140
5.2.3 Структуры данных 141
5.2.4 Константы и литералы 143
5.2.5 Операторы присваивания 144
5.2.6 Управляющие операторы 145
5.2.7 Комментарии 147
5.3 Процедурные единицы 148
5.3.1 Процедуры 149
5.3.2 Событийно-управляемые программные системы 150
5.3.3 Параметры 150
5.3.4 Функции 152
5.3.5 Операторы ввода-вывода 153
5.4 Реализация языка программирования 155
5.4.1 Процесс трансляции программы 155
5.4.2 Реализация java 156
5.4.3 Компоновка и загрузка 160
5.4.4 Пакеты разработки программного обеспечения 160
5.5 Объектно-ориентированное программирование 161
5.5.1 Классы и объекты 161
5.5.2 CORBAи RMI 162
5.5.3 Конструкторы 163
5.5.4 Дополнительные возможности 164
5.6 Параллельные операции 165
5.7 Декларативное программирование 167
5.7.1 Логическая дедукция 167
5.7.2 Язык программирования Prolog 169
6 РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ 171
6.1 Разработка программного обеспечения 171
6.1.1 Ассоциация по вычислительной технике 171
6.1.2 Институт инженеров по электротехнике и электронике 172
6.2 Жизненный цикл программы 173
6.2.1 Цикл как единое целое 173
6.2.2 Разработка программного обеспечения на практике 174
6.2.3 Этапы разработки программного обеспечения 174
6.2.4 Анализ 174
6.2.5 Проектирование 175
6.2.6 Реализация 175
6.2.7 Тестирование 175
6.2.8 Современные тенденции 175
6.3 Модульность 177
6.3.1 Модульная реализация программы 177
6.3.2 Связь модулей системы 178
6.3.3 Связность модуля 180
6.4 Методики проектирования 181
6.4.1 Нисходящее и восходящее проектирование 181
6.4.2 Модели проектирования 181
6.4.3 Разработка открытых программных продуктов 183
6.5 Инструменты проектирования 184
6.6 Тестирование 187
6.7 Документация 188
6.8 Право собственности на программное обеспечение и ответственность 189
7 СТРУКТУРЫ ДАННЫХ 193
7.1 Основы структур данных 193
7.1.1 Опять абстракция 193
7.1.2 Статические и динамические структуры 193
7.1.3 Указатели 194
7.2 Массивы 194
7.3 Списки 196
7.3.1 Непрерывные списки 196
7.3.2 Реализация непрерывных списков 197
7.3.3 Связные списки 197
7.3.4 Поддержка абстрактного списка 199
7.4 Стеки 200
7.4.1 Откат 200
7.4.2 Реализация стека 202
7.5 Очереди 202
7.5.1 Проблема указателей 204
7.6 Деревья 205
7.6.1 Реализация дерева 206
7.6.2 Сбор мусора 207
7.6.3 Пакет бинарного дерева 208
7.7 Пользовательские типы данных 212
7.7.1 Пользовательские типы 212
7.7.2 Классы 213
7.7.3 Описательное и процедурное знание 214
7.7.4 Стандартная библиотека шаблонов 215
7.8 Указатели в машинном языке 215
8 ФАЙЛОВЫЕ СТРУКТУРЫ 218
8.1 Роль операционной системы 218
8.1.1 Таблицы размещения файлов 219
8.2 Последовательные файлы 220
8.2.1 Обработка последовательных файлов 220
8.2.2 Консорциум производителей программного обеспечения для www 221
8.2.3 Текстовые файлы 223
8.2.4 Текстовые и двоичные файлы 223
8.2.5 Вопросы программирования 226
8.2.6 Семантическая сеть 227
8.3 Индексация 227
8.3.1 Основные положения индексации 227
8.3.2 Вопросы программирования 229
8.3.3 Расположение файлов на дисках 230
8.4 Хэширование 230
8.4.1 Хэш-система 231
8.4.2 Проблемы распределения 232
8.4.3 Аутентификация посредством хэширования 233
8.4.4 Вопросы программирования 234
9 СТРУКТУРЫ БАЗ ДАННЫХ 236
9.1 Общие вопросы 236
9.2 Многоуровневый подход к реализации базы данных 238
9.2.1 Система управления базой данных 238
9.2.2 Распределенные базы данных 239
9.2.3 Модели баз данных 240
9.3 Реляционная модель баз данных 240
9.3.1 Вопросы реляционного проектирования 241
9.3.2 Системы баз данных для персональных компьютеров 241
9.3.3 Хронологические базы данных 242
9.3.4 Реляционные операции 245
9.3.5 Вопросы реализации 248
9.3.6 Язык SQL 249
9.4 Объектно-ориентированные базы данных 250
9.5 Поддержка целостности базы данных 252
9.5.1 Пространственные базы данных 252
9.5.2 Протоколы фиксации/отката изменений 252
9.5.3 Блокировка 253
9.6 Воздействие технологий баз данных на общество 254
10 ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ 257
10.1 Интеллект и машины 257
10.1.1 Конечный результат или имитация 257
10.1.2 Истоки искусственного интеллекта 257
10.1.3 Тест Тьюринга 258
10.1.4 Машина для решения головоломки из восьми фишек 259
10.2 Распознавание образов 260
10.3 Мышление 262
10.3.1 Продукционные системы 262
10.3.2 Интеллект, основанный на поведении 263
10.3.3 Деревья поиска 265
10.3.4 Эвристика 266
10.4 Искусственные нейронные сети 270
10.4.1 Основные свойства 270
10.4.2 Приложение теории 272
10.4.3 Ассоциативная память 275
10.5 Генетические алгоритмы 277
10.6 Прочие области исследования 280
10.6.1 Обработка лингвистической информации 280
10.6.2 Рекурсия в естественных языках 280
10.6.3 Роботы 282
10.6.4 Системы баз данных 283
10.6.5 Экспертные системы 284
10.7 Обдумывая последствия 286
10.7.1 Сильный искусственный интеллект против слабого 287
11 ТЕОРИЯ ВЫЧИСЛЕНИЙ 289
11.1 Функции и их вычисление 289
11.1.1 Теория рекурсивных функций 290
11.2 Машины Тьюринга 290
11.2.1 Основы машины Тьюринга 291
11.2.2 Истоки машины Тьюринга 291
11.2.3 Тезис Черча-Тьюринга 293
11.3 Универсальные языки программирования 293
11.3.1 Скелетный язык 294
11.3.2 Существуют ли инопланетяне? 294
11.3.3 Универсальность скелетного языка 297
11.4 Невычислимая функция 297
11.4.1 Проблема останова 298
11.4.2 Неразрешимость проблемы останова 299
11.5 Сложность задач 301
11.5.1 Измерение сложности задачи 301
11.5.2 Пространственная сложность 302
11.5.3 Полиномиальные и не полиномиальные задачи 304
11.5.4 NP-задачи 306
11.5.5 Детерминированность против недетерминированности 307
11.6 Шифрование с открытым ключом 308
11.6.1 Шифрование при помощи задачи о ранце 308
11.6.2 Популярные системы шифрования 308
11.6.3 Модульная арифметика 310
11.6.4 Обратно к шифрованию 311
Предисловие
Эта книга является вводным курсом в вычислительную технику. Она включает в себя широкий круг тем, рассмотренных достаточно глубоко, чтобы дать полное представление о предмете.
Читатели книги
Данное пособие предназначено не только для студентов, специализирующихся в области вычислительной техники, но и для студентов, изучающих другие дисциплины. Что касается учащихся, специализирующихся в области вычислительной техники, то многие из них начинают обучение с иллюзией, что вычислительная техника — это программирование и просмотр веб-страниц, так как это, в сущности, все, что они видели. Однако вычислительная техника представляет собой гораздо большее. Кроме того, студенты, начинающие изучать вычислительную технику, нуждаются в представлении объема того предмета, по которому они планируют специализироваться. Дать это представление и является целью настоящей книги. Она содержит обзор тем по вычислительной технике — базу, с помощью которой студенты в будущем смогут понять уместность определенного курса и отношения между курсами.
Такие знания необходимы и студентам, специализирующимся по другим дисциплинам, если им предстоит общаться со специалистами в этой области. Курс вычислительной техники для неспециалистов должен обеспечивать фундаментальное понимание области целиком, а не просто содержать введение в популярные пакеты прикладных программ. Этот подход к книге как к обозрению используется для вводных курсов в естественных науках, и именно этой модели придерживался автор при написании данной книги. Главной целью была доступность для читателей, не являющихся специалистами в этой области. В результате предыдущие издания книги с успехом использовались в курсах для студентов самых различных направлений. Настоящее издание продолжает эту традицию.
Содержание книги
Книга построена по восходящему принципу, повествование развертывается от конкретного к абстрактному, в порядке, который обеспечивает педагогически правильное изложение материала, когда каждая тема ведет к другой. Книга начинается с основ архитектуры ЭВМ (часть 1), переходит к программному обеспечению и процессу разработки программного обеспечения (часть 2), исследует вопросы организации и хранения данных (часть 3) и завершается применением компьютерных технологий в настоящем и некоторыми прогнозами на будущее. При написании книги автор старался выстроить единый сюжет. Поэтому не удивительно, что многие студенты сравнивают чтение книги с чтением романа. С другой стороны, книга разделена на большие независимые главы и разделы, которые можно читать по отдельности (см. «Введение», рис. 0.5) или изменить порядок прочтения. В действительности, книга часто используется как учебное пособие для курсов, которые преподносят материал в различном порядке. Наиболее распространенная альтернатива — начинать с материала, излагаемого в главах 4 и 5 («Алгоритмы» и «Языки программирования»), и затем по желанию возвращаться к более ранним главам. Однако бывало, что изложение курса начиналось с материалов по вычислимости из главы 11. (Во всех остальных случаях книга использовалась в базовых курсах, где она служила основой для студентов разных направлений). Вот предлагаемая последовательность для тех, кто желает получить «полную версию романа»:
Помимо общего содержания существует несколько тем, которые не выделены в отдельный раздел. Одна из них — это вычислительная техника в развитии. Некоторые вопросы рассматриваются с точки зрения истории, обсуждается современное состояние области, и обозначаются направления текущих исследований. Другая тема — роль абстракции и способ использования абстрактных инструментов для контроля сложности.
ВЕБ-СТРАНИЦЫ
Поддержка книги осуществляется страницей http://www.aw.com/brookshear. Она является официальной страницей книги и обслуживается компанией Addison-Wesley. Там можно найти материалы и для студентов, и для преподавателей, такие как программное обеспечение поддержки (например, имитатор машины, которая приводится в качестве примера в главе 2 и описывается в приложении В), лабораторные справочники, ссылки на страницы с темами, которые могут быть интересными, руководство для преподавателей и слайды). Также есть возможность посетить персональную страницу автора — http://mscs.mu.edu/~glennb. Она не слишком официальная, но автор старается размещать там информацию, которая может быть полезна для читателей.
Студентам от автора
Я впервые столкнулся с вычислительной техникой во время моей командировки в военно-морские силы США в конце 60-х - начале 70-х годов. (Да, этот факт старит меня, но это случится и с вами. Кроме того, возраст делает меня мудрым, поэтому вам следует прислушиваться к моим словам.) Большую часть того времени я провел, обслуживая систему программного обеспечения на вычислительной установке в морском ведомстве в Лондоне. После завершения миссии я вернулся в университет и в 1975 году получил докторскую степень. С тех пор я преподаю вычислительную технику и математику.
С годами многое в вычислительной технике изменилось, но и многое осталось прежним. В частности, она была и остается завораживающей. В этой сфере происходит много впечатляющих событий. Развитие Интернета, прогресс в области искусственного интеллекта, способность собирать и распространять информацию в немыслимых количествах — вот только некоторые из процессов, которые оказывают влияние на нашу жизнь. Вы живете в удивительном меняющемся мире, и у вас есть возможность быть частью происходящего. Воспользуйтесь этой возможностью!
Я немного диссидент (некоторые из моих друзей сказали бы — более чем), поэтому, принявшись за написание книги, я не всегда следовал совету, который получил. А именно многие заявляли, что некоторые материалы являются слишком сложными для начинающих студентов. Но я считаю, что если тема уместна, то она уместна, даже если ученое сообщество рассматривает ее как «продвинутую». Вы заслуживаете книги, которая дает полную картину вычислительной техники, а не только ее разбавленную версию, содержащую искусственно упрощенные представления тех тем, которые считались допустимыми для начинающих студентов.
Я не опускал сложные темы, а искал лучшие объяснения. Я попытался достаточно глубоко дать полную картину того, что представляет собой вычислительная техника. (Существует разница между тем фактом, что при запуске космического корабля много шума, и осознанием того, что он проникает в каждую клетку вашего тела.) Как в случае со специями в рецепте: может быть, вы захотите пропустить некоторые из разделов, но они все равно присутствует здесь, чтобы вы при желании могли попробовать их — и я призываю вас сделать это.
Наконец, я должен подчеркнуть, что, как и в любом другом курсе, касающемся техники, те знания, которые вы приобретете сегодня, могут не понадобиться вам завтра. Область вычислительной техники динамична, и это замечательно. Этот учебник даст вам картину современного состояния предмета и покажет его историческое развитие. С такими знаниями вы будете подготовлены к тому, чтобы расти вместе с технологиями. Я призываю вас начать процесс развития сейчас, с изучения этой книги. Учитесь учиться.
Спасибо за доверие, которое вы оказали мне, выбрав мою книгу. Как автор я обязан написать труд, который стоил бы вашего времени. Я надеюсь, что выполнил это обязательство.
Преподавателям от автора
В этой книге содержится больше материала, чем может вместить один семестр, поэтому можете без колебаний опускать те разделы, которые не соответствуют целям вашего курса, или заменять порядок их следования на более подходящий. Я написал эту книгу, чтобы она использовалась как источник материалов для курсов, а не как их определение. Вы обнаружите, что хотя учебник имеет некоторый план, темы в нем даются независимо друг от друга, что позволяет вам выбирать любые из них по желанию (см. введение, рис. 0.5).
На первой странице каждой главы я использовал знак звездочка (*), чтобы обозначить те разделы, которые я считаю факультативными: они более глубоко освещают темы, которые, возможно, вы не захотите затрагивать. Но это только предложение. В частности, вы обнаружите, что краткая версия учебника, обрисованная ранее в этом предисловии, пропускает более чем просто «факультативные» разделы. Для ясности посмотрите главу 7 «Структуры данных». В зависимости от целей вашего курса вы можете поступать с этой главой любым из способов, к которым я прибегал время от времени. Во-первых, в курсе «компьютерной грамотности», вы можете опустить всю главу. Если вы хотите просто познакомить студентов с предметом структур данных, вы можете дать только разделы 7.1 и 7.2 (как предполагается в краткой версии). Если, кроме того, вы хотите представить и основные структуры, вам необходимо дать разделы 7.1-7.6. Наконец, если вы хотите расширить изучение и включить типы данных или указатели в машинном языке, вы можете дать «факультативные» разделы 7.7 и/или 7.8.
Я также предлагаю использовать некоторые разделы в качестве дополнительного чтения для студентов. Я думаю, мы недооцениваем студентов, считая, что все должны объяснять в аудитории. Мы должны помогать им учиться самостоятельно.
Я уже упоминал, что учебник имеет восходящую, от конкретного к абстрактному, структуру, но я хотел бы рассказать об этом более подробно. Как ученые, мы часто полагаем, что студенты оценят наше видение предмета, приобретаемое годами работы в этой области. Представляется более эффективным давать материал с учетом психологии студента. Именно поэтому книга начинается с представления и хранения данных, архитектуры ЭВМ и машинного языка. Это темы, которые студенты охотно изучают: они видят составляющие компьютера, могут потрогать их, и большинство студентов будут их использовать. Начиная курс с этих тем, я предполагал, что студенты найдут ответы на многочисленные «почему», копившиеся годами, и научатся воспринимать этот курс как практический, а не как теоретический. После этого будет естественным перейти к более абстрактным вопросам: к алгоритмам, к проектированию, представлению данных и к оценке сложности задач, которые многими рассматриваются как главные темы курса.
Мы все знаем, что студенты узнают гораздо больше того, чему мы учим их непосредственно в аудитории, и знания, которые они получают извне, часто усваиваются лучше, чем полученные непосредственно на лекции. Это важно, когда мы приступаем к «обучению» решать задачи. Студенты не научатся решать задачи, изучая методы их решения как изолированный предмет. Они научатся решать задачи, только решая задачи. Поэтому я включил в книгу много заданий. Я призываю вас использовать их.
Другой вопрос, который я причисляю к той же категории, это вопрос профессионализма, этики и социальной ответственности. Я считаю, что эти темы не должны быть представлены изолированно. Вместо этого они должны быть расположены там, где это уместно, что и сделано в данной книге. Вы увидите, что разделы 0.5, 3.7, 6.1, 6.8, 9.6, 10.1 и 10.7 включают такие темы, как безопасность, секретность, ответственность и социальная осведомленность в контексте таких вопросов, как организация сетей, системы баз данных, разработка программного обеспечения и искусственный интеллект. Вы также обнаружите, что каждая глава включает круг вопросов, названных «Социальные вопросы», который призывает студентов подумать над материалом книги применительно к обществу, в котором они живут.
Педагогические особенности
Эта книга является результатом многих лет преподавательской деятельности. Поэтому в ней много учебных материалов. Прежде всего, большое количество задач, требующих участия студента, — более 1000 в этом седьмом издании (1010, если быть точным). Они разделены на «Вопросы и упражнения», «Повторение материала» и «Социальные вопросы». «Вопросы и упражнения» находятся в конце каждого раздела. Они дают обзор только что обсуждавшегося материала, расширяют предыдущее обсуждение или намекают на родственные темы, которые будут обсуждаться позднее. Ответы на эти вопросы приводятся в приложении Е.
«Повторение материала» находится в конце каждой главы (кроме «Введения») и представляет собой задания для домашней работы, они охватывают материал целой главы и для них не приводятся ответы.
Также в конце каждой главы находятся разделы «Социальные вопросы». Они предназначены для размышления и обсуждения. Многие из них могут использоваться в качестве задания провести исследование и представить письменный или устный доклад.
Седьмое издание
Хотя это седьмое издание имеет такую же структуру, как и предыдущее, в него были добавлены некоторые новые разделы, а некоторые, наоборот, удалены; большая часть материала переписана заново, чтобы дать современное и релевантное представление о вычислительной технике.
Седьмое издание наиболее существенно отличается от шестого в педагогическом плане. Большая часть материала реорганизована и переписана для того, чтобы сделать учебник более понятным, а объяснения более простыми. Например, реорганизованы разделы 2.1 и 2.2 («Архитектура ЭВМ» и «Машинный язык»), смягчено введение в алгоритмы в разделе 4.1, реорганизовано введение в структуры данных (раздел 7.1), раздел 7.7 («Дополнительные типы данных») был упрощен, материал по последовательным и текстовым файлам объединен в один раздел (8.2), материал по вычислимости (разделы 11.1-11.3) переписан. Кроме того, в книгу добавлено много рисунков и улучшено качество схем.
Также было добавлено много новых разделов, таких как способы кодирования звука (глава 1), более широкое освещение организации сетей (глава 3), разработка открытых исходных текстов (глава 6), дополнительные материалы по авторским правам и патентам (глава 6), XML (глава 8) и ассоциативная память (раздел 10.4). Кроме того, по всему тексту были добавлены многочисленные вставки, которые расширяют материал текста.
Благодарности
Прежде всего, я хочу выразить благодарность тем, кто поддержал эту книгу, читая и используя ее предыдущие издания. Я польщен.
С каждым новым изданием книги список тех, кто способствовал изданию книги как рецензенты и консультанты, растет. Сегодня этот список включает следующие имена: Дж. М. Адаме (J. M. Adams), С. М. Аллен (С. М. Allen), Д. С. С. Эл-лисон (D. С. S. Allison), Б. Ауэрнхаймер (В. Auernheimer), П. Бэнкстон (P. Bank-ston), М. Барнард (М. Barnard), П. Бендер (P. Bender), К. Бауер (К. Bowyer), П. У. Брашхер (P. W. Brashear), С. М. Браун (С. М. Brown), Б. Каллони (В. Cal-loni), М. Кланси (М. Clancy), Р. Т. Клоуз (R. Т. Close), Д. X. Кули (D. H. Cooley), Л. Д. Корнелл (L. D. Cornell), М. Дж. Кроули (М. J. Crowley), Ф. Дик (F. Deek), М. Дикерсон (М. Dickerson), М. Дж. Дункан (М. J. Duncan), С. Фокс (S. Fox), Н. Е. Гиббс (N. E. Gibbs), Дж. Д. Харрис (J. D. Harris), Д. Хаском (D. Hascom), Л. Хелф (L. Health), П. Б. Хендерсон (Р. В. Henderson), Л. Хант (L. Hunt), M. Хат-ченрувер (М. Hutchenreuther), Л. Э. Джен (L. A. Jehn), К. Корб (К. Korb), Дж. Кренц (G. Krenz), Дж Ли (J. Liu), Т. Дж. Лонг (Т. J. Long), С. Мэй (С. May), У. Мак-Коун (W. McCown), С. Дж. Мэрилл (S. J. Merill), К. Мессершмит (К. Mes-sersmith), Дж. С. Мойер (J. С. Моуег), М. Мерфи (М. Murphy), Дж. П. Майерс (J. P. Mayers), Д. С. Нонан (D. S. Noonan), С. Олариу (S. Olariu), Дж. Райе (G. Rice), Н. Рикерт (N. Rickert), С. Ридезел (С. Riedesel), Дж. Б. Роджерс (J. В. Rogers), Дж. Саито (G. Saito), У. Савич (W. Savitch), Р. Шлафли (R. Schlafly), Дж. С. Шлим-мер (J. С. Schlimmer), С. Селлс (S. Sells), Дж. Шеппард (G. Sheppard), 3. Сцен (Z. Seen), Дж. С. Симмс (J. С. Simms), М. С. Слаттери (М. С. Slattery), Дж Сли-мик (J. Slimick), Дж. А. Сломка (J. A. Slomka), Д. Смит (D. Smith), Дж. Солдерич (J. Solderitsch), Р. Стиджервальд (R. Stiegerwald), Л. Штейнберг (L. Steinberg), С. А. Страбл (С. A. Struble), С. Л. Страбл (С. L. Struble), У. Дж. Таффе (W. J. Taffe), Дж. Талберт (J. Talburt), П. Тромович (P. Tromovitch), Е. Д. Винтер (Е. D. Winter), Е. Райт (Е. Wright), М. Циглер (М. Ziegler) и один неизвестный. Всем этим людям я выражаю свою искреннюю благодарность.
Я также выражаю благодарность людям из Addison-Wesley, Argosy Publishing и Theurer Briggss Design, чьи усилия отражены на этих страницах. Коллектив, который проходит через процесс издания книги, становится семьей. Во время подготовки этого седьмого издания моя семья выросла и приобрела прекрасных людей.
Моя жена Эрлен и дочь Черил были для меня огромной поддержкой все эти годы. Я благодарю их за то, что мирились с автором во мне. Они поняли, что книга может лишить рассеянного профессора чувства реальности. Утешительно быть способным погрузиться в такое ученое занятие, как написание книги, зная, что кто-то другой сохраняет связь с реальностью. В частности, утром 11 декабря 1998 года я остался в живых после сердечного приступа только потому, что моя жена привезла меня вовремя в больницу. (Для тех из вас, кто молод, я могу объяснить, что пережить сердечный приступ — это что-то вроде получения отсрочки при выполнении домашнего задания.)
Наконец, я благодарю моих родителей, которым и посвящена эта книга, за то, что внушили мне важность образования. Я заканчиваю следующим высказыванием, источник которого пусть останется анонимным: «Книга нашего сына действительно хорошая. Каждый должен прочитать ее».
J. G. В.
От издательства
Ваши замечания, предложения и вопросы отправляйте по адресу электронной почты comp@piter.com (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
Подробную информацию о наших книгах вы найдете на веб-сайте издательства http://www.piter.com.
