Константин Рыжов - 100 великих изобретений
Идея вычислительной машины, в которой в качестве запоминающего устройства использовались бы электронные лампы, принадлежит американскому ученому Джону Моучли. Еще в 30-е годы он сделал несколько несложных вычислительных устройств на триггерах. Однако впервые электронные лампы при создании вычислительной машины применил другой американский математик Джон Атанасов. Его машина была уже практически завершена в 1942 году. Но из-за войны финансирование работы было прекращено. В следующем 1943 году, работая в Муровской электротехнической школе Пенсильванского университета, Моучли вместе с Преспером Эккертом разработал свой проект электронной вычислительной машины. Артиллерийское управление США заинтересовалось этой работой и заказало Пенсильванскому университету постройку машины. Руководителем работ был назначен Моучли. В помощь ему было дано еще 11 инженеров (включая Эккерта), 200 техников и большое число рабочих. В течение двух с половиной лет, до 1946 года, этот коллектив трудился над созданием «электронно-цифрового интегратора и вычислителя» — ЭНИАК. Это было огромное сооружение, занимавшее площадь 135 квадратных метров, имевшее массу 30 тонн и энергопотребление 150 киловатт. Машина состояла из сорока панелей, содержащих 18000 электронных ламп и 1500 реле. Однако использование электронных ламп вместо механических и электромеханических элементов позволило резко увеличить скорость. На умножение ЭНИАК тратил всего 0, 0028 секунды, а на сложение — 0, 0002 секунды, то есть работал в тысячу раз быстрее самых совершенных релейных машин.
Устройство ЭНИАК в общих чертах было следующим. Каждые десять триггеров соединялись в нем в кольцо, образуя десятичный счетчик, который выполнял роль счетного колеса механической машины. Десять таких колец плюс два триггера для представления знака числа образовывали запоминающий регистр. Всего в ЭНИАК было двадцать таких регистров. Каждый регистр был снабжен схемой для передачи десятков и мог использоваться для выполнения операции суммирования и вычитания. Другие арифметические операции выполнялись в специальных блоках. Числа передавались из одной части машины в другую посредством групп из 11 проводников — по одному для каждого десятичного разряда и знака числа. Значение передаваемой цифры равнялось числу импульсов, протекавших по данному проводнику. Работой отдельных блоков машины управлял задающий генератор, вырабатывавший последовательность определенных сигналов, которые «открывали» и «закрывали» соответствующие блоки электронной машины.
Ввод чисел в машину производился при помощи перфокарт. Программное же управление осуществлялось посредством штекеров и наборных полей (коммутационной доски) — таким образом отдельные блоки машины соединялись между собой. Это было одним из существенных недостатков описываемой конструкции. На подготовку машины к работе — соединение блоков на коммутационной доске — уходило до нескольких дней, тогда как задача порой решалась всего за несколько минут. В целом ЭНИАК была еще достаточно ненадежной и несовершенной вычислительной машиной. Она часто выходила из строя, причем поиск неисправности затягивался порой на несколько суток. Кроме того, эта машина не могла хранить информацию.
Для устранения последнего недостатка Эккерт в 1944 году выдвинул идею хранимой в памяти программы. Это была одна из важнейших технических находок в истории вычислительной техники. Суть ее заключалась в том, что команды программы должны были представляться в виде числового кода, то есть кодироваться в двоичной системе (как и числа) и вводиться в машину, где бы они хранились вместе с исходными числами. Для запоминания этих команд и операций с ними предполагалось использовать те же устройства — триггеры, что и для действия с числами. Из памяти отдельные команды должны были извлекаться в устройство управления, где их содержание расшифровывалось и использовалось для передачи чисел из памяти в арифметическое устройство для выполнения операций над ними и отсылки результатов обратно в память.
Между тем по окончании Второй мировой войны одна за другой стали появляться новые электронные вычислительные машины. В 1948 году англичане Килбурн и Вильямс из Манчестерского университета создали машину «МАРК-1», в которой впервые была реализована идея хранимой программы. В 1947 году Эккерт и Моучли основали свою фирму, а в 1951 году наладили серийный выпуск своих машин UNIVAC-1. В 1951 году появилась первая советская ЭВМ МЭСМ академика Лебедева. Наконец, в 1952 году свой первый промышленный компьютер IBM 701 выпустила фирма IBM. Все эти машины имели в своей конструкции много общего. Об этих общих принципах работы всех ЭВМ первого поколения мы теперь и поговорим.
Электронные вычислительные машины, как известно, совершили настоящий переворот в области применения математики для решения важнейших проблем физики, механики, астрономии, химии и других точных наук. Те процессы, которые прежде совершенно не поддавались просчитыванию, стали вполне успешно моделироваться на вычислительных машинах. Решение любой задачи сводилось при этом к следующим последовательным шагам: 1) исходя из значения физической, химической и прочей сущности какого-либо исследуемого процесса формулировалась задача в виде алгебраических формул, дифференциальных или интегральных уравнений или других математических соотношений; 2) с помощью численных методов задача сводилась к последовательности простых арифметических операций; 3) составлялась программа, которая определяла строгий порядок выполнения действий в установленной последовательности. (ЭВМ осуществляла в принципе тот же порядок действий, что и человек, работающий на арифмометре, но в тысячи или десятки тысяч раз быстрее.) Команды составленной программы записывались с помощью специального кода. Каждая из этих команд определяла какое-либо определенное действие со стороны машины.
Любая команда, кроме кода проводимой операции, содержала в себе адреса. Обычно их было три — номера ячеек памяти, откуда брались два исходных числа (1-й и 2-й адрес), а затем номер ячейки, куда отправлялся полученный результат (3-й адрес). Таким образом, к примеру, команда +/17/25/32 указывала, что следует сложить числа, находящиеся в 17-й и 25-й ячейках и результат направить в 32-ю ячейку. Могла использоваться и одноадресная команда. В этом случае для выполнения арифметической операции над двумя числами и отсылки полученного результата требовалось три команды: первая команда вызывала одно из чисел из памяти в арифметическое устройство, следующая команда вызывала второе число и проводила заданную операцию над числами, третья команда отправляла полученный результат в память. Так осуществлялась работа вычислительной машины на программном уровне.
Вычислительные процессы при этом протекали следующим образом. Управление работой ЭВМ осуществлялось с помощью электронных ключей и переключателей, называемых логическими схемами, причем каждый электронный ключ при получении сигнала управляющего импульса напряжения включал нужную линию или цепь электрического тока. Простейшим электронным ключом могла служить уже трехэлектродная электронная лампа, которая заперта, когда на ее сетку подается большое отрицательное напряжение, и открывается, если на сетку подается положительное напряжение. Ее работу при этом можно представить как управляющий вентиль, который пропускает через себя импульс A, когда на второй его вход подан управляющий импульс B. Когда же имеется только один импульс тока A или B, то вентиль закрыт и импульс не проходит на его выход. Таким образом, только при совпадении по времени обоих импульсов A и B на выходе появится импульс. Такую схему называют схемой совпадений, или логической схемой "и". Наряду с ней в вычислительной машине используется целый набор других логических схем. Например, схема «или», которая дает на выходе импульс при появлении его на линии A или B или одновременно на обеих линиях. Другая логическая схема — схема «нет». Она, наоборот, запрещает прохождение импульса через вентиль, если одновременно подан другой запрещающий импульс, запирающий лампу.
С использованием двух этих схем можно собрать одноразрядный сумматор. Предположим, что импульсы A и B одновременно передаются на схемы «нет» и "и", причем со схемой «нет» связана шина (провод) «сумма», а со схемой "и" шина «перенос». Предположим, что на вход A поступает импульс (то есть единица), а на вход B не поступает. Тогда «нет» пропустит импульс на шину «сумма», а схема "и" не пропустит его, то есть в разряде будет значиться "1", что и соответствует правилу двоичного сложения. Предположим, что на входы A и B одновременно поступают импульсы. Это означает, что код числа A есть "1" и код B тоже "1". Схема «нет» не пропустит двух сигналов и на выходе «сумма» будет "0" Зато схема "и" пропустит их, и на шине «перенос» будет импульс, то есть "1" передастся в сумматор соседнего разряда.