- •Предисловие
- •Введение
- •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Обратно к шифрованию
Введение
Вычислительная техника (computer science) является научной дисциплиной, призванной дать научное обоснование таким вопросам, как проектирование ЭВМ, программирование на компьютере, обработка информации, алгоритмические решения задач и алгоритмические процессы. Она обеспечивает основание для применения компьютера сегодня и в будущем. Широта предмета означает, что невозможно быть хорошо осведомленным в вычислительной технике, изучив только несколько разделов как изолированные друг от друга предметы или просто разобравшись, как использовать современное компьютерное оборудование. Чтобы понять вычислительную технику, нужно освоить множество разделов этой науки в их развитии.
Цель данной книги — предоставить эти сведения. Она являет собой полный вводный курс вычислительной техники. Следовательно, может служить пособием для студентов, начинающих изучать вычислительную технику, или источником материала для студентов, ищущих информацию о современном состоянии науки.
Изучение алгоритмов
Мы начинаем с наиболее фундаментального понятия вычислительной техники, а именно с понятия алгоритма (algorithm). Неформально, алгоритм — это набор шагов, которые определяют выполнение какой-либо задачи1. Например, существует алгоритм для построения модели самолета (выраженный в форме инструкции), для управления стиральной машиной (обычно изображен на лицевой стороне машины), для исполнения музыки (последовательность нот в нотной записи) и для выполнения фокусов.
Перед тем как машина сможет выполнить какую-либо задачу, необходимо разработать алгоритм и представить его в форме, совместимой с машиной. Представление алгоритма, совместимое с машиной, называется программой (program). Программы и алгоритмы, которые они представляют, называются программным обеспечением (software), в отличие от самой ЭВМ, которая называется аппаратным обеспечением (hardware).
Более точно, алгоритм — это упорядоченный набор однозначных, выполнимых шагов, которые определяют конечный процесс.
АЛГОРИТМ ФОКУСА
Эффект: Фокусник достает несколько карт из обычной колоды игральных карт и кладет их на стол изображением вниз, тщательно перемешивает их, распределяя по столу. Затем, когда зрители просят показать или черную, или красную карту, фокусник переворачивает карту нужного цвета.
Секрет и последовательность действий:
Шаг 1. Из обычной колоды карт возьмите десять красных и десять черных карт. Распределите их на столе по цвету в две колонки изображениями вверх.
Шаг 2. Объявите, что вы вытащили несколько красных и несколько черных карт.
Шаг 3. Соберите красные карты. Под видом того, что собираете их в маленькую колоду, возьмите их в левую руку и при помощи большого и указательного пальца правой руки придайте картам слегка вогнутую форму. Затем положите колоду красных карт на стол изображением вниз со словами: «В этой стопке красные карты».
Шаг 4. Соберите черные карты. Способом, описанным в шаге 3, придайте картам слегка выпуклую форму. Затем верните эти карты на стол изображением вниз со словами: «А в этой стопке черные карты».
Шаг 5. Сразу после того, как вы положите черные карты на стол, двумя руками перемешайте карты, распределяя их по поверхности стола. Объясните зрителям, что вы тщательно перемешиваете карты.
Шаг 6. Пока на столе остаются карты, расположенные изображением вниз, выполняйте следующие шаги:
6.1. Попросите зрителей назвать красную или черную карту.
6.2. Если назван красный цвет и на столе есть карта, лежащая изображением вниз, с вогнутой формой, переверните такую карту со словами «Вот красная карта».
6.3. Если назван черный цвет, и на столе есть карта, лежащая изображением вниз, с выпуклой формой, переверните такую карту со словами: «Вот черная карта».
6.4. В противном случае скажите зрителям, что больше нет карт нужного цвета, и в доказательство переверните оставшиеся карты.
Изучение алгоритмов началось как раздел математики. Действительно, математики занимались поиском алгоритмов задолго до создания современного компьютера. Главной целью было нахождение набора указаний, который бы описывал решение всех задач определенного типа. Одним из наиболее известных примеров этих исследований является алгоритм для нахождения отношения двух сложных чисел. Другой пример — алгоритм Евклида для нахождения наибольшего общего делителя двух положительных целых чисел, открытый античным греческим математиком Евклидом.
АЛГОРИТМ ЕВКЛИДА
Описание: Этот алгоритм предполагает наличие на входе двух положительных целых чисел и вычисляет их наибольший общий делитель.
Последовательность действий:
Шаг 1. Присвоить переменным М и N значения большего и меньшего числа соответственно. Шаг 2. Разделить М на N и значение остатка присвоить переменной R.
Шаг 3. Если R не равно 0, тогда присвоить М значение N, присвоить N значение R и возвратиться к шагу 2; в противном случае наибольшим общим делителем является значение, присвоенное N.
Как только алгоритм решения задачи найден, выполнение этой задачи больше не требует понимания принципов, лежащих в основе алгоритма. Вместо этого процесс выполнения задачи сводится к процессу простого следования указаниям. (Мы можем следовать алгоритму деления для нахождения отношения двух чисел или алгоритму Евклида для нахождения наибольшего общего делителя, не понимая, почему этот алгоритм работает.) В известном смысле, интеллект, необходимый для решения поставленной задачи закодирован в алгоритме.
Именно благодаря этой способности собрать и передать интеллект посредством алгоритмов, мы можем конструировать машины, которые показывают разумное поведение. Следовательно, уровень интеллекта, обнаруживаемый машинами, ограничен интеллектом, который может быть передан через алгоритмы. Только если мы найдем алгоритм, который управляет выполнением задачи, мы можем построить машину, которая ее выполнит. Также если не существует алгоритма решения задачи, то решение этой задачи выходит за пределы способностей машины.
Таким образом, разработка алгоритмов является главной задачей в области вычислительной техники и, следовательно, значительная часть данной науки занимается проблемами, связанными с этой задачей. В свою очередь, мы можем обрести понимание вычислительной техники, рассмотрев некоторые из этих проблем. На первом месте находится вопрос, как разрабатывается алгоритм — вопрос, который тесно связан с проблемой решения задач вообще. Найти алгоритм решения задачи — это, в сущности, обнаружить ее решение. Значит, исследования в этой области вычислительной техники происходят из таких областей психологии, как решение задач человеком и теория обучения. Мы рассмотрим некоторые из этих идей в главе 4.
Когда найден алгоритм для решения задачи, следующий шаг (— представить алгоритм так, чтобы он мог быть передан машине или другим людям. Это означает, что мы должны трансформировать понятийный алгоритм в набор однозначных инструкций. Исследования, возникшие из этой необходимости, исходили из наших знаний языка и грамматики и привели к большому количеству систем представления алгоритмов, называемых языками программирования (programming language), в основе которых лежит многообразие подходов к процессу программирования, называемых парадигмами программирования. Мы рассмотрим некоторые из этих языков и парадигм, лежащих в их основании, в главе 5.
Поскольку компьютерные технологии применялись к все более и более сложным задачам, ученые обнаружили, что проектирование больших систем программного обеспечения включает в себя больше, чем просто разработку отдельных алгоритмов для выполнения требуемых действий. Оно влечет за собой также проектирование взаимодействия между этими компонентами. В результате возник новый раздел вычислительной техники, который называется разработкой программного обеспечения и происходит из таких различных областей научного знания, как аппаратура, управление проектом, руководство кадрами и проектирование языков программирования. Разработка программного обеспечения обсуждается в главе 6.
Другая важная область вычислительной техники занимается проектированием и конструированием аппаратов для выполнения алгоритмов. Эту тему мы будем рассматривать в главах 1 и 2. Хотя изучение архитектуры ЭВМ включает в себя обсуждение современных технологий, нашей целью не является овладение всеми деталями того, как современная архитектура ЭВМ реализуется в электрической схеме. Это завело бы нас слишком далеко в область электротехники. Кроме того, как вчерашние механические вычисляющие устройства уступили дорогу электрическим устройствам, так и современная электроника скоро может быть заменена другими технологиями, среди которых первым кандидатом является оптика. Наша цель — получить достаточное представление о современных технологиях, для того чтобы понять их применение в современных машинах и их влияние на развитие вычислительной техники.
Мы бы хотели, чтобы архитектура ЭВМ была следствием только наших знаний об алгоритмических процессах и не была ограничена возможностями технологий. То есть вместо того, чтобы позволять технологиям определять проектирование ЭВМ и, следовательно, способ представления алгоритма, мы бы хотели, чтобы наши знания были движущей силой, определяющей строение машины. С развитием технологий эта мечта приближается к реальности. Сегодня возможно построить машину, которая позволяет представить алгоритм в виде сложных последовательностей инструкций, выполняемых одновременно, или в виде системы соединений между многочисленными элементами, подобно тому как наш мозг представляет информацию в форме связей между нейронами (глава 10).
Мы изучаем архитектуру ЭВМ также в контексте хранения и получения данных. В этом случае внешние характеристики машины часто отражают ее внутренние свойства. Мы рассматриваем эти свойства и способы избежать их нежелательного эффекта в главах 1, 7, 8 и 9.
С конструированием вычислительных машин тесно связана разработка связи машины с внешним миром. Например, как поместить алгоритм в машину или сообщить ей, какой алгоритм выполнять? Решение таких проблем при условии, что от машины ожидается выполнение большого количества задач, требует решения многих проблем, связанных с согласованием действий и распределением ресурсов. Мы исследуем некоторые из таких решений при обсуждении операционных систем в главе 3.
Так как от машин требовалось выполнение все более и более сложных задач, компьютерная наука обратилась к изучению интеллекта человека в надежде на то, что, понимая, как рассуждает и воспринимает наш собственный мозг, мы будем в состоянии создать алгоритм, который бы имитировал эти процессы, и, следовательно, сможем передать эти способности машине. В результате возникла область вычислительной техники, которая называется искусственным интеллектом и опирается на исследования в психологии, биологии и лингвистике. Некоторые из этих аспектов обсуждаются в главе 10.
Поиск алгоритмов для решения все более и более сложных проблем ведет к вопросам, касающимся предельных ограничений алгоритмических процессов. Если не существует алгоритма для решения задачи, тогда эта задача не может быть решена машиной, то есть машины способны решать только алгоритмически разрешимые задачи.
Осознание того, что существуют задачи, не имеющие алгоритмического решения, появилось как отдельный предмет исследования в математике с публикацией теоремы о неполноте Курта Геделя в 30-х годах XX века. Эта теорема утверждает, что в любой математической теории, заключающей в себе традиционную систему арифметики, существуют утверждения, которые не могут быть ни доказаны, ни опровергнуты. Короче говоря, любое полное знание нашей системы арифметики выходит за пределы возможностей алгоритмических процессов.
Стремление к изучению ограничений применения алгоритмических методов, которое последовало за теоремой Геделя, привело математиков к проектированию абстрактных машин для выполнения алгоритмов (это было до того, как технологии позволили создать действующие машины) и исследованию теоретических возможностей таких гипотетических машин. Сейчас изучение алгоритмов и машин составляет основу вычислительной техники. Некоторые из этих вопросов обсуждаются в главе 11.
Происхождение вычислительных машин
Абстрактные машины, созданные математиками в первые десятилетия XX века, составляют важную часть родословного дерева современных компьютеров. Другие ветви этого дерева уходят далеко в прошлое. Действительно, поиск машин, которые выполняют алгоритмические задачи, имеет длинную историю.
Одним из первых вычислительных механизмов были счеты. Их история уходит корнями в античную Грецию и Рим. Это устройство очень просто, оно состоит из шариков, нанизанных на стержни, которые в свою очередь крепятся на прямоугольной рамке. Шарики двигаются вправо и влево на стержне, и их местоположение определяет хранящееся значение. Именно при помощи расположения шариков этот «компьютер» представляет и хранит данные. Контролирует выполнение алгоритма человек. Таким образом, счеты сами по себе являются просто системой хранения данных, которая должна быть объединена с человеком, чтобы стать полноценной вычислительной машиной.
Не так давно вычислительные машины были механическими. В число их изобретателей входят француз Блез Паскаль (1623-1662), немец Готфрид Вильгельм Лейбниц (1646-1716) и англичанин Чарльз Бэббидж (1792-1871). В этих машинах данные были представлены различными положениями регистров, причем ввод данных осуществлялся механическим установлением регистров в нужное положение. Выходные данные на машинах Паскаля и Лейбница можно было получить, наблюдая за конечным положением регистров, так же как мы читаем числа на счетчике пройденных километров автомобиля. В отличие от них Бэббидж работал над машиной (названной им Аналитической), которая бы распечатывала полученные значения на бумаге, так чтобы была исключена возможность ошибки при расшифровке результата.
Что касается способности следовать алгоритму, мы можем заметить возрастание гибкости в этих машинах. Машина Паскаля выполняла только операцию сложения. Следовательно, соответствующая последовательность шагов была включена в структуру машины. Подобным же образом в машине Лейбница алгоритмы были заключены в архитектуре машины, хотя она и предлагала разнообразные арифметические операции, из которых оператор мог выбирать. Разностная машина Бэббиджа (только одна демонстрационная модель этой машины была построена) подвергалась изменению для выполнения различных расчетов, а его Аналитическая машина (на постройку которой он не получил субсидий) должна была получать указания в виде отверстий на бумажных картах. Таким образом, Аналитическая машина Бэббиджа была бы программируемой. А его сторонник Августа Ада Байрон считается сегодня первым в мире программистом.
АВГУСТА АДА БАЙРОН
С тех пор как Министерство обороны Соединенных штатов назвало язык программирования в ее честь, Августа Ада Байрон, графиня Лавлейс, является предметом обсуждения в компьютерном сообществе. Ада Байрон прожила в некоторой степени трагическую жизнь, она умерла, когда ей не было и 37 лет (1815-1852). Ее жизнь осложняло слабое здоровье и тот факт, что она была диссидентом в обществе, которое ограничивало профессиональную деятельность женщины. Она была очарована машинами Чарльза Бэббиджа, когда стала свидетельницей демонстрации прототипа его Разностной машины в 1833 году. Ее вклад в развитие вычислительной техники состоит в переводе с французского языка на английский работ, обсуждавших проекты Аналитической машины. Бэббидж поддерживал ее начинания, побуждая дополнить эти переводы данными, описывающими применение машины, и примерами того, как можно программировать машину для выполнения различных задач. Энтузиазм Бэббиджа по отношению к работе Ады Байрон (он внес много предложений и, по-видимому, несколько примеров) объяснялся его надеждами на то, что ее публикация принесет субсидии для конструирования Аналитической машины (поскольку Ада Байрон была дочерью лорда Байрона, она занимала высокое положение в обществе и имела важные финансовые связи). Эти субсидии никогда не были получены, но работа Ады Байрон сохранилась. Считается, что она содержит примеры первых компьютерных программ. Таким образом, Ада Байрон признается сегодня первым в мире программистом.
И
дея
передачи алгоритма машине при помощи
отверстий на бумаге не принадлежит
Бэббиджу. Он заимствовал ее у Жозефа
Жаккарда (1752-1834), построившего в 1801 году
ткацкий станок, в котором шаги, которые
должны быть выполнены во время ткацкого
процесса, определялись расположением
отверстий на бумажных картах (рис. 0.1).
Алгоритм, которому следовал ткацкий
станок, мог быть легко изменен для
производства различных узоров на ткани.
Другим исследователем, использовавшим
идею Жаккарда, был Герман Холлерит
(1860-1929), который применил этот способ
кодирования информации в виде отверстий
на бумажных картах для ускорения процесса
составления таблиц во время переписи
населения в Америке в 1890 году (именно
эта работа Холлерита привела к созданию
IBM). Впоследствии такие
карты стали называться перфокартами и
оставались распространенным способом
управления машиной до 70-х годов XX
века. На самом деле этот способ живет и
сейчас, как показали проблемы, возникшие
в 2000 году во время президентских выборов.
Технологии того времени не позволяли производить сложные механические машины, спроектированные Паскалем, Лейбницем и Бэббиджем, они требовали больших материальных затрат. Но с успехами в области электроники в начале XX века этот барьер был преодолен. Примером этого прогресса являются электромеханическая машина Джорджа Стибица, построенная в 1940 году компанией Bell Laboratories, и машина Mark I, собранная Говардом Эйкеном и группой инженеров IBM в 1944 году в Гарвардском университете (рис. 0.2). Эти машины были созданы с использованием электромеханических реле. Они устарели почти сразу же, как только были построены, потому что другие исследователи применяли технологию электронных ламп, чтобы создать полностью электронную машину. По-видимому, первой такой машиной была машина Атанасова-Берри, построенная в период с 1937 по 1941 год в колледже штата Айова (сейчас университет) Джоном Атанасовым и его ассистентом Клиффордом Берри. Другая машина, названная Colossus, была собрана под руководством Томми Флаверса в Англии для дешифровки кодов, которыми пользовались немецкие войска в конце второй мировой войны (на самом деле таких машин было построено около десяти, но условия военной секретности не позволили стать факту их существования частью «родословного дерева» компьютеров). Скоро последовали другие, более гибкие машины, такие как ENIAC (electronic numerical integrator and calculator - электронно-цифровой интегратор и вычислитель), разработанная Джоном Моучли и Проспером Эккертом в Электротехнической школе Мура университета штата Пенсильвания.
С этого момента история развития вычислительных машин становится историей развития технологий, которая включает в себя изобретение транзисторов и последующую разработку интегральных схем, запуск спутника связи и прогресс в области оптических технологий. Сегодня настольные компьютеры (так же как и их меньшие мобильные братья) обладают большими вычислительными способностями, чем машины 40-х годов, занимавшие целые комнаты, и могут быстро обмениваться информацией через системы глобальной связи.
РАЗНОСТНАЯ МАШИНА БЭББИДЖА
Проекты машины Чарльза Бэббиджа были поистине предвестниками современных компьютеров. Если бы технологии позволяли построить его машину при небольших материальных затратах и если бы необходимость обработки данных торговли и правительства была такой же большой, как сегодня, то идеи Бэббиджа привели бы к компьютерной революции в начале XX века. Однако при его жизни была построена только демонстрационная модель его Разностной машины. Эта машина определяла числовые значения, вычисляя «последовательные разности». Рассмотрим этот метод на примере вычисления квадратов целых чисел. Мы начинаем, зная, что квадрат 0 равен 0, квадрат 1 равен 1, квадрат 2 равен 4 и квадрат 3 равен 9. Зная это, мы можем определить квадрат 4 следующим образом. Сначала мы вычисляем разности квадратов, значения которых мы уже знаем: 12 - О2 = 1, 22 - 12 = 3 и З2 - 22 = 5. Затем вычисляем разности этих разностей: 3- 1 =2и5-3 = 2. Заметьте, что результат в том и в другом случае равен 2. Предполагая, что эта закономерность сохраняется и дальше (можно доказать математически, что это так), мы делаем вывод, что и разность между выражениями (42 - З2) и (З2 - 22) должна быть также равна 2. Следовательно, (42 - З2) должно быть на 2 больше, чем (З2 - 22), значит, 42 - З2 = 7 и 42 = З2 + 7 = 16. Теперь, когда мы знаем квадрат4, мы можем вычислить квадрат 5, опираясь на значения 12, 22, З2 и 42. (Хотя более подробное обсуждение последовательных разностей выходит за рамки нашего курса, возможно, студентам, изучающим дифференциальное исчисление, будет интересно узнать, что приведенный выше пример является следствием того факта, что вторая производная функции у = х2 постоянна и равна 2.)
П
роисхождение
этих небольших машин восходит к тем
любителям, которые начали экспериментировать
с самодельными компьютерами сразу после
разработки больших исследовательских
машин в 40-х годах. Именно в этом «подполье»
Стив Джобе и Стефан Возняк создали в
1976 году коммерчески жизнеспособный
домашний компьютер и основали компанию
Apple Computer
для его производства и продажи. Хотя
продукция Apple была
популярна, она не пользовалась большим
спросом в деловых кругах, которые
продолжали рассчитывать на уже привычную
компанию IBM в большинстве
своих компьютерных потребностей.
В 1981 году IBM представила свой первый настольный компьютер, названный персональным компьютером (сокращенно ПК), программное обеспечение для которого было разработано молодой развивающейся компанией Microsoft. Этот компьютер имел немедленный успех и закрепил ПК в сознании деловых людей как предмет торговли. Сегодня термин ПК используется по отношению ко всем машинам различных производителей, конструкция которых произошла от первого персонального компьютера IBM и многие из которых продолжают поставляться вместе с программным обеспечением компании Microsoft.
Доступность настольных компьютеров выдвинула компьютерные технологии на передний план в современном обществе. И на самом деле, компьютерные технологии настолько преобладают сегодня, что уметь пользоваться персональным компьютером значит быть членом современного общества. Именно при помощи этих технологий миллионы людей получили доступ к глобальной системе связи, называемой Интернетом, системе, которая оказывает влияние на образ жизни и торговлю по всему миру.
Наука об алгоритмах
Такие условия, как ограниченные возможности хранения данных и трудоемкие процедуры программирования, ограничивали сложность алгоритмов, к которым применялись первые вычислительные машины. Однако все эти ограничения начали исчезать, машины стали использоваться для выполнения все более сложных задач. Так как попытки выразить комбинации этих задач в форме алгоритма стали подвергать испытанию способности человеческого ума, все больше исследовательских усилий было направлено на изучение алгоритмов и процесса программирования.
Именно в это время теоретические работы математиков начали приносить плоды. В результате появления теоремы о неполноте Геделя математики обратились к исследованию вопросов, касающихся алгоритмических процессов, что способствовало развитию технологий. Этот процесс подготовил возникновение новой дисциплины науки, называемой вычислительной техникой.
Сегодня эта новая дисциплина укрепилась как наука об алгоритмах. Как мы видим, эта наука занимается широким спектром вопросов, которые связаны с такими разными предметами, как математика, аппаратура, психология, биология, управление торгово-промышленной деятельностью и лингвистика. В последующих главах мы обсудим многие разделы этой науки. В каждом случае нашей целью будет представить главные идеи раздела и темы текущих исследований.
Важно различать вычислительную технику как науку и ее применение (различие, аналогичное отличию физики от машиностроения). Физика является наукой, которая пытается объяснить отношения между силой, массой и ускорением. Машиностроение представляет собой применение этой науки. Инженеру-механику следует понимать физику, но инженер, в зависимости от своей специализации, должен также обладать знаниями о различных видах стали, составе бетона или доступности шарикоподшипников на рынке. Физик интересуется, как изменяется закон Ньютона при подходе Эйнштейна. Следовательно, не следует ожидать, что работы физика будут содержать обсуждение грузовых ограничений различных шкивов, присутствующих на рынке, или указаний правительства относительно ремней безопасности автомобиля.
Подобным же образом, наша книга не включает указания, как пользоваться программой табличных вычислений или как установить браузер. Это не означает, что эти вопросы не являются важными. Просто они не являются частью нашего предмета. Также обсуждение программирования не сосредоточено на рассмотрении возможностей отдельного языка. Вместо этого оно концентрируется на принципах, стоящих за инструментами программирования, на том, как эти средства развивались, и на проблемах текущих исследований.
Двигаясь вперед по нашей книге, легко потерять нить повествования. Поэтому мы останавливаемся, чтобы определить круг вопросов, которыми занимается вычислительная техника.
♦ Какие задачи имеют алгоритмическое решение?
♦ Как можно облегчить поиск алгоритма?
♦ Как можно усовершенствовать технику представления и передачи алгоритма?
♦ Как можно применить наши знания об алгоритмах и технологиях для создания лучших машин?
♦ Как можно проанализировать и сравнить характеристики различных алгоритмов?
В
семи
этими вопросами занимается наука об
алгоритмах (рис. 0.3).
Роль абстракции
Понятие абстракции так прочно входит в предмет вычислительной техники и проектирование вычислительных систем, что нам следует обратиться к нему в этой вводной главе. Термин «абстракция» относится к различию между внешними свойствами объекта и элементами его внутреннего строения. Именно абстракция позволяет нам игнорировать внутренние элементы сложного механизма, такого как компьютер, автомобиль или микроволновая печь, и использовать его как целостный объект. Кроме того, именно про помощи абстракции и разрабатываются такие сложные системы. Например, автомобиль проектируется иерархическим способом. На самом верхнем уровне его представляют как состоящий из больших компонентов, таких как мотор, подвеска и трансмиссия, не рассматривая внутренние элементы каждого из этих компонентов. В свою очередь каждый из этих элементов также состоит из своих элементов.
А
ппаратное
обеспечение обычного персонального
компьютера имеет похожее строение (рис.
0.4). Можно считать, что на верхнем уровне
оно состоит из таких компонентов, как
системный блок, клавиатура, монитор,
мышь и принтер. Если мы сосредоточим
внимание на принтере, то увидим, что он
состоит из механизма подачи бумаги,
системы управления и системы выброса
чернил. Кроме того, механизм подачи
бумаги состоит из еще более мелких
компонентов: подставки для бумаги,
двигателя перемещения бумаги и канала
подачи бумаги.
Рис. 0.4. Иерархия абстракций в аппаратном обеспечении стандартного персонального компьютера
Мы видим, что абстракция позволяет нам конструировать, анализировать и управлять большими и сложными вычислительными системами, которые были бы ошеломляющими, если их рассматривать целиком на детальном уровне. Применяя абстракцию, мы можем подходить к таким системам на разном уровне детализации. На каждом уровне мы рассматриваем систему с точки зрения ее составляющих, которые называются абстрактными инструментами (abstract tool) и чью внутреннюю структуру мы игнорируем. Это позволяет нам сосредоточиться на том, как каждый элемент взаимодействует с другим элементом на одном уровне и как они вместе формируют элемент более высокого уровня. Следовательно, мы можем выделить часть системы, которая является существенной для решения задачи, и не потеряемся в море деталей. В этом и состоит достоинство абстракции.
Следует заметить, что абстракция применима не только к науке и технике. Она является важным способом упрощения, при помощи которого наше общество создало определенный образ жизни, который иначе был бы невозможен.
Немногие из нас понимают, как работают различные удобства, которые используются в повседневной жизни. Мы едим и носим одежду, которую сами не можем производить. Мы используем электрические приборы, не зная лежащей в их основе технологии. Мы пользуемся услугами других людей, не зная подробностей их профессий. С каждым новым изобретением в какой-либо области небольшая часть общества специализируется в нем, в то время как остальные учатся использовать результаты их специализации как абстрактные инструменты. Таким образом, общественный склад абстрактных инструментов расширяется, и способность общества развиваться дальше возрастает.
В этой книге абстракция применяется по отношению к главам (и даже к разделам внутри глав), которые необычайно независимы. Вопросы, которые обсуждаются в ранних главах, выступают как абстрактные инструменты в следующих. Таким образом, для понимания последующих глав вовсе не обязательно детальное изучение предыдущих. Например, вы можете начать изучение книги с главы 10 («Искусственный интеллект») и все же понять большую часть материала. (Просто используйте алфавитный указатель, чтобы найти значения терминов, которые вы пропустили.) Иерархическая структура этой книги (рис. 0.5) состоит из четырех частей, каждая из которых может изучаться отдельно. Каждая часть включает в себя главы и разделы, которые являются меньшими единицами абстракции. Это строение не просто представляет содержание книги, оно отражает структуру науки. И на самом деле вычислительная техника состоит из многочисленных самостоятельных, однако связанных между собой разделов.
В
лияние
на общество
Научный и технологический прогресс подрывает основания, на которых базировались общественные решения в прошлом, и даже бросает вызов многим общественным принципам. В чем различие между наличием интеллектуального поведения и наличием самого интеллекта? Когда начинается жизнь? Когда она заканчивается? Чем различаются растение и животное? Есть ли жизнь в других солнечных системах? Такие вопросы заставляют человека пересмотреть свои убеждения и часто — изменить их.
Вычислительная техника является источником таких вопросов в различных областях жизни. В юриспруденции возникают проблемы, касающиеся того, в какой степени возможно владеть (быть хозяином) программным обеспечением, касающиеся права и ответственности, которые влечет за собой эта собственность. В этике человек сталкивается с вызовом традиционным принципам, на которых основывается поведение. В правительстве возникает вопрос о том, в какой мере компьютерные технологии и их применение должны контролироваться государством. И во всем обществе обсуждается вопрос о том, дают ли новые применения компьютерных технологий большую свободу или, наоборот, ограничивают ее.
Решение этих проблем требует базовых знаний в соответствующей науке или технологиях. Например, если общество должно принять решение относительно хранения и размещения ядерных отходов, члены этого общества должны осознавать последствия воздействия радиации, понимать, что требуется для защиты от опасности радиационного заражения и трезво оценивать промежуток времени, в течение которого сохраняется риск радиационного заражения. Также, чтобы рассудить, следует ли позволять правительству или компаниям создавать большие интегрированные базы данных, содержащие информацию о гражданах или потребителях, члены общества должны обладать элементарными представлениями о возможностях, ограничениях и развитии технологий создания баз данных. Эта книга дает основные знания для того, чтобы вы могли подойти к решению таких вопросов осознанно. Действительно, многие разделы посвящены социальным, этическим и правовым вопросам. Например, мы обсуждаем проблему секретности в разделе, посвященном Сети и технологиям создания баз данных, а проблему собственности на программное обеспечение в разделе, касающемся разработки программного обеспечения. Хотя эти вопросы не являются частью вычислительной техники, они важны как для читателей, начинающих изучение этой дисциплины, так и для людей, специализирующихся на предметах, связанных с применением вычислительных машин.
Конечно, знание только фактов не обязательно дает ответы на многочисленные вопросы, возникающие по мере развития вычислительной техники. Часто правильного ответа на них просто не существует, и многие обоснованные решения представляют собой компромисс между противоположными мнениями. Таким образом, для принятия решения часто необходимо умение слушать и признавать другие точки зрения, чтобы вести разумную полемику и изменить свое мнение, когда открывается что-то новое. Поэтому каждая глава книги заканчивается разделом, названным «Социальные вопросы». На эти вопросы не обязательно отвечать, их следует обдумать. В большинстве случаев ответ, который сначала может показаться очевидным, не удовлетворит вас, когда вы обратитесь к другой стороне проблемы. Это введение заканчивается вопросами, относящимися к вычислительной технике в целом.
