- •Предисловие
- •Введение
- •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Обратно к шифрованию
10.1.4Машина для решения головоломки из восьми фишек
Если такие философские вопросы возникли уже при зарождении теории искусственного интеллекта, неудивительно, что эта тема ассоциируется с аурой загадочности, которую зачастую эксплуатируют средства массовой информации, писатели-фантасты и режиссеры зрелищных фильмов. К счастью, сейчас нам не требуется решать этические вопросы, мы всего лишь хотим исследовать, как можно запрограммировать машину, чтобы она выглядела разумной. Подойдем к решению, начав с обсуждения устройства машины с элементарными интеллектуальными характеристиками.
Наша машина имеет вид коробки, оборудованной захватом, видеокамерой и манипулятором с резиновым наконечником, который не скользит при передвижении фишки (рис. 10.1). Представьте, что эта машина установлена на столе, где лежит головоломка из восьми фишек. Такая головоломка представляет собой восемь квадратных плиток, помеченных цифрами от 1 до 8, лежащих в открытой
коробке, вмещающей 9 таких фишек (три строки и три столбца). Среди фишек есть одно свободное место, на которое можно передвинуть любую из соседних фишек. В данный момент головоломка собрана, как показано на рис. 10.2.
Мы начинаем с того, что берем фишки и перемещаем их, последовательно выталкивая произвольно выбранные фишки на свободное место. Затем мы включаем машину, и захват начинает раскрываться и закрываться, как бы прося головоломку. Мы помещаем ее в захват, и он фиксирует головоломку. Через некоторое время манипулятор опускается и начинает толкать фишки внутри коробки (в каком-то порядке), пока не будет восстановлен исходный порядок. После этого машина отпускает головоломку и автоматически выключается. Так как такая машина должна обладать элементарными возможностями восприятия и мышления, на основе ее дизайна мы будем рассматривать темы двух следующих разделов.
10.2 Распознавание образов
Закрывание и открывание захвата машины не представляет проблемы, и распознать наличие головоломки в захвате во время процесса ее решения также несложно, так как от нашего приложения не требуется большой точности. (К примеру, автоматический механизм ворот гаража может распознать и отреагировать на наличие помехи на пути двери во время закрытия.) Даже проблему фокусировки камеры на головоломке можно легко решить, запрограммировав захват так, чтобы он помещал головоломку в определенное положение, подходящее для просмотра. Следовательно, первое интеллектуальное действие, которое требуется от нашей машины, — это считывание информации с визуального носителя.
Важно понимать, что проблема, с которой сталкивается машина во время наблюдения головоломки, это не просто воспроизведение и хранение изображения. Такая задача решена уже давно — например, при помощи традиционных фотографических и телевизионных систем. Наша задача состоит в распознавании изображения и получении текущего состояния головоломки (а позже и в управлении движением фишек). В этом существенное отличие от приемника телевизионных сигналов, который просто преобразует образы с одного носителя на другой, не распознавая само изображение. Итак, наша машина должна демонстрировать способность распознавать образы (understanding images).
В случае нашей машины для решения головоломки количество вариантов изображений, которые могут быть получены в ходе распознавания, ограничено. Мы можем предположить, что полученный образ — это всегда головоломка с восемью цифрами от 1 до 8 в каком-либо порядке. Вопрос лишь в определении порядка расположения цифр. Представим себе, что образ головоломки закодирован битами в памяти компьютера, где каждый бит представляет уровень яркости определенного пиксела. Исходя из того, что размер изображения всегда один и тот же (машина удерживает головоломку в определенном положении перед камерой), машина может определить позицию каждой фишки, сравнивая различные части картинки с заранее заданными шаблонами, состоящими из битовых комбинаций, обозначающих отдельные цифры головоломки. Как только будут определены совпадающие битовые комбинации для всех фишек, состояние головоломки будет распознано.
Эта техника распознавания изображений используется при оптическом чтении текста. Однако у нее есть и отрицательная сторона — для подобного распознавания требуется единообразие стиля, размера и ориентации считываемых символов. В частности, битовая комбинация, полученная при распознавании символа большого размера, не совпадает с шаблоном для небольшой версии того же символа, хотя очертания их одинаковы. Кроме того, вы можете представить себе, как усложняются проблемы при попытке распознать рукописный текст.
Другой подход к распознаванию символов основывается на сравнении геометрических характеристик, а не внешнего вида символов. В этом случае цифру 1 можно описать как одну вертикальную линию, цифру 2 — как открытую кривую линию, соединенную внизу с прямой горизонтальной чертой, и т. д. Этот способ распознавания символов состоит из двух задач: выявления особенностей обрабатываемого изображения и сравнения его с характеристиками уже известных символов. Но, как и в случае сравнения шаблонов, такая техника также не гарантирует отсутствия ошибок. Например, небольшие ошибки в изображении могут создать набор совершенно других геометрических характеристик, как в случае распознавания О и С или, для нашей головоломки, 3 и 8.
При создании машины для решения головоломки нам, к счастью, не нужно распознавать объемные трехмерные сцены. Мы можем быть уверены, что образы, которые необходимо распознать (цифры от 1 до 8), находятся в различных частях общей картинки и не перекрывают друг друга, как это бывает в общих задачах. Если взять обыкновенную фотографию, то проблема будет заключаться не только в распознавании объекта с различных углов, но и в том, что какие-то части объекта могут быть скрыты от обозрения.
Задача распознавания образов обычно выполняется за два шага: обработка изображения (image processing), которая состоит в идентификации символов на изображении, и анализ изображения (image analysis), то есть осмысление, что же означают эти символы. Мы уже встречались с такими двойными процессами в контексте распознавания символов исходя из их геометрического представления: обработка изображения заключалась в выявлении геометрических характеристик изображения и анализа полученного образа, то есть определения значения этих характеристик.
Обработка изображений влечет за собой множество смежных исследований. Например, усиление контуров, то есть процесс применения математических методов для подчеркивания границ между областями изображения. В каком-то смысле усиление контуров — это попытка преобразования фотографии в чертеж. Другое приложение анализа изображений — это поиск зон, то есть областей изображения со сходными характеристиками, такими как яркость, цвет или текстура. Зоны обычно являются частям одного объекта. Именно возможность распознавания зон позволяет компьютерам добавлять цвета в комиксы или раскрашивать старинные черно-белые фильмы. Еще одно приложение обработки изображений — сглаживание, то есть удаление дефектов изображения. При сглаживании ошибки изображения скрываются от других процессов, входящих в обработку изображений, однако слишком большое сглаживание может привести к исчезновению важной информации.
Сглаживание, усиление контуров и поиск зон — это шаги по направлению к идентификации компонентов изображения. Анализ изображения — это процесс выяснения, что представляют эти компоненты и, в конечном итоге, что представляет собой все изображение. Здесь возникает такая проблема, как распознавание частично скрытых объектов с различных перспектив. Один из подходов к анализу заключается в том, что сначала высказывается предположение, что может представлять собой изображение, а далее производятся попытки связать компоненты изображения с предполагаемыми объектами. Этот способ похож на процесс человеческого мышления — иногда, когда все вокруг выглядит расплывчатым, нам трудно распознать незнакомый объект, но если мы получим подсказку о том, что это может быть, то с легкостью рассмотрим его.
Существует огромное количество различных проблем, связанных с анализом изображений, и в этой области необходимо исследовать еще многое. Задачи, с которыми быстро и просто справляется человеческий разум, все так же остаются за пределами возможностей машин. Тем не менее, в современной ситуации есть признаки того, что альтернативные архитектуры машин смогут однажды преодолеть проблемы, остающиеся нерешенными сегодня (см. раздел 10.4).
