ИСТОРИЯ ВТ
Природа научных знаний такова, что малопонятные и совершенно бесполезные приобретения сегодняшнего дня становятся популярной пищей для будущих поколений. |
Чарльз Бэббидж
Чем только не занимался британский ученый и изобретатель Чарльз Бэббидж (1791-1871)! Математик по образованию (Кембриджский университет), он написал 18 математических статей, большинство из которых посвящены созданию аппарата, аналогичного дифференциальному и интегральному исчислениям, в котором роль переменной должна играть функция*1. Кроме того, Бэббидж был пионером научных методов исследования производства, автором работ по вопросам налогообложения, страхования, статистики, криптологии; он изучал геологические, оптические и электромагнитные явления, изобрел динамометр для измерения силы тяги паровоза, коронограф и сконструировал офтальмоскоп; составил таблицу логарифмов чисел от 1 до 108 000, создал поперечно-строгальный и токарно-револьверный станки, предложил метод изготовления зубчатых колес литьем под давлением и многое, многое другое... И все же главным делом его жизни были вычислительные машины - предмет его гордости и жесточайших разочарований, превративших жизнерадостного и общительного человека в желчного мизантропа.
_____
*1 Такой аппарат был создан в конце XIX - начале XX века под названием "функциональный анализ".
Еще полвека назад имя ученого было известно лишь узкому кругу специалистов, но для современных компьютерщиков Бэббидж - культовая фигура, и редкий учебник по ВТ обходится без упоминания или краткого описания его пионерских работ. О Бэббидже написан десяток книг*1, издано 11-томное собрание его сочинений, в Миннеаполисе (США, шт. Миннесота) основан Институт Чарльза Бэббиджа, занимающийся вопросами истории ВТ... Мог ли предвидеть великий и не понятый обществом провидец, что его ждет такая посмертная слава?
_____
*1 Об ученом русскоязычный читатель узнал из нашей с покойным Р.С. Гутером брошюры "Чарльз Бэббидж" (М.: Знание, 1973).
Бэббидж разработал две вычислительные машины - Разностную (Difference Engine) и Аналитическую (Analytical Engine). Первая из них предназначалась для табулирования функций по способу конечных разностей, хорошо известному в численном анализе. Бэббидж видел в ней средство повышения точности вычисления различных таблиц, находивших в его время большое практическое применение. По замыслу автора, Разностная машина должна была табулировать функции с постоянными шестыми разностями с точностью до 18 знаков и состояла из вычислительной и печатающей частей. Я не буду останавливаться на описании машины*1 и лишь отмечу, что числа в ней представлялись с помощью регистров, состоящих из вертикально расположенных и находившихся на одной оси 18 десятизубчатых колес, и что ее арифметические способности были невелики - она выполняла лишь операцию сложения.
_____
*1 См., например, Полунов Ю.Л. От абака до компьютера: судьбы людей и машин, том I: От камешков до большого и среднего "железа"//М.: Русская редакция, 2004, с. 133-135.
От предшествовавших механических счетных машин Разностная машина отличалась тем, что в процессе вычислений не требовала вмешательства человека, но так же, как и они, обладала ограниченными возможностями. Она, пользуясь современной терминологией, представляла собой специализированное вычислительное устройство с фиксированной программой действий: установив в регистрах машины некоторые исходные данные, можно было табулировать функцию только одного вида. Чтобы перейти к вычислению другой функции, требовалось вмешательство человека - он должен был ввести в регистры новые исходные данные.
Замысел Разностной машины возник у Бэббиджа в 1820-м или 1821 г. Благодаря поддержке научных кругов и некоторых знатных особ ему удалось получить у правительства средства для найма чертежников и рабочих и в январе 1832 г. собрать и успешно испытать часть машины, которая содержала более 2000 деталей и могла рассчитывать полиномы с постоянными разностями третьего порядка. Далее, однако, работа застопорилась: Бэббидж рассорился и прекратил всякие отношения со своим "главным инженером" - выдающимся машиностроителем Джозефом Клементом (Joseph Clement, 1779-1884), правительство со скрипом выделяло средства для завершения постройки машины, а в ноябре 1842 г. объявило, что, затратив на поддержку Бэббиджа 17 000 фунтов (6000 он вложил сам), прекращает финансирование столь дорогостоящего проекта.
Чарльз Бэббидж в начале 1870-х
(с сайта www.history.mcs.st-andrews.ac.uk)
Но еще ранее, в середине 1834 г., Бэббидж оказался во власти новой грандиозной идеи - идеи построения универсальной вычислительной машины! Во время своего вынужденного простоя он понял, что Разностная машина - это лишь первый и весьма робкий шаг на пути к автоматизации вычислений, и задумал создать машину, которая вычисляла бы не только таблицы, но и решала бы все многообразие тех задач, с которыми регулярно сталкиваются математики и инженеры. В течение двух следующих лет он разрабатывает основные принципы построения и первый вариант конструкции новой машины, названной им "Аналитической" и являющейся прообразом универсальных цифровых вычислительных машин, появившихся более чем через столетие!
По словам Генри Превоста Бэббиджа, сына ученого, его отец пришел к концепции Аналитической машины путем следующих рассуждений. При табулировании функций приходится время от времени заменять значение последней разности, причем это делается в зависимости от результата в "регистре таблицы". Бэббидж попытался автоматизировать эту замену, предложив круговую конструкцию Разностной машины, в которой регистры "последней разности" и "таблицы" располагались бы рядом, а "регистр таблицы" управлял бы ходом вычислительного процесса*1.
_____
*1 "Машина, съедающая собственный хвост", - говорил о такой конструкции сам изобретатель.
Прежде чем рассмотреть устройство и принцип действия Аналитической машины, замечу, что в работе над нею было два периода. Временные рамки первого - середина 1834-го - конец 1848-го. Эти годы Бэббидж посвятил разработке различных вариантов построения (компоновки) машины, а также полного комплекта ее чертежей: он еще питал угасавшую с каждым годом надежду, что правительство согласится финансировать изготовление новой машины. Характерно, что Бэббидж отказался от ее макетирования и экспериментально проверял только работоспособность отдельных узлов; по-видимому, он был полностью уверен в правильности выбранного им пути и в качестве чертежей.
Второй период начался в январе 1857 г. и продолжался почти до самой смерти ученого. В это время Бэббидж генерирует все новые и новые идеи, касающиеся, с одной стороны, упрощения конструкции машины, а с другой - внесения в нее изменений, увеличивающих вычислительные возможности и все больше приближающих ее к средствам современной ВТ. Кроме того, пытаясь удешевить изготовление машины, он предлагает и успешно реализует новые технологии - штамповку и литье зубчатых колес.
В течение первого периода Бэббидж сформулировал несколько основополагающих принципов построения машины, не всегда напрямую связанных с технической реализацией.
1. Прежде всего он отделил устройство для хранения чисел от устройства, предназначенного для выполнения арифметических операций (в Разностной машине они были совмещены).
2. Дальнейшее развитие этого принципа позволило Бэббиджу предложить совершенно новую структурную организацию машины. В ее состав должны были входить:
а) "склад" (store) для хранения чисел (по современной терминологии - запоминающее устройство, память);
б) "мельница" (mill) для выполнения арифметических операций - арифметическое устройство;
в) устройство, управляющее в определенной последовательности действиями машины (автор не дал ему названия, но сейчас оно называется устройством управления);
г) устройства ввода и вывода данных.
3. Бэббидж рассматривал возможность представления чисел в машине не только в десятичной системе счисления, но и в системах с основанием 2, 3, 4, 5 и 100. Он пришел к выводу, что при использовании двоичной системы потребовалось бы иметь в каждом регистре слишком большое число колес (если сохранять ту же разрядность "машинного слова"). С другой стороны, использование системы с основанием 100 позволило бы сделать "склад" более компактным, но привело бы к тому, что арифметические операции выполнялись слишком медленно.
4. Чтобы обеспечить большой диапазон представимых в машине чисел и достичь высокой точности вычислений, Бэббидж планировал создать "склад", способный хранить от 100 до 1000 чисел по 40-50 десятичных знаков в каждом ("что позволяет иметь некоторый запас по отношению к наибольшему числу, которое может потребоваться"), и "мельницу", соответствующую этой разрядности. Для сравнения скажу, что емкость запоминающего устройства одной из первых английских ЭВМ EDSAC составляла 250 десятиразрядных чисел.
5. Оценивая возможности будущей машины, Бэббидж предположил, что она может быть использована для выполнения операций не только над числами, но и над алгебраическими выражениями. 10 июля 1836 г. он записал в своей рабочей тетради: "Сегодня я пришел к общей, но еще не совсем четкой концепции создания машины, вырабатывающей алгебраические (курсив Бэббиджа. - Ю.П.) формулы... Я имею в виду, что она должна это делать без обращения к конкретным числовым значениям алгебраических символов".
6. Кроме того, Бэббидж высказал соображения, чрезвычайно важные для современного программирования: предложил идеи "цикла" (правда, не дал ему названия), "библиотеки подпрограмм", операции "условной передачи управления" (о последней будет подробнее сказано позднее).
Конечно, перечисленным выше не исчерпываются все "вычислительные" идеи Бэббиджа. Он, например, предложил вариант Аналитической машины с двумя "мельницами", каждая их которых, работая параллельно, выполняла бы вычисления над 30-разрядными числами; будучи соединены между собой, они смогли бы обрабатывать числа с вдвое большей разрядностью.
Бэббидж, как уже говорилось, предложил множество вариантов компоновки машины (он называл их "планами"). В качестве примера рассмотрим "План N 16", датированный августом 1840 г.
Собранная часть Разностной машины, январь 1832 г.
(с сайта www.virtualtravelog.net)
Для хранения чисел в "складе" использовались регистры (колонки), состоявшие из десятизубчатых колес. Каждое из них, расположенное на общей для колонки оси, могло совершать независимые вращательные движения и останавливаться в одном из десяти положений, "запоминая" таким образом один десятичный знак. Для указания алгебраического знака числа использовалось самое верхнее колесо регистра. Колеса располагались по обе стороны от группы зубчатых реек, которые передавали числа со "склада" в "мельницу". Для того чтобы "считать" число из памяти, рейки продвигалась до тех пор, пока соответствующие колеса в "складе" не занимали "нулевое" положение. Уменьшение числа до нуля на одном регистре заставляло поворачиваться колеса другого на такую же величину, и тем самым осуществлялась "запись" числа в "мельницу". При этом число, хранившееся в памяти, "стиралось", однако при желании могло быть восстановлено: для этого рейки при своем обратном движении вводились в зацепление с необходимыми колесами.
Описанный способ передачи чисел с помощью зубчатых реек Бэббидж считал одним из своих важнейших изобретений. Однако в связи с тем, что рейки имели большую длину*1, возникла чисто техническая трудность: чтобы обеспечить перемещение реек с небольшим усилием, в зубчатых зацеплениях должны были быть люфты, однако при большом пути движения реек эти люфты "накапливались", что приводило к сбоям в работе машины. Бэббидж преодолел эту трудность, использовав ряд "стопоров" - клиньев, которые входили между зубьями колес и фиксировали их в "правильном" положении.
_____
*1 Покойный австралийский исследователь творчества Бэббиджа из Сиднейского университета Алан Дж. Бромли (Аllan G. Bromley) подсчитал, что для памяти емкостью в 100 чисел длина рейки равнялась примерно 3 м.
"Мельница" имела примерно 2 м в диаметре и около 5 м в высоту. Она состояла из ряда регистров, аналогичных регистрам памяти и расположенных вокруг группы "центральных колес". Эти колеса использовались для передачи чисел внутри "мельницы" и выполняли, таким образом, функции зубчатых реек. "Стирание" числа из "мельницы" не всегда оказывалось желательным, поэтому в ней большинство регистров состояло из двух групп колес: одна группа принимала числа, а другая служила для их передачи в другие узлы и блоки машины. Входной и выходной регистры использовались в качестве буферов при передаче чисел между "складом" и "мельницей". "Головной" и "замыкающий" регистры вместе образовывали накопитель двойной длины (для данного варианта плана - 80-разрядный), который предназначался для хранения произведения при умножении, а также делимого и остатка при делении.
"Базовыми" арифметическими операциями в Аналитической машине были сложение и вычитание. Чтобы сделать выполнение этих операций единообразным, Бэббидж заменил операцию вычитания на операцию сложения с десятичным дополнением вычитаемого. С этой целью он использовал регистр, в котором накапливались частичные суммы, представленные в дополнительном коде. Операнд передавался со "склада" в буферный регистр, а затем суммировался с числом, находившимся в этом регистре. Если результат суммирования (вычитания) необходимо было сохранить в памяти, то он предварительно передавался в другой буферный регистр, преобразовывался в случае необходимости в прямой код и затем "записывался" в "склад". Суммирование выполнялось в две фазы - сложения и переноса. Если колесо регистра переходило от положения "9" в положение "0", то сдвигался особый рычаг, что означало необходимость десятичного переноса в следующий (старший) разряд.
Операция умножения начиналась с того, что с помощью специального механизма предварительно определялся сомножитель, имеющий меньшее число значащих цифр (он становился множителем). После этого множимое извлекалось из памяти и последовательно суммировалось с самим собой, образуя первые девять кратных значений, которые запоминались в регистрах. Затем "считывалась" первая цифра множителя (начиная с младшего разряда), и содержимое одного из этих регистров, соответствующее значению "считанной" цифры, помещалось в сдвоенный регистр, в котором накапливались частные произведения. Процесс повторялся со следующей цифрой множителя с той разницей, что очередное кратное сдвигалось в сдвоенном регистре на один разряд влево и суммировалось с первым частным произведением и т. д. Результат умножения из регистра пересылался в "склад". Отдельные операции, выполняемые в процессе умножения, перекрывали друг друга во времени, так что время, необходимое для получения каждого частного произведения, оказывалось равным времени сложения двух чисел.
Операция деления выполнялась аналогичным образом. Сначала формировались кратные значения делителя. Две старшие цифры остатка, находящегося в сдвоенном регистре, сравнивались одновременно с двумя старшими цифрами всех кратных значений делителя, для того чтобы оценить, правильно ли определена очередная цифра частного. Если в результате сравнения оказывалось, что эта цифра больше необходимой, то выбранное кратное значение делителя вычиталось из остатка; при отрицательном значении результата вычитания к нему вновь добавлялся делитель, образуя новый остаток. Затем новый остаток сдвигался на один разряд, и процесс повторялся. Как и при выполнении умножения, отдельные "микрооперации" перекрывали друг друга во времени, так что время одного шага деления оказывалось равным времени сложения (вычитания) двух чисел вне зависимости от того, правильно ли было сделано предположение о значении цифры частного. Самые верхние ("знаковые") колеса регистров "мельницы" не были соединены с устройствами переноса. Если на цифровых роликах этих колес находилось четное число, то знак числа считался положительным, в случае нечетного числа - отрицательным. При умножении знак образовывался сложением чисел на верхних колесах, при делении - вычитанием этих чисел.
Операцию извлечения квадратного корня Бэббидж первоначально намеревался выполнять "аппаратными" средствами, но затем отказался от этого плана и для осуществления данной операции решил использовать метод последовательных итераций. Для этого он разработал упрощенную схему выполнения операций умножения и деления, которая позволяла получать произведение или частное с ограниченным числом знаков (на первых шагах итеративного процесса не требовалось иметь большое число значащих цифр в результатах вычислений).
Поскольку в Разностной машине время, затрачиваемое на фазу сложения, было значительно меньше времени, необходимого для выполнения последовательного переноса десятков, Бэббидж упорно работал над усовершенствованием механизма переноса. Он придумал множество вариантов его исполнения, пока не понял, что для кардинального ускорения процесса нужен совершенно новый принцип, и предложил схему "переноса с предварением" (по современной терминологии, "сквозного переноса") - изобретение, которым он особо гордился. Название "перенос с предварением" объясняется тем, что если на некотором колесе была "девятка", то возникший сигнал переноса в этот разряд "обходит" его, попадая сразу в следующий, и т. д. Благодаря этому значительно сокращается время переноса. В целом операции сложения или вычитания выполнялись за один оборот главного приводного вала машины.
Еще одно изобретение Бэббиджа связано с принципом построения устройства управления, имевшего в Аналитической машине иерархическую структуру. На нижнем уровне управление осуществлялось с помощью ряда "барабанов" (barrels), к поверхности которых на различной высоте болтами были прикреплены особые штифты, имеющие в сечении прямоугольную форму. Когда "барабаны" вращались, каждый ряд этих штифтов воздействовал на определенные рычаги, которые, в свою очередь, передавали механическую энергию от главного вала машины ее различным механизмам. Бэббидж предполагал использовать в машине до семи "барабанов", причем каждый из них мог содержать от 50 до 100 рядов штифтов (до 200 в каждом ряду).
На верхнем уровне управления Бэббидж решил использовать механизм, аналогичный механизму ткацкого станка Жаккара. Так как он играет принципиальную роль в работе машины, полезно сначала коротко ознакомиться с его действием.
Ткань представляет собой переплетение взаимно перпендикулярных нитей. Нити основы (продольные) продеты через глазки - отверстия в проволочных петлях (ремизках), прикрепленных по нескольку штук к расположенным на раме крючкам. При самом простом переплетении петли поднимаются через одну, приподнимая продетые через них нити основы. Между поднятыми и оставшимися на месте нитями образуется промежуток, в который челнок протягивает за собой нить утка (поперечную), после чего поднятые петли опускаются, а остальные - поднимаются. Если нужен более сложный узор, переплетения петли следует приподнимать в различных других комбинациях. Сын лионского ткача Жозеф Мари Жаккар (1752-1834) после настойчивой тридцатилетней работы изобрел в 1801 г. механизм, позволявший автоматизировать движение петель в соответствии с заданным законом. Для этого он использовал цепочку из связанных между собой веревочными петлями картонных карт, в которых пробиты отверстия. В станке Жаккара крючки соединены с длинными иглами, упирающимися в карту. Встречая отверстие, иглы продвигаются, в результате чего соответствующие глазки приподнимаются. Иглы, упирающиеся в карты в том месте, где отверстий нет, остаются на месте вместе со связанными с ними крючками. Таким образом, промежуток для челнока, в который протягивается уток, а тем самым и узор переплетения нитей, определяется набором отверстий на соответствующих картах.
Идея Бэббиджа заключалась в том, чтобы заставить два жаккаровских механизма (с цепочкой карт в каждом) управлять работой машины путем передачи определенных воздействий на барабаны. Один механизм с "картами операции" должен был приводить в движение тот барабанчик, который управлял работой "мельницы" и выполнением той или иной арифметической операции в зависимости от отверстий, пробитых в соответствующей карте. Второй механизм должен был работать с "управляющими картами", которые управляли "барабанами", приводившими в действие механизм переносом чисел из "склада" в "мельницу" и обратно (Бэббидж называл их "картами переменных"), а также управлявшими вводом новых чисел в "склад" и выводом результатов вычислений на печать ("цифровые карты"). В машине использовались три разновидности "карт переменных": "поставляющие карты"*1 предназначались для передачи чисел из памяти в арифметическое устройство, "нулевые карты" обеспечивали передачу чисел со "склада" на "мельницу", причем при этом содержимое соответствующего регистра становилось равным нулю (осуществлялось стирание регистра), а "сохраняющие карты" служили для того, чтобы содержимое регистра оставалось прежним после передачи чисел. С помощью "цифровых карт" в машину могли вводиться не только числа, необходимые для решения конкретной задачи, но и константы, логарифмические и другие таблицы.
_____
*1 Это и другие названия "карт переменных" предложены Адой Августой Лавлейс, которой будет посвящена следующая статья цикла.
(Окончание следует )