Добавить в цитаты Настройки чтения

Страница 131 из 159

Ввод чисел в машину производился при помощи перфокарт. Программное же управление осуществлялось посредством штекеров и наборных полей (коммутационной доски) — таким образом отдельные блоки машины соединялись между собой. Это было одним из существенных недостатков описываемой конструкции. На подготовку машины к работе — соединение блоков на коммутационной доске — уходило до нескольких дней, тогда как задача порой решалась всего за несколько минут. В целом ЭНИАК была еще достаточно ненадежной и несовершенной вычислительной машиной. Она часто выходила из строя, причем поиск неисправности затягивался порой на несколько суток. Кроме того, эта машина не могла хранить информацию.

Для устранения последнего недостатка Эккерт в 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" передастся в сумматор соседнего разряда.

В первых ЭВМ основным элементом памяти и арифметического суммирующего устройства служили триггеры. Триггерная схема, как мы помним, обладала двумя устойчивыми состояниями равновесия. Приписывая одному состоянию значение кода "0", а другому значение кода "1", можно было использовать триггерные ячейки для временного хранения кодов. В суммирующих схемах при подаче импульса на счетный вход триггера он переходил из одного состояния равновесия в другое, что полностью соответствовало правилам сложения для одного двоичного разряда (0+0=0; 0+1=1; 1+0=1; 1+1=0 и перенос единицы в старший разряд). При этом первоначальное положение триггера рассматривалось как код первого числа, а подаваемый импульс — как код второго числа. Результат образовывался на триггерной ячейке. Для того чтобы осуществить суммирующую схему для нескольких двоичных разрядов, необходимо было обеспечить перенос единицы из одного разряда в другой, что и осуществлялось специальной схемой.

Сумматор был главной частью арифметического устройства машины. Сумматор параллельного сложения кодов чисел сразу по всем разрядам имел столько одноразрядных сумматоров, сколько двоичных разрядов содержал код числа. Складываемые числа A и B поступали в сумматор из запоминающих устройств и сохранялись там с помощью триггеров. Регистры также состояли из ряда соединенных между собой триггеров T1, T2, T3, Т'1, Т'2 и т.д., в которые код числа подавался из записывающего устройства параллельно для всех разрядов. Каждый триггер хранил код одного разряда, так что для хранения числа, имеющего n двоичных разрядов, требовалось n электронных реле. Коды чисел, хранящиеся в регистрах, складывались одновременно по каждому разряду с помощью сумматоров S1, S2, S3 и т.д., число которых было равно числу разрядов. Каждый одноразрядный сумматор имел три входа. На первый и второй входы подавались коды чисел A и B одного разряда. Третий вход служил для передачи кода переноса из предыдущего разряда.