Первый патент (на идею) Голлерит получил в 1884 году. В 1887 году его машина была испытана в Балтиморе при составлении таблиц смертности населения. В 1889 году состоялось решающее испытание системы — проводилась пробная перепись в четырех районах города Сан-Луи. Машина Голлерита намного опередила две конкурирующие с ней ручные системы (она работала в 10 раз быстрее). После этого правительство США заключило с Голлеритом договор о поставке оборудования к переписи 1890 года. Результаты этой переписи благодаря табулятору были обработаны всего за два года. Вследствие этого машина очень быстро получила международное признание и употреблялась во многих странах при обработке данных переписи населения.
   В 1902 году Голлерит создал автоматический табулятор, в котором карты подавались не вручную, а автоматически, и модернизировал свою сортировочную машину. В 1908 году он создал принципиально новую модель суммирующей машины. Вместо чашек с ртутью здесь применялись контактные щетки, с помощью которых замыкались электрические цепи электромагнитов. Последние обеспечивали соединение и разъединение непрерывно вращающегося вала с цифровыми колесами счетчика сумматора. Цифровые колеса поворачивались через зубчатые зацепления от непрерывно вращающегося вала, который нес на себе скользящие кулачковые муфты, управляемые электромагнитами. Когда под контактной щеткой оказывалось отверстие, замыкалась электрическая цепь соответствующего электромагнита, и он включал муфту, которая подсоединяла цифровое колесо к вращающемуся валу, после чего содержимое счетчика в данном разряде увеличивалось на число, пропорциональное одному повороту колеса. Передача десятков осуществлялась примерно так же, как в разностной машине Бэббиджа.
   Дело, начатое Голлеритом, имеет продолжение и в наше время. Еще в 1896 году он основал фирму «Табьюлейтинг Машин Компани», специализирующуюся на выпуске счетно-перфорационных машин и перфокарт. В 1911 году, после того как Голлерит оставил предпринимательскую деятельность, его фирма слилась с тремя другими и была преобразована в широко известную сейчас во всем мире корпорацию IBM — крупнейшего разработчика в области вычислительной техники.
   В табуляторе Голлерита впервые были использованы электромеханические элементы. Дальнейшее развитие вычислительной техники было связано с широким и многогранным применением электричества. В 1938 году немецкий инженер Конрад Цузе создал первую в истории релейную электронно-вычислительную машину Z1 на телефонных реле (записывающее устройство в ней оставалось механическим). В 1939 году появилась более совершенная модель Z2, а в 1941 году Цузе собрал первую в мире действующую вычислительную машину с программным управлением, в которой использовалась двоичная система. Все эти машины погибли во время войны и поэтому не оказали большого влияния на дальнейшую историю вычислительной техники.
   Независимо от Цузе постройкой релейных вычислительных машин занимался в США Говард Айкен. Будучи аспирантом Гарвардского университета, Айкен при работе над своей диссертацией был вынужден делать много сложных вычислений. Чтобы сократить время на вычислительную работу, он стал придумывать несложные машины для автоматического решения частных задач. В конце концов он пришел к идее автоматической универсальной вычислительной машины, способной решать широкий круг научных задач. В 1937 году его проектом заинтересовалась фирма IBM. В помощь Айкену была выделена бригада инженеров. Вскоре началась работа над постройкой машины «Марк-1». Реле, счетчики, контактные и печатающие устройства ввода и вывода перфокарт были стандартными частями табуляторов, выпускаемых IBM. В 1944 году машина была собрана и передана Гарвардскому университету.
   «Марк-1» оставался машиной переходного типа. В ней широко использовались механические элементы для представления чисел и электромеханические для управления работой машины. Как и в аналитической машине Бэббиджа, числа хранились в регистрах, состоящих из десятизубых счетных колес. Всего в «Марке-1» было 72 регистра и, кроме того, дополнительная память из 60 регистров, образованных механическими переключателями. В эту дополнительную память вручную вводились константы — числа, которые не изменялись в процессе вычисления. Каждый регистр содержал 24 колеса, причем 23 из них использовались для представления самого числа, а одно — для представления его знака. Регистры имели механизм для передачи десятков и поэтому использовались не только для хранения чисел, но и для выполнения операций над ними: число, находящееся в одном регистре, могло быть передано в другой и добавлено к находящемуся там числу (или вычтено из него). Эти операции выполнялись следующим образом. Через счетные колеса, образующие регистр, проходил непрерывно вращающийся вал, причем любое колесо с помощью электромеханических переключателей могло быть присоединено к этому валу на время, составляющее некоторую часть его оборота. К каждому числу присоединялась щетка (считывающий контакт), которая при вращении колеса пробегала по неподвижному десятисегментному контакту. Это позволяло получить электрический эквивалент цифры, хранящейся в данном разряде регистра. Для выполнения операции суммирования устанавливались такие соединения между щетками первого регистра и механизмом переключения второго регистра, что колеса последнего связывались с валом на часть периода оборота, пропорционального цифрам, находившимся в соответствующих разрядах первого регистра. Все переключатели автоматически выключались в конце фазы сложения, занимавшей не более половины периода оборота. Сам механизм суммирования по существу не отличался от сумматора голлеритовских табуляторов.
   Умножение и деление производились в отдельном устройстве. Кроме того, в машине имелись встроенные блоки для вычисления функций sin x, log x и некоторых других. Скорость выполнения арифметических операций в среднем составляла: сложение и вычитание — 0, 3 секунды, умножение — 5, 7 секунды, деление — 15, 3 секунды. То есть «Марк-1» был эквивалентен примерно 20 операторам, работающим с ручными счетными машинами.
   Работой «Марк-1» управляли команды, вводимые с помощью перфорированной ленты. Каждая команда кодировалась посредством пробивки отверстий в 24 колонках, идущих вдоль ленты, и считывалась с помощью контактных щеток. Пробивка на перфокартах преобразовывалась в набор импульсов. Совокупность электрических сигналов, полученных в результате «прощупывания» позиций данного ряда, определяла действия машины на данном шаге вычислений. Устройство управления на основании этих команд обеспечивало автоматическое выполнение всех вычислений в данной программе: осуществляло выборку чисел из ячеек памяти, давало команду требуемой арифметической операции, отправляло результаты вычислений в запоминающее устройство и т.д. В качестве устройства вывода Айкен использовал пишущие машины и перфораторы.
   Вслед за пуском «Марк-1» Айкен и его сотрудники начали работу над «Марком-2», закончившуюся в 1947 году. В этой машине уже не было механических цифровых колес, а для запоминания чисел, выполнения арифметических операций и операций управления использовались электрические реле — всего их было 13 тысяч. Числа в «Марк-2» представлялись в двоичном виде.
   Двоичная система исчисления была предложена еще Лейбницем, который считал ее самой удобной для использования в вычислительных машинах. (Трактат на эту тему был написан в 1703 году.) Им же была разработана арифметика двоичных чисел. В двоичной системе, точно так же как в привычной нам десятичной, значение каждой цифры определяется ее позицией, но вместо обычного набора из десяти цифр используются только две: 0 и 1. Для того чтобы понять двоичную запись числа, посмотрим сначала, какой смысл имеет хорошо всем известная десятичная запись. Например, число 2901 можно представить в следующем виде:
   2901 = 2 • 103 + 9 • 102 + 0 • 101 + 1 • 100
   То есть, цифры: 2, 9, 0, 1 указывают на то, сколько единиц находится в каждом из десятичных разрядов числа. Если же вместо десятичной системы берется двоичная, каждая цифра будет указывать на то, сколько единиц содержится в каждом из двоичных разрядов. Например, число 13 записывается в двоичной системе так:
   13 = 8 + 4 + 1 = 1 • 23 + 1 • 22 + 0 • 21 + 1 • 20 = 1101
   Двоичная система достаточно громоздка (скажем, число 9000 будет в ней 14-значным), но она очень удобна при выполнении арифметических операций. Вся таблица умножения в ней сводится к единственному равенству 1•1=1, а сложение имеет только три правила: 1) 0+0 дает 0; 2) 0+1 дает 1; 3) 1+1 дает 0 и перенос 1 в старший разряд.
   Например:
   01010
   +01011
   10101
   Утверждение двоичной системы в вычислительной технике было обусловлено существованием простых технических аналогов двоичной цифры — электрических реле, которые могли находиться в одном из двух устойчивых состояний, первое из которых ставили в соответствие с 0, другое — с 1. Передача двоичного числа электрическими импульсами из одного машинного устройства в другое тоже очень удобна. Для этого достаточно всего двух различных по форме импульсов (или даже одного, если отсутствие сигнала считать за нуль).
   Следует отметить, что релейные машины, созданные на заре истории ЭВМ, недолго использовались в вычислительной технике, поскольку были сравнительно медленнодействующими. Так же как в механической машине скорость вычислений определялась скоростью поворота цифровых колес, время работы схемы, составленной из реле, равнялось времени срабатывания и отпускания реле. Между тем даже самые быстрые реле не могли делать больше 50 срабатываний в секунду. Например, в «Марк-2» операции сложения и вычитания занимали в среднем 0, 125 секунды, а умножение требовало 0, 25 секунды. Гораздо большим быстродействием обладали электронные аналоги электромеханических реле — вакуумные лампы-триггеры. Они и стали базовыми элементами в ЭВМ первого поколения.
   Триггер был изобретен еще в 1919 году русским инженером Бонч-Бруевичем и независимо от него американцами Икклзом и Джорданом. Этот электронный элемент содержал две лампы, и в каждый момент мог находиться в одном из двух устойчивых состояний. Он представлял собой электронное реле, то есть при наличии сигнала управляющего импульса включал нужную линию или цепь электрического тока. Подобно электромеханическому реле он мог использоваться для обозначения одной двоичной цифры.
   Рассмотрим принцип работы электронного реле, состоящего из двух электронных ламп-триодов Л1 и Л2, которые могут находиться в одном баллоне. Напряжение с анода Л1 через сопротивление R1 подается на сетку Л2, а напряжение с анода Л2 подается на сетку Л1 через сопротивление R2. В зависимости от положения, в котором находится триггер, он дает низкий или высокий уровень напряжения на выходе. Допустим вначале, что лампа Л1 открыта, а Л2 — закрыта. Тогда напряжение на аноде открытой лампы мало по сравнению с напряжением на аноде закрытой лампы. Действительно, так как открытая лампа Л1 проводит ток, то большая часть анодного напряжения падает (по закону Ома u=i•R) на высоком анодном сопротивлении Ra, а на самой лампе (включенной с ним последовательно) падает лишь незначительная часть напряжения. Наоборот, в закрытой лампе анодный ток равен нулю, и все напряжение источника анодного напряжения падает на лампе. Поэтому с анода открытой лампы Л1 на сетку закрытой лампы падает значительно меньшее напряжение, чем с анода закрытой лампы Л2 на сетку Л1. Отрицательное напряжение Ec, поданное на сетки обеих ламп, выбирается таким, чтобы вначале лампа Л2 была закрыта, несмотря на наличие небольшого положительного напряжения, поданного с анода открытой лампы Л1 на сетку Л2. Лампа же Л1 вначале открыта, так как положительное напряжение, поданное на сетку с анода Л2, значительно больше, чем Ec. Таким образом, благодаря связи между лампами через сопротивления R1 и R2 начальное состояние является устойчивым и будет сохраняться сколько угодно долго.
   Рассмотрим теперь, что произойдет в схеме, если на сетку открытой лампы Л1 подать извне отрицательное напряжение в виде короткого импульса тока такой величины, чтобы закрыть ее. При уменьшении анодного тока i1 напряжение на аноде лампы Л1 резко увеличится и, следовательно, увеличится положительное напряжение на сетке Л2. Это вызовет появление анодного тока i2 через лампу Л2, благодаря чему уменьшится анодное напряжение на лампе Л2. Понижение положительного напряжения на сетке Л1 приведет к еще большему уменьшению тока в Л1 и т.д. В результате такого лавинообразного нарастающего процесса уменьшения тока в Л1 и увеличения тока в Л2 лампа Л1 закроется, а лампа Л2 будет открыта. Таким образом, схема перейдет в новое устойчивое положение равновесия, которое будет сохраняться сколько угодно долго: «запоминается» поданный на вход 1 импульс. Возвращение электронного реле обратно в исходное состояние можно осуществить подачей импульса отрицательного напряжения на вход. Триггер имеет, следовательно, два устойчивых положения равновесия: начальное, при котором Л1 открыта, а Л2 закрыта, и так называемое «возбужденное» состояние, при котором Л1 закрыта, а Л2 открыта. Время переброса триггера из одного состояния в другое очень мало. Конденсаторы C1 и C2 служат для убыстрения срабатывания лампы.
   Идея вычислительной машины, в которой в качестве запоминающего устройства использовались бы электронные лампы, принадлежит американскому ученому Джону Моучли. Еще в 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" передастся в сумматор соседнего разряда.
   В первых ЭВМ основным элементом памяти и арифметического суммирующего устройства служили триггеры. Триггерная схема, как мы помним, обладала двумя устойчивыми состояниями равновесия. Приписывая одному состоянию значение кода "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 одного разряда. Третий вход служил для передачи кода переноса из предыдущего разряда.