Как уже обсуждалось в предыдущей статье, в конце 40-х годов прошлого века началась цифровая революция. Но её истоки лежали гораздо глубже. Пробежимся по ним галопом.
Самым ранними отдаленным прообразам современных компьютеров можно считать созданный в 17 веке арифмометр Лейбница. С его помощью можно было осуществлять четыре основные арифметические операции - сложение, вычитание, умножение и деление. Впрочем, на роль первого арифмометра может претендовать и суммирующая машина Паскаля, которая, правда, как следует из названия, могла без особого геморроя производить только сложение чисел. Более того, при хорошей фантазии, им можно даже считать антикитерский механизм, создание которого некоторые исследователи приписывают самому Архимеду. Правда, последний мог вычислять не результаты арифметических действий, а видимое движение планет по небосводу и некоторые астрономические события. Короче, как это часто бывает, четкую границу провести невозможно ввиду отсутствия общепринятых критериев.
В любом случае, арифмометры мало-помалу улучшались, и в начале 19 века у английского математика Чарльза Бэббиджа появилась идея сделать устройство, которое позволяло бы с хорошим приближением вычислять значения функций посредством их аппроксимации в виде суммы полиномов. Появилась она не на пустом месте. К этому времени вычисление значений некоторых важных для практических расчетов функций, например, для тех же инженеров, уже превратилось из забавы для математиков в суровую жизненную необходимость. При этом, было известно, что широкий класс функций, включая тригонометрические и логарифмические, может быть представлен в виде суммы быстро сходящихся полиномиальных рядов (так называемые ряды Тейлора). Вот, например, как можно представить в виде ряда функции синуса и косинуса:

В то время значения тригонометрических и логарифмических функций для различных аргументов вычислялись вручную, а итоговые результаты расчетов публиковались в справочниках. Но беда была в том, что людям свойственно ошибаться как при расчётах, так и при наборе для печати чисел, содержащих длинный ряд цифр. В результате, справочники содержали многочисленные ошибки, которые в любой момент могли привести к некорректности в важных на практике вычислениях.
В этом плане характерен пример математика-любителя Вильяма Шенкса, который во второй половине 19 века вычислил значение числа пи с точностью до 707-ми знаков, потратив на это 15 лет своей жизни. В 1873 году он опубликовал результаты своих вычислений, которые впоследствии вошли во многие справочники. И лишь в 40-х годах 20 века, после изобретения компьютеров, выяснилось, что бедняга ошибся при расчете 528-й цифры, и, как результат, последние 180 цифр были вычислены неверно.
Идея Бэббиджа была проста - создать устройство, которое позволяло бы вычислять с большой точностью значения логарифмических, тригонометрических и других гладких функций за счёт аппроксимации их суммами рядов Тейлора, ограничившись первыми N его членами. Задачу существенно облегчало то обстоятельство, что полиноминальная функция для данного значения аргумента может быть подсчитана простым суммированием на основе ранее уже вычисленных ее значений для предыдущего значения аргумента, подробнее см. соответствующую статью на Хабре. Бэббидж назвал свое изобретение разностной машиной, так как в процессе вычислений она использовала разности между последовательными значениями полинома. По сути, эта машина была реализацией в железе алгоритма.аппроксимации функций многочленами.
Сами значения разностей должны были храниться в так называемых регистрах. Их был шесть, и один дополнительный регистр был выделен для хранения результата. Физически каждый регистр представлял из себя 18 зубчатых колёсиков, имеющих по 10 зубцов, каждому зубцу соответствовала одна цифра. Таким образом, разностная машина работала с традиционной десятичной системой счисления и могла хранить до 18-ти значащих цифр для каждого числа.
Так как при расчётах использовались только первые семь членов ряда, по мере вычислений неизбежно накапливалась небольшая ошибка. Для того, что бы минимизировать ее влияние, оператору необходимо было периодически вручную менять значение разности в последнем регистре. Например, для тригонометрических функций это приходилось делать через каждые несколько градусов. Для напоминания об этом для невнимательных операторов даже предполагалось после выполнения определённого заданного числа шагов подавать специальный звуковой сигнал.
Немаловажным полезным практическим свойством машины предполагалось так же возможность печати окончательного ответа (значения функции для данного аргумента) на медной пластинке, что позволяло избавиться от ошибок, совершаемых наборщиком. По сути, это был бы первый аналог принтера!
К сожалению, задача оказалась слишком сложной, и Бэббидж в итоге так и не смог её закончить, так как правительство на каком-то этапе прекратило финансирование его работы. Впрочем, как говорится, его дело не пропало, шведский изобретатель Георг Шойц ближе к середине 19 века всё таки сделал на основе идей Бэббиджа свою механическую (пусть и более простую и менее точную, но зато реально работающую) машину для вычисления логарифмов, и даже продал её в итоге британскому правительству. В конце 20 века после устранения некоторых конструктивных неточностей энтузиастам все же удалось успешно построить задуманную Бэббиджем машину по оставленным им чертежам.

Тот факт, что оператору разностной машины приходилось бы периодически менять вручную значения в последнем регистре, что бы продолжить вычисления, не ухудшая их точности, заставил ее изобретателя задуматься о проекте другой, ещё более продвинутой машины, в которой она на основе некой логики могла бы сама менять значения в своих регистрах, освободив, тем самым, оператора от ещё одного рутинного этапа его работы.
Отсюда было уже совсем недалеко до решения создать машину, которая могла бы не просто вычислять значения какой-то функции в определённых точках, а, в зависимости от результатов вычислений, сама бы решала, что предпринять дальше, подобно тому, как это делает человек. Но как объяснить машине, по какому алгоритму ей надлежит действовать? В итоге, Бэббидж решил использовать для ввода описания алгоритма в свою машину картонные перфокарты. Данный способ изобретатель позаимствовал у ткацкого станка Жаккарда, в котором он ещё с начала 19 века отвечал за кодирование узоров на производимых фабриками тканях. Итоговый результат предполагалось либо, как и для предыдущей машины, печатать в виде стереотипного отпечатка, либо пробивать на перфокарте.
Изобретатель назвал этот новый проект аналитической машиной. Для хранения промежуточных результатов расчётов в ней предполагалось выделить аж 1000 ячеек памяти. Это очень неслабо. Для сравнения - автор в середине 80-х годов прошлого века обсчитывал свою курсовую работу, посвященную построению сейсмической модели Солнца, на программируемом калькуляторе Электроника Б3 34, имеющем всего 14 регистров памяти, доступных пользователю! Очень важной новой деталью в аналитической машине была планируемая возможность реализации циклов. Одна и та же команда могла повторяться до тех пор, пока не будет выполнено некое заданное условие.
Вероятно, Бэббидж с самого начала понимал, что реализовать свой самый грандиозный проект при его жизни не удастся, так как аналитическая машина должна была в итоге содержать более пятидесяти тысяч колес и приводиться в действие с помощью парового двигателя. Он лишь надеялся, что кто-нибудь в итоге реализует аналитическую машину хотя бы в отдалённом будущем.
С аналитической машиной связаны и первые программы, придуманные для неё дочерью лорда Байрона Адой Лавлейс, которая сейчас считается первым программистом. Наиболее известная из них - вычисление чисел Бернулли с помощью алгоритма, использующего рекуррентные вложенные циклы.
Вторая промышленная революция, грянувшая во второй половине 19 века, поначалу мало отразилась на арифмометрах, разве что, в некоторые моделях теперь можно было не крутить ручку - часть производителей внедрила электропривод для вращения механических колесиков. Лишь в 1936 году, то есть, примерно через сотню лет после Бэббиджа, немецкий инженер Конрад Цузе начал на собственные деньги проектировать что-то отдаленно похожее на его аналитическую машину.
Через два года она уже была собрана в доме его родителей, занимая площадь около 4 м2 на нескольких сдвинутых в гостиной столах. Первая версия, как и у Бэббиджа, была чисто механической, только вместо шестерёнок у Цузе использовались механические рейки. Вычисления производились в двоичной системе, возможные операции над числами с плавающей точкой включали сложение, вычитание, умножение и деление. Для хранения переменных выделялись 64 слова длиной в 22 бита. Исходные данные вводились с помощью клавиатуры. Изобретатель назвал свое детище незатейливо - Z1.
Уже через год, в 1939 году, Цузе сделал следующую, более продвинутую модель Z2. Ненадежные, часто ломающиеся рейки в "вычислителе" (в сегодняшних терминах, процессоре) он заменил на уже широко к этому времени применяющиеся на АТС электромеханические реле, а ввод стал возможен на перфоленте, в качестве которой он использовал фотоплёнку.
Ещё через два года, в мае 1941 года, инженер представил следующую модель - Z3. В ней на реле была уже переведена и оперативная память, а к списку возможных команд добавилась возможность извлечения квадратного корня. Эта модель в итоге была доведена до вполне пригодного для практической эксплуатации состояния, в частности, активно использовалась немецкими военными инженерами для совершенствования самолётов Люфтваффе.
И все же, надо отметить, что Z3, строго говоря, еще не был универсальной машиной Тьюринга, так как в списке команд отсутствовал оператор условного перехода и не было возможности явного задания циклов. На практике циклы создавались путем склеивания концов перфоленты. Скорость выполнения арифметических операций была более, чем скромной, например, сложение занимало, в среднем, 0.8 секунды, а умножение около 3 секунд.

Уже через несколько лет после запуска Z3, а именно, в 1944 году, американский ученый Говард Эйкен запустил свой компьютер Mark I, который тоже делал арифметические операции с помощью реле и имел, в целом, схожие с Z3 характеристики. В частности, его оперативная память состояла из 72 (против 64 у Z3) слов, сложение занимало примерно 0.3 секунды, а умножение - 6 секунд. Устройство работало в десятичной системе счисления, ввод данных осуществлялся с помощью перфоленты. Как и в Z3, циклы реализовывались за счет физического создания на ней замкнутых петель. Монстр был почти 17 метров в длину и более 2,5 метров в высоту. Отдельные вычислительные модули синхронизировались механически при помощи вала, приводившегося в движение электродвигателем.
И всё же, реле слишком часто ломались из-за того, что у них имелись механические части в контактах. Кроме того, эти же механические части ограничивали рост скорости обработки. В итоге, им на смену очень скоро пришли ламповые компьютеры. Первыми на новую технологию перешли американцы, уже в 1945 году появился ENIAC (Electronic Numerical Integrator and Computer) разработанный в пенсильванском университете. Его предполагалось использовать для ускорения составления таблиц стрельбы для артиллерийских орудий с учетом влияния различных факторов. Изначально соответствующие расчеты для этого делались вручную с помощью арифмометров и занимали очень много времени.
Процесс программирования ENIAC-а кардинально отличался от того, к чему мы привыкли. Фактически для реализации задуманного алгоритма инженеры должны были заново вручную перекоммутировать между собой различные блоки компьютера с помощью кабелей и выставить в правильные позиции многочисленные переключатели. Де факто алгоритм программы задавался аппаратно, а перфокарты использовались лишь для ввода исходных данных и вывода результатов расчетов. Перекоммутацией, в основном, занималась команда из шести девушек, которых можно считать первыми профессиональными программистами 20 века. Из-за специфики способа программирования перекоммутация компьютера для новой задачи могла занимать до двух дней, в то время, как сами расчеты обычно занимали всего несколько минут.

С самого начала данный компьютер разрабатывался как универсальный. Именно благодаря этому обстоятельству он практически сразу же после сдачи в эксплуатацию, в том же 1945 году, смог быть использован для расчетов при создании термоядерного оружия.
Вот некоторые характеристики ENIAC:
система счисления - десятичная
объём оперативной памяти — 20 слов длиной 10 цифр каждое
тактовая частота - 100 Кгц
скорость сложения - 5000 операций в секунду
скорость умножения - 357 операций в секунду
скорость ввода данных - 125 перфокарт в минуту
скорость вывода данных - 100 перфокарт в минут
Как уже отмечалось выше, свое "боевое крещение" ENIAC прошел, фактически, с места в карьер. Так как в связи с окончанием Второй мировой войны артиллерийские таблицы стали уже не столь актуальны, было решено проверить его на задаче расчета возможности создания водородной бомбы. Если кто смотрел фильм Оппенгеймер, то, видимо, помнит, что один из ключевых разработчиков первой атомной бомбы, Теллер, сразу же предложил использовать ее как запал для еще гораздо более мощной бомбы - термоядерной.
Но выдвинуть идею, это одно, а проверить, насколько она реально работоспособна, это другое. С этой просьбой Теллер и обратился к команде, разработавшей ENIAC. Задача расчета термоядерной реакции на компьютере, имеющем всего двадцать слов для хранения переменных, современным физикам, видимо, показалась бы в принципе нереализуемой. Но они с ней в итоге справились! При этом, что бы ввести все исходные данные для решения соответствующих дифференциальных уравнений, потребовалось около миллиона (!) перфокарт.
Так как ENIAC изначально не был приспособлен для решения столько сложных и ресурсоемких задач, расчеты приходилось делать поэтапно. С помощью перфокарт вводились исходные данные, потом результаты расчетов выводились тоже на перфокарты, осуществлялась необходимая перекоммутация блоков компьютера, после чего результаты предыдущего этапа в виде все тех же перфокарт опять подавались на вход компьютера, и так дальше, шаг за шагом. Не смотря на все трудности, к апрелю 1946 года расчеты были закончены, и были сделаны предварительные выводы о вероятной возможности создания термоядерного оружия.
Ещё даже до завершения постройки ENIAC-а стали понятны некоторые его недостатки, в частности, невозможность ввода алгоритма решения задачи с помощью перфокарт, в то время, как, например, даже Z3, выпущенный Цузе за несколько лет до него, уже мог считывать программу через перфоленту. Работа над новым компьютером, который назвали EDVAC (Electronic Discrete Variable Automatic Computer) началась в 1944 году и была вчерне закончена к 1949 году, но исправление обнаруженных в период опытной эксплуатации неисправностей закончилось лишь в 1951 году. В разработке данного компьютера принял активное участие Фон Нейман, и именно с тех пор вычислительные машины обрели, в общих чертах, ту архитектуру, к которой мы привыкли.
Девайс работал в двоичной системе счисления, и имел оперативную память размером в 1000 слов размером в 44 бита каждое, что соответствует примерно 5.5 кб. В памяти хранился как код программы, так и данные. Для ввода-вывода информации использовалась магнитная лента. В секунду можно было сделать около 1100 операций сложения или около 340 операций умножения. Как видим, в скорости перемолки чисел EDVAC был даже несколько менее проворен, чем его предшественник, но если мы вспомним, что на перекоммутацию на новую задачу у того уходило минимум на два порядка больше времени, чем на собственно вычисления, этот недостаток был вполне терпим.
После успеха EDVAC-а компьютеры с похожей архитектурой начали быстро завоевывать мир, например, уже с 1951 года в США стал продаваться новый коммерческий компьютер UNIVAC I. Всего к концу 50-х годов было продано целых 46 его экземпляров.
Но все же первый акт коммерческой продажи компьютера, по видимому, произошел в Европе. В 1950 году неутомимый Цузе продал единственный экземпляр своего нового изделия Z4 швейцарской высшей технической школе Цюриха. Конечно, по своим характеристикам, особенно, по быстродействию, он не мог конкурировать с заокеанскими конкурентами (в основном, по причине использования сравнительно медленных реле, а не ламп), но нам деятельность Цузе в этот период интересна прежде всего тем, что он примерно в это же время работал над разработкой первого в мире языка программирования высокого уровня. В 1945 году он описал основы этого языка, который он назвал Планкалькюль (Plankalkül в переводе с немецкого, это что то вроде "планирование вычислений") в рукописи, которая была полностью опубликована лишь в 1972 году.
В этом языке уже поддерживались условные операторы, циклы, двумерные массивы, иерархические структуры данных, возможность вызова функций, обработка исключений и т.д. Оператора "goto", кстати, не было.)
Изначально Цузе использовал двумерную запись операторов языка, что было неудобно для набора на клавиатуре, поэтому уже в 90-е годы ее адаптировали к привычной современным программистам линейной форме. Язык предусматривал четыре основных типа идентификаторов - входные переменные, начинающиеся с буквы V, промежуточные переменные, начинающиеся с буквы Z, константы, начинающиеся на букву C, и выходные переменные, начинающиеся на букву R. Вместе с названием переменной всегда явно указывался и ее тип, скажем, V0[:8.0] означало входную переменную, являющуюся числом с плавающей точкой длиной 8 байт, из которых 0 байт отведено под хранение дробной части.
Вот, например, как выглядит в линейной форме языка Планкалькюль функция max3, принимающая на входе три переменные, и возвращающая максимальное из них значение.
P1 max3 (V0[:8.0],V1[:8.0],V2[:8.0]) → R0[:8.0] max(V0[:8.0],V1[:8.0]) → Z1[:8.0] max(Z1[:8.0],V2[:8.0]) → R0[:8.0] END P2 max (V0[:8.0],V1[:8.0]) → R0[:8.0] V0[:8.0] → Z1[:8.0] (Z1[:8.0] < V1[:8.0]) → V1[:8.0] → Z1[:8.0] Z1[:8.0] → R0[:8.0] END
Смотрится, конечно, несколько архаично, но, тем не менее, вполне понятно и для современных кодеров.
Сам Цузе надеялся, что когда-нибудь его компьютеры серии Z можно будет программировать именно с помощь придуманного им языка высокого уровня. Видимо, в надежде на это, он заранее разрабатывал для него различные потенциально полезные в будущем функции. Особенно его интересовали шахматы, только для различных способов оценки позиций в шахматах, он написал кода на 49 страниц!
Увы, в итоге сам изобретатель так и не разработал какого-либо компилятора или интерпретатора для придуманного им языка, это было сделано энтузиастами лишь в 2000-м году, через семь лет после его смерти. Как это нередко бывает, Планкалькюль просто опередил свое время, широкое распространение языков высокого уровня (Фортран, Алгол 58 и т.д.) началось лишь во второй половине 50-х годов.
В СССР достаточно быстро поняли, насколько важно иметь собственные компьютеры. Обычно первой отечественной ЭВМ называют созданную в Киеве под руководством Сергея Лебедева Малую Электронную Счетную Машину (МЭСМ). Правда, есть и другая версия расшифровки - Модель Электронной Счетной Машины, так как она изначально разрабатывалась именно как упрощенная пробная модель (Proof of Concept).
МЭСМ работала на лампах и размещалась на первом этаже двухэтажного здания. Так как опыта подобных разработок ещё не было, инженеры не сообразили сразу посчитать, каково будет ее тепловыделение при работе на полную мощность. В результате, вскоре после пробного включения выяснилось, что работать с ней операторам было просто невозможно из-за риска получить тепловой удар. В итоге, проблему пришлось временно решать путем разборки потолка и части кровли крыши для улучшения вентиляции. В ноябре 1950 года началось тестирование первой отечественной ЭВМ, которое подтвердило работоспособность машины, и уже с января 1952 года началась ее регулярная эксплуатация.

Примерно в это же время, в Москве, под руководством Исаака Брука параллельно шла пробная сборка другой советской ЭВМ - M1. Она была гораздо менее мощной, чем МЭСМ, но интересна тем, что это была первая отечественная вычислительная машина, в которой использовались схемы на полупроводниках, за счет чего удалось существенно уменьшить ее размеры. Она занимала площадь всего в 4 м² против около 60 м² у МЭСМ. В январе 1952 года, практически одновременно с МЭСМ, началась опытная эксплуатация M1.
Ещё до окончательного запуска в эксплуатацию МЭСМ Лебедев начал работу над сборкой ее "взрослой" модели - БЭСМ-1, и уже в апреле 1953 года был подписан акт о начале ее эксплуатации. Любопытно сравнить ее базовые характеристики с первым коммерческим компьютером IBM 701, поставки которого покупателям начались в том же 1953 году.
Объем оперативной памяти - 2048 или 4096 (в зависимости от комплектации) слов длиной 36 бит у американца против 1024 слова длиной 39 бит у БЭСМ. Тактовая частота процессора - 125 кГц у IBM против 100 кГц у БЭСМ. Число базовых операций сложения в секунду - около 17 тыс. для IBM против 8-10 тыс. у БЭСМ. Как видим, у американцев есть преимущество, но пока отнюдь не критическое. Ну а за пределами англосаксонского мира в то время БЭСМ-1 вообще не было равных, в октябре 1953 года на международной конференции в Дармштадте она была признана самым быстрым компьютером в континентальной Европе.
На этом на сегодня все, всех верующих и неверующих с Пасхой и первым полетом человека в космос!
