
Полная версия
История электронных компьютеров
Следуя этому замыслу, сочетая старую архитектуру с электроникой, в начале 1943 года Моукли и Эккерт направили свои усилия на попытку создания цифровой версии дифференциального анализатора Буша. Иначе говоря, цель заключалась в создании «электронной версии» машины для решения дифференциальных уравнений.
Вскоре стала очевидной ограниченность такого подхода: заказчику был нужен универсальный аппарат для любых баллистических расчетов. Осознав это, Моукли и Эккерт пришли к исторически значимому выводу: не следует совершенствовать старое – требуется создавать принципиально новое. И этим новым стала возможность перепрограммирования.
ENIAC еще не был программируемым в современном смысле: в нем не было разделения на аппаратную часть и программу, а программирование сводилось к ручной перенастройке на уровне соединений и переключателей. Однако сама идея универсальности открыла новую эпоху в вычислительной технике. Согласование позиций сторон прошло быстро, и 1 июля проект получил финансирование на разработку Электронного числового интегратора (Electronic Numerical Integrator). Позже к названию добавилось «и компьютера» – так возникло сокращение ENIAC. В целях секретности проект сначала назывался «Белый слон», затем – Project PX.
Менеджером проекта стал Герман Гольдштейн. Он сыграл роль своеобразной «повивальной бабки» проекта. Впоследствии он привлек к работе над ENIAC свою жену Адель, которая сначала была одной из малозаметных программисток, а позже заняла более заметное и активное положение.
При проектировании ENIAC Моукли и Эккерт не знали ни об Аналитической машине Бэббиджа, ни машинах Айкена. Удивительно то, что ее преемник EDVAC, оказалась близок к концепции Аналитической машины и особенно к тому, интерпретировала эту машину Леди Августа Лавлейс. Об этом подробно в книге «История неэлектронных компьютеров».
ENIAC состоял из трех основных подсистем.
• Первая – вычислительная – включала автономные электронные модули сложения, вычитания, умножения и деления.
• Вторая – память для команд и данных – была частично электронной (на лампах), программы и константы задавались с помощью коммутаторных панелей и переключателей.
• Третья – система управления координировала работу вычислительной системы, она выполняла роль программатора.
Существовала также вспомогательная система ввода-вывода на перфокартах и принтеры IBM. ENIAC имел тактовый генератор с частотой около 100 кГц. Его роль отличалась от современных ЦПУ: сигналы генератора координировали микрошаги внутри операции, а переход от одной команды к другой осуществлялся через заранее сконфигурированные сигнальные цепи – так называемое «программирование потока управления через сигнальные соединения».
В июле 1943 года была собрана первая команда разработчиков из двенадцати человек.
Архитектура ENIAC
Архитектура ENIAC уникальна и соответственно программирование тоже. В отличие от позднейших фоннеймановских компьютеров, где программа – это линейная последовательность инструкций в памяти, ENIAC работал как набор специализированных модулей, которые настраивались и соединялись вручную. Программирование представляло собой трехуровневый процесс: проектирование маршрутов данных, определение временной организации вычислений и физическую конфигурацию коммутационных панелей.
ENIAC состоял из отдельных вычислительных блоков, каждый из которых выполнял строго определенные функции. Центральную роль играли двадцать аккумуляторов – десятиразрядных регистров-счетчиков, способных хранить число и выполнять сложение и вычитание. Дополняли их один умножитель, блок деления и извлечения квадратного корня, генераторы констант и устройства ввода-вывода для работы с перфокартами, индикаторами и печатью.
На этом уровне алгоритм представлялся как граф: вершины – вычислительные модули, ребра – каналы передачи данных. Программирование заключалось в «прокладывании маршрутов» чисел между модулями: какое значение хранится в аккумуляторе, куда передается и какой блок его обрабатывает.
ENIAC не исполнял программы линейно. Работа модулей синхронизировалась управляющими импульсами (control pulses), задающими моменты начала и окончания операций. Это позволяло параллельное выполнение: несколько аккумуляторов могли работать одновременно, пока другой блок ожидал результат.
Программа воспринималась как сеть зависимостей и синхронизированных действий, распределенных во времени. Такой подход концептуально близок к современным параллельным вычислениям, конвейерной обработке и распределенным системам.
Программист определял зависимости: «результат аккумулятора 1 отправить в аккумулятор 3, пока умножитель ожидает данные от аккумулятора 4». Алгоритм таким образом представлялся не как список инструкций, а как граф действий с временными ограничениями.
Физически программа фиксировалась в виде конфигурации кабелей и переключателей на панелях. Каждый модуль имел входы и выходы, соединяемые проводами, а режим работы задавался тумблерами: сложение, вычитание, направление передачи данных и т. д.
Состояние машины можно описать матрицей: строки – модули, столбцы – возможные соединения и режимы, ячейки – конкретные настройки. Алгоритм сводился к полной физической схеме, собранной вручную. Эта модель напоминает современные FPGA или телефонные станции середины XX века.
Глава 4. EDVAC
Когда Нил Армстронг ступил на поверхность Луны, он произнес: «Это всего лишь маленький шаг одного человека, но гигантский скачок всего человечества». Да, в 1969 году этот шаг рассматривался не иначе как начало новой эры. Но если оглянуться назад, то окажется, что другой, куда менее заметный «шаг», но более важный был сделан за четверть века до этого. Его не транслировали по телевидению, его не сопровождали многообещающие речи, но его последствия оказались несравнимо масштабнее. Имя этому шагу – EDVAC.
Эта аббревиатура расшифровывается как Electronic Discrete Variable Automatic Computer. Слово «компьютер» к тому времени уже существовало, но именно здесь оно впервые приобрело тот смысл, который мы вкладываем в него сегодня. До этого «компьютерами» называли либо людей-счетчиков, либо громоздкие машины, выполнявшие одну-две специфические функции.
У предшественника EDVAC – ENIAC это слово тоже значилось в названии. Но сам он, при всей своей мощи и грандиозности, не был компьютером в современном понимании. ENIAC не умел хранить программы. Чтобы настроить на новую задачу, инженерам и программисткам приходилось буквально перекраивать его устройство: переключать сотни тумблеров, перекладывать кабели, менять панели. Это походило скорее на ремонт, чем на программирование.
Тем не менее именно ENIAC впервые доказал: цифровая электроника годится для вычислений и способна значительно превзойти механические и аналоговые устройства. Но сам он стал скорее доказательством концепции, чем универсальной моделью.
А вот EDVAC – это уже не демонстрация, а настоящий прототип будущего. Он вобрал в себя все, что мы сегодня связываем со словом «компьютер». Его создателями были инженеры Преспер Эккерт и Джон Моукли. На завершающем этапе к ним в качестве внешнего обобщающего их изобретение гуру присоединился Джон фон Нейман, он сумел превратить инженерный проект в строгую теоретическую модель. Позже именно из этой модели вырастет целая новая область знаний – современная информатика.
От ENIAC к EDVAC
ENIAC был удивительной машиной – работа с ним напоминала настройку огромного музыкального органа, где для исполнения каждой новой мелодии нужно было бы вручную переставлять трубы.
Программа в ENIAC – это сплетение кабелей, комбинация переключателей и панелей. Чтобы настроить новую программу, инженеры прокладывали маршруты электрических сигналов: вот вход в умножитель, вот выход в сумматор, а вот дальше результат идет в следующий блок. Получался не набор строк, а целая «электрическая маршрутная карта».
Неудивительно: ENIAC вырос из опыта работы с дифференциальным анализатором, который решал уравнения при помощи шестеренок, валов и дисков. Эккерт и Моукли словно заменили механические шестерни на электронные лампы – но принцип остался тем же: чтобы поменять задачу, нужно было перекроить «внутренности».
Очень быстро стало ясно: это тупик. Машина может быть сколько угодно быстрой, но если на ее перепрограммирование уходит неделя, то практической пользы мало. Инженерам нужна была новая идея – способ разделить «железо» и «логику».
Хранимая программа – гениальная простота
Решение оказалось удивительно изящным. Зачем каждый раз перенастраивать машину, если можно просто хранить последовательность операций в ее памяти, машина сама будет читать инструкции одну за другой, словно кулинарную книгу рецептов.
Сама идея памяти была не нова. Еще Жаккар управлял ткацким станком с использованием перфокарт с записанными них плетенями, а Ада Лавлейс в XIX веке описала для аналитической машины Бэббиджа алгоритмы, где были даже ветвления и циклы. Позже эта идея внешней программы была реализована в гарвардской архитектуре. Во всех этих устройствах программа отделена от процессора.
Эккерт и Моукли сделали радикальный шаг. Они предложили хранить инструкции там же, где и данные. Команда машинного языка стала такой же записью в памяти, как число. Машина могла прочитать ее, изменить или даже переписать. По сути, программа превратилась в хранилище внутреннего состояния машины. Эта простая на первый взгляд идея изменила все. Компьютер впервые стал по-настоящему универсальным.
Система команд
Вместе с памятью для программ появилась и другая новинка – система команд.
Теперь машина понимала формализованный набор команд-инструкций. Каждая команда делилась на две части:
• код операции (что нужно сделать: сложить, вычесть, перейти),
• адреса операндов (с какими числами работать и куда положить результат).
Особым прорывом стали команды условных переходов. С их помощью машина могла менять ход программы в зависимости от результата предыдущей операции: например, «если число ноль – иди туда, если положительное – сюда». В сочетании с безусловными переходами это дало возможность создавать циклы, ветвления и, в конечном счете, сложные алгоритмы.
Важно, что команды и данные находились в одном адресном пространстве. Это позволяло программе «думать» о самой себе – читать, изменять и перезаписывать собственные инструкции. Для будущего программирования это оказалось решающим.
Набор команд EDVAC был ограниченным, но принципиально новым. Впервые появился аппаратный декодер инструкций – устройство, которое по коду операции понимало, что именно нужно сделать. С этого момента общение человека с машиной перестало быть физическим (кабели, тумблеры) и стало логическим.
До EDVAC понятие «язык общения с машиной» в современном смысле отсутствовало. Программирование на ENIAC было больше похоже на инженерный монтаж. Эккерт и Моукли первыми предложили формализованный набор команд, открыв дорогу универсальным компьютерам. Этот шаг и стал тем самым фундаментом, на котором стоит вся современная вычислительная техника.
О Джоне фон Неймане
Двое непосредственных создателей EDVAC были представлены в Главе 3. Джона фон Неймана нельзя назвать третьим – он не создавал машину. Возможно, хотя и не задокументировано, он как консультант оказал некоторое влияние на процесс разработки. Но его историческая роль скорее в другом: он стал популяризатором EDVAC, написав и опубликовав за своим именем так называемый меморандум, или, точнее, обзор «First Draft of a Report on the EDVAC» – собрание умозаключений по поводу проекта будущей машины. В этом документе он раскрыл замысел создания компьютера с хранимой программой, что дало основание в последующем растиражировать эту схему под названием «Архитектура фон Неймана». На самом деле он не был автором описанной схемы, и, похоже, не претендовал на авторство, хотя по каким-то причинам истинные авторы он не упомянул. Важно отметить: сама «Архитектура фон Неймана», существенно усовершенствованная по сравнению с черновиком First Draft, была реализована в компьютере IAS, о котором будет подробно рассказано в Главе 5.
Урожденный Янош Лайош Нейман использовал дворянскую частицу «von», хотя его принадлежность к дворянству была условной – она было куплено его отцом Микшой Нейманом, венгерским евреем, банкиром и промышленником. Заметим, что Антон Павлович Чехов отказался от дворянства, которое ему было присвоено императором Николаем II. Состоятельная семья фон Неймана сильно пострадала за 133 дня существования Венгерской советской республики, и у юного Яноша тогда сформировались стойкие антикоммунистические взгляды. Позже, уже в США, он стал убежденным противником СССР и одним из самых жестких сторонников холодной войны, всерьез рассматривая возможность превентивных ядерных ударов по Советскому Союзу.
Существует легенда, рассказанная Германом Гольдштейном, о знаменательной встрече фон Неймана с ним, в ту пору молодым лейтенантом, на железнодорожной платформе. Лейтенант якобы раскрыл ему секрет создания компьютеров в инженерной Школе Мура, чем вызвал интерес великого ученого к деятельности небольшой группы инженеров. Однако истинные причины были серьезнее: работа над атомной бомбой требовала огромного объема расчетов, и люди-компьютеры с арифмометрами с ней не справлялись. Нейман изучал все доступное: релейные машины Стибица, машины Эйкена, анализатор Буша, табуляторы IBM и ENIAC. Возможно, Гольдштейн лишь сообщил о новом проекте, что вызвало цепочку событий, получивших в последующем неоднозначную оценку.
Специфические черты личности фон Неймана, позволяли ему мгновенно схватывать суть услышанного, перехватывать инициативу и распространять чужие идеи, не обременяя себя упоминанием авторства первоначальных разработчиков. Он не одинок, среди великих таких немало. Д давление авторитета со стороны большого ученого известно как эффект Матфея, описанного в «Притче о талантах» в Евангелии от Матфея. В науке эффект встречается повсеместно, особенно остро ощущался в советской науке.
Тьюринг и фон Нейман
Не упомянуть Тьюринга в повествовании об EDVAC невозможно, потому что почти во всех учебниках Нейману приписывают роль посредника между Универсальной машиной Тьюринга (UMT) и EDVAC, что создает впечатление, будто UMT был непосредственным прототипом EDVAC. Такая трактовка истории дает возможность представить создание программируемого компьютера как академический плод исключительно математической мысли, что выглядит красиво, но лишено какой-либо исторической достоверности. Тьюринг имеет косвенное отношение созданию программируемого компьютера.
Первое знакомство Тьюринга с фон Нейманом было заочным. В 1933 году Тьюринга, тогда еще 21-летнего студента, за успехи в учебе по принятой в Кембридже традиции наградили серьезным научным фолиантом. Совершенно случайно им оказалась книга фон Неймана «Математические основы квантовой механики», на момент публикации которой автору исполнилось всего 30 лет, а у него на счету уже было свыше 50 научных статей. Такое совпадение выглядит не иначе как знак судьбы.
Через пару лет она прозорливо свела их очно во время визита Неймана в Кембридж. После обстоятельной беседы он порекомендовал Тьюрингу пройти стажировку у него в Принстонском университете, и Тьюринг принял приглашение. Учитывая репутацию университета и Института передовых исследований (IAS), ставшего усилиями властей Германии центром интеллектуальной жизни. Здесь работали Алонсо Черч, его ученики Стивен Клейни и Джон Россер, а в IAS неоднократно бывал Курт Гедель; позже здесь оказались Эйнштейн и Оппенгеймер.
Мог ли выпускник Кембриджа мечтать о большем, чем о таком сообществе коллег? В октябре 1936 года он оказался в кампусе университета, где, помимо основной деятельности, активно занимался спортом – был членом софтбольной команды, занимался бегом и спуском по реке на каноэ, но с коллегами близко не сходился и держался отстраненно. Вскоре после приезда из Лондона ему прислали гранки статьи «On Computable Numbers», которую он после правки отправил обратно, и в январе 1937 года статья вышла в свет. В 2008 году ученый совет Принстона признал Тьюринга вторым по значимости выпускником, хотя статья была написана все же в Кембридже. Первым по значимости выпускником Принстона ученый совет признал Джона Нэша, выдающегося математика, лауреата Нобелевской премии по экономике (1994) за вклад в теорию игр. Попутно отметим, что о Нэше «Игры разума» (A Beautiful Mind, 2001), менее известный чем «Игра в имитацию» (The Imitation Game, 2014) о Тьюринге, содержательнее.
Единственным человеком, с которым а Принстоне у Тьюринга возник личный контакт, оказался фон Нейман. Внешне они были полной противоположностью друг другу: фон Нейман – бонвиван, обновлявший гардероб ежегодно, стремившийся стать настоящим американцем, активно демонстрировавший антикоммунистические взгляды; Тьюринг – мрачный по натуре, скромный англичанин, с трудом научившийся водить старый Ford и одетый в поношенную одежду из твида. Контраст был заметен, что не мешало содержательному взаимодействию.
Для фон Неймана странности английского стажера не имели значения. Он предложил Тьюрингу остаться в качестве ассистента с неплохой зарплатой по окончании полутора лет стажировки, но на этот получил отказ. Тьюринг был патриотом и видел угрозу нацистской Германии, писав другу: «Надеюсь, Гитлер не вторгнется в Англию до моего возвращения». Он тогда еще не осознавал своей роли в будущей криптовойне.
На этом научное продуктивное сотрудничество двух гениев завершилось, но идея программируемой машины Тьюринга оставила неизгладимый след в памяти фон Неймана. В описании EDVAC эта теория прямо не использовалась, однако фон Нейман рекомендовал участникам проекта ознакомиться со статьей «Computable Numbers» для расширения кругозора. По окончании войны фон Нейман и Тьюринг до 1949 года еще поддерживали переписку, в которой они расходились во мнении об интеллектуальном потенциале компьютеров: Тьюринг размышлял о том, может ли машина мыслить, а фон Нейман видел в компьютере исключительно средство обработки данных. И, черт возьми, он оказался прав!
Тайм-лайн EDVAC
Работа по проекту EDVAC делится на несколько этапов:
• Хронология развития идеи (август 1944 – март 1945)
• Август 1944. ENIAC близок к завершению, но становятся очевидны его ограничения. Моукли и Эккерт обсуждают идею хранения программы и данных в памяти, а также возможность автоматического исполнения команд, выбираемых из памяти.
• Сентябрь 1944. Эккерт предлагает использовать ртутные линии задержки в качестве памяти, способной хранить данные и инструкции. Моукли работает над логической моделью и идеей системы команд. Появляется мысль о двоичной арифметике: проще реализовать и требуется меньше компонентов.
• Ноябрь 1944. Вырабатываются основы архитектуры: память, арифметико-логическое устройство, устройство управления, устройство ввода/вывода. Оформляется формат команд (код операции и адреса операндов). Принято решение об унифицированной памяти для данных и кода и внутреннем дешифраторе команд вместо внешнего коммутатора. Начинается ранний архитектурный дизайн.
• Январь 1945. Проект получает название EDVAC, включающее слова «discrete variable». Ведутся обсуждения формата команд, синхронизации памяти и ALU, реализации дешифратора и идей fetch-decode-execute. Голдштейн подготавливает проектную документацию для армейского заказчика.
• Март 1945. В качестве консультанта подключается Джон фон Нейман. Он не инициирует новую архитектуру, но дает теоретическую интерпретацию, вводит термины, сравнимые с машиной Тьюринга. Голдштейн предлагает фон Нейману оформить идеи в виде локального отчета для армейского заказчика.
• При участии фон Неймана (апрель 1945 – июнь 1946)
• Апрель 1945. Фон Нейман активно работает над теоретическим оформлением архитектуры. Вводится унифицированная терминология: память, арифметическое устройство, устройство управления. Начинает формироваться идея программируемой машины как универсального автомата, устанавливается логическая связь с машиной Тьюринга.
• Май 1945. Появляется черновик текста, позже известный как «First Draft of a Report on the EDVAC». Фон Нейман пишет текст самостоятельно, акцентируя внимание на логической структуре и принципах работы машины, а не на схемотехнике. Совещания с Моукли, Эккертом и Голдштейном корректируют черновики.
• Июнь 1945. Завершается «First Draft». Отчет размножен на мимеографе и распространяется в научной среде, влияя на параллельные проекты в США и Великобритании (например, ACE Тьюринга). Хотя автором указан только фон Нейман, идеи являются коллективной работой.
• Июль—август 1945. Публикация отчета вызывает конфликт: авторство указано только за фон Нейманом, что лишает инженеров возможности патентования архитектуры.
• Сентябрь 1945. Моукли и Эккерт подготавливают свой отчет «Automatic High Speed Computing: A Progress Report on the EDVAC» для армейского заказчика. Он остается секретным, подробно описывает текущий статус проектирования, технические детали и уточненную архитектуру. Отчет подтверждает приоритет Эккерта и Моукли в разработке хранимой программы на инженерном уровне, в то время как фон Нейман остается теоретиком и популяризатором.
• Судьба двух документов складывается по-разному. Отчет фон Неймана быстро распространяется и закрепляет за ним репутацию «отца современной архитектуры компьютера». Отчет Эккерта и Моукли остается секретным и начинает проявлять влияние только позднее – через машины вроде UNIVAC.
• Финал совместной работы (осень 1945 – июнь 1946)
• Осень 1945. Эккерт и Моукли начинают искать возможности создания собственной компании и постепенно отходят от EDVAC. Фон Нейман уходит в Принстонский университет и начинает планировать IAS Machine, логического наследника EDVAC.
• Декабрь 1945 – март 1946. Продолжается техническая реализация EDVAC под руководством Клерка Везерберна: разработка арифметического блока, линий задержки, регистров, управляющей логики и внутренней документации.
• Июнь 1946. ENIAC введен в эксплуатацию, EDVAC все еще опытно-экспериментальный. В Moore School проходит Летняя школа, посвященная архитектуре и проектированию электронных машин. Используются идеи EDVAC, включая стек вызовов и подпрограммы.
• Завершение проекта (осень 1946 – август 1949)
• Осень 1946. Развитие EDVAC затруднено из-за отсутствия финансирования и ухода части команды.
• Август 1948. Начата подготовка технической документации: протоколы загрузки, описание команд, инструкции по замене ламп и тестированию. Формируется группа пользователей-программистов. На ранних этапах программирование как дисциплина почти не поднималось; основное внимание уделялось архитектуре памяти, команд, схем управления и физической реализации.
• Август 1949. EDVAC формально готов к передаче в BRL. Машина реализует архитектуру с хранимой программой и развитым набором инструкций.
Когда теория пытается догнать практику
Современные курсы по информатике и теории алгоритмов практически всегда начинают с машины разбора Тьюринга. Но с исторической точки зрения это в корне неверно. Первые компьютеры создавались вовсе не как реализация теоретических моделей. Никто из инженеров, причастных к ним, не читал и не знал о существовании статьи Тьюринга 1936 года. Они решали прагматические задачи, их целью было ускорение вычислений и не более того. Никто не говорил: «давайте построим физическую реализацию универсального автомата». Это один из тех случаев, когда теория догнала практику, объяснение возникло после явления, а не наоборот и стало ретроспективным основанием, а не исходной мотивацией.
ENIAC, EDVAC, UNIVAC, Manchester Baby, как и ранние компьютеры были реакцией на конкретные потребности – расчет баллистических таблиц, моделирование физических процессов, криптоанализ, атомный проект. Никто из создателей этих машин не задумывался об универсальности. Они действительно могли эмулировать любую вычислимую функцию, но никто этого не планировал, универсальность возникла, как побочный эффект инженерного прагматизма.
Теория вычислений как самостоятельная область сложилась позже. В 1950–60-х годах логики и математики начали систематизировать понятие алгоритма. Появились альтернативы машине Тьюринга: нормальные алгоритмы Поста, рекурсивные функции Клини, λ-исчисление Черча. На этом фоне стало ясно, что компьютер, построенный по принципам, изложенным фон Нейманом, – это, по сути, физическая реализация универсальной машины Тьюринга. Но это был вывод, а не предпосылка. Так же, как Луна не летает вокруг Земли потому, что ее кто-то туда поставил.



