Страница:
Заметим, что колеса B1, B2 и K не имеют принципиального значения для работы машины и использовались лишь для передачи движения установочного колеса N цифровому барабану I. Зато колеса B3 и B4 являлись неотъемлемыми элементами счетчика и поэтому именовались «счетными колесами». Счетные колеса двух соседних разрядов A1 и A2, были жестко насажены на оси. Механизм передачи десятков, который Паскаль назвал «перевязь», имел следующее устройство. На счетном колесе B1 младшего в машине Паскаля разряда имелись стерженьки C1, которые при вращении оси A1 входили в зацепление с зубьями вилки M, расположенной на конце двухколенного рычага D1. Этот рычаг свободно вращался на оси A2 старшего разряда, вилка же несла на себе подпружиненную собачку. Когда при вращении оси A1 колесо B1 достигало позиции, соответствующей цифре 6, стержни C1 входили в зацепление с зубьями вилки, а в тот момент, когда оно переходило от 9 к 0, вилка выскальзывала из зацепления и под действием собственного веса падала вниз, увлекая за собой собачку. Последняя при этом проталкивала счетное колесо B2 старшего разряда на один шаг вперед (то есть поворачивая его вместе с осью A2 на 36 градусов). Рычаг H, оканчивавшийся зубом в виде топорика, играл роль зацепки, препятствовавшей вращению колеса B1 в обратную сторону при поднимании вилки.
Механизм переноса действовал только при одном направлении вращения счетных колес и не допускал выполнения операции вычитания вращением колес в обратную сторону. Поэтому Паскаль заменил вычитание сложением с десятичным дополнением. Пусть, например, необходимо из 532 вычесть 87. Метод дополнения приводит к действиям: 532-87=532-(100-13)=(532+13)-100=445. Нужно только не забывать вычесть 100. На машине, имевшей определенное число разрядов, об этом, впрочем, можно было не беспокоиться. Действительно, пусть на шестиразрядной машине выполняется вычитание 532-87. Тогда 000532+999913=1000445. Но самая первая единица потеряется сама собой, так как переносу из шестого разряда некуда деться.
Умножение также сводилось к сложению. Но поскольку в машине Паскаля слагаемое вводилось каждый раз заново, использовать ее для выполнения этой арифметической операции было крайне трудно.
Следующий этап в развитии вычислительной техники связан с именем знаменитого немецкого математика Лейбница. В 1672 году Лейбниц посетил голландского физика и изобретателя Гюйгенса и был свидетелем того, как много времени и сил отнимали у него разнообразные математические расчеты. Тогда у Лейбница и появилась мысль о создании арифмометра. «Это недостойно таких замечательных людей, — писал он, — подобно рабам, терять время на вычислительную работу, которую можно было бы доверить кому угодно при использовании машин». Однако создание такой машины потребовало от Лейбница всей его изобретательности. Его знаменитый 12-разрядный арифмометр появился только в 1694 году и обошелся в круглую сумму — 24000 талеров.
В основе механизма машины лежал изобретенный Лейбницем ступенчатый валик, представлявший собой цилиндр с нанесенными на нем зубцами различной длины. В 12-разрядном арифмометре таких валиков было 12 — по одному на каждый разряд числа.
Арифмометр состоял из двух частей — неподвижной и подвижной. В неподвижной помещался основной 12-разрядный счетчик и ступенчатый валик устройства ввода. Установочная часть этого устройства, состоявшая из восьми малых цифровых кругов, была расположена в подвижной части машины. В центре каждого круга располагалась ось, на которую под крышкой машины было насажено зубчатое колесо E, а поверх крышки установлена стрелка, которая вращалась вместе с осью. Конец стрелки мог быть установлен против любой цифры круга.
Ввод данных в машину осуществлялся с помощью особого механизма. Ступенчатый валик S был насажен на четырехгранную ось с нарезкой типа зубчатой рейки. Эта рейка входила в зацепление с десятизубым колесом E, на окружности которого были нанесены цифры 0, 1…9. Поворачивая это колесо так, чтобы в прорези крышки появилась та или другая цифра, перемещали ступенчатый валик параллельно оси зубчатого колеса F основного счетчика. Если после этого поворачивали валик на 360 градусов, то в зацепление с колесом F входили одна, две и т.д. наиболее длинные ступени, в зависимости от величины сдвига. Соответственно колесо F поворачивалось на 0, 1…9 частей полного оборота; также поворачивался диск или ролик R. Со следующим оборотом валика на счетчик вновь переносилось то же число.
Вычислительные машины Паскаля и Лейбница, так же как и некоторые другие, появившиеся в XVIII столетии, не получили широкого распространения. Они были сложны, дороги, да и общественная потребность в подобных машинах была еще не очень острой. Однако по мере развития производства и общества такая потребность стала ощущаться все больше и больше, особенно при составлении различных математических таблиц. Повсеместное распространение в Европе конца XVIII — начала XIX века получили арифметические, тригонометрические и логарифмические таблицы; банки и ссудные конторы применяли таблицы процентов, а страховые компании — таблицы смертности. Но совершенно исключительное значение (в особенности для Англии — «великой морской державы») имели астрономические и навигационные таблицы. Предсказания астрономов относительно положения небесных тел были в то время единственным средством, позволявшим морякам определять местонахождение их кораблей в открытом море. Эти таблицы входили в «Морской календарь», который выходил ежегодно. Каждое издание требовало огромного труда десятков и сотен счетчиков. Незачем говорить, как важно было избежать при составлении этих таблиц ошибок. Но ошибки все равно были. Сотни и даже тысячи неверных данных содержали также самые распространенные таблицы — логарифмические. Издатели этих таблиц были вынуждены содержать специальный штат корректоров, проверявших полученные вычисления. Но и это не спасало от ошибок.
Положение было настолько серьезным, что английское правительство — первое в мире — озаботилось о создании специальной вычислительной машины для составления подобных таблиц. Разработка машины (ее называют разностной) была поручена известному английскому математику и изобретателю Чарльзу Бэббиджу. В 1822 году была изготовлена действующая модель. Поскольку значение изобретения Бэббиджа, а также значение разработанного им способа машинных вычислений очень велики, следует подробнее остановиться на устройстве разностной машины.
Рассмотрим прежде на простом примере метод, предложенный Бэббиджем для составления таблиц. Допустим, требуется вычислить таблицу четвертых степеней членов натурального ряда 1, 2, 3…
Пусть такая таблица уже вычислена для некоторых членов ряда в колонке 1 — и полученные значения занесены в колонку 2. Вычтем из каждого последующего значения предыдущее. Получится последовательное значение первых разностей (колонка 3). Проделав ту же операцию с первыми разностями, получим вторые разности (колонка 4), третьи (колонка 5) и, наконец, четвертые (колонка 6). При этом четвертые разности оказываются постоянными: колонка 6 состоит из одного и того же числа 24. И это не случайность, а следствие важной теоремы: если функция (в данном случае это функция y(x)=x4, где x принадлежит множеству натуральных чисел) есть многочлен n-й степени, то в таблице с постоянным шагом его n-е разности будут постоянны.
Теперь легко догадаться, что получить требуемую таблицу можно исходя из первой строки с помощью сложения. Например, чтобы продолжить начатую таблицу еще на одну строку, нужно выполнить сложения:
156+24=180
590+180=770
1695+770=2465
4096+2465=6561
В разностной машине Бэббиджа применялись те же десятичные счетные колеса, что и у Паскаля. Для изображения числа использовались регистры, состоящие из набора таких колес. Каждой колонке таблицы, кроме 1, содержащей ряд натуральных чисел, соответствовал свой регистр; всего в машине их было семь, поскольку предполагалось вычислять функции с постоянными шестыми разностями. Каждый регистр состоял из 18 цифровых колес по числу разрядов изображаемого числа и нескольких дополнительных, используемых как счетчик числа оборотов для других вспомогательных целей.
Если все регистры машины хранили значения, соответствующие последней строке нашей таблицы, то для получения очередного значения функции в колонке 2 необходимо было последовательно выполнить число сложений, равное числу сложений имеющихся разностей. Сложение в разностной машине происходило в два этапа. Регистры, содержащие слагаемые, сдвигались так, чтобы произошло зацепление зубцов счетных колес. После этого колеса одного из регистров вращались в обратном направлении, пока каждое из них не доходило до нуля. Этот этап назывался фазой сложения. По окончании этого этапа в каждом разряде второго регистра получалась сумма цифр данного разряда, но пока еще без учета возможных переносов из разряда в разряд. Перенос происходил на следующем этапе, который назывался фазой переноса, и выполнялся так. При переходе каждого колеса в фазе сложения от 9 к 0 в этом разряде освобождалась специальная защелка. В фазе переноса все защелки возвращались на место специальными рычагами, которые одновременно поворачивали колесо следующего старшего разряда на один шаг. Каждый такой поворот мог в свою очередь вызвать в каком-то из разрядов переход от 9 к 0 и, значит, освобождение защелки, которая снова возвращалась на место, сделав перенос в следующий разряд. Таким образом, возвращение защелок на место происходило последовательно, начиная с младшего разряда регистра. Такая система получила название сложения с последовательным переносом. Все остальные арифметические операции выполнялись посредством сложения. При вычитании счетные колеса вращались в противоположную сторону (в отличие от машины Паскаля, разностная машина Бэббиджа позволяла это делать). Умножение сводилось к последовательному сложению, а деление — к последовательному вычитанию.
Описанный способ можно было применять не только для вычисления многочленов, но и других функций, например, логарифмических или тригонометрических, хотя в отличие от многочленов они не имеют строго постоянных старших разностей. Однако все эти функции можно представить (разложить) в виде бесконечного ряда, то есть многочлена простого вида, и свести вычисление их значений в любой точке к задаче, которую мы уже рассмотрели. Например, sin x и cos x можно представить в виде бесконечных многочленов:
sin x = x — x3/3! + x5/5! -… + (-1)n • x2n+1/(2n+1)! +…
cos x = 1 — x2/2! + x4/4! -… + (-1)n • x2n/(2n)! +…
Эти разложения истинны для всех значений функции от 0 до p/4 (p/4=3, 14/4=0, 785) с очень большой точностью. Для значений x, которые больше p/4, разложение имеет другой вид, но на каждом из этих участков тригонометрическая функция может быть представлена в виде какого-то многочлена. Количество пар слагаемых ряда, которые принимаются в расчет при вычислениях, зависит от точности, которую желают получить. Если, к примеру, требования к точности невелики, можно ограничиться двумя-четырьмя первыми слагаемыми ряда, а остальные отбросить. Но можно взять больше слагаемых и вычислить значение функции в любой точке с какой угодно точностью. (Заметим, что 2!=1•2=2; 3!=1•2•3=6; 4!=1•2•3•4=24 и т.д.) Так вычисление значений любой функции сводилось Бэббиджем к одной простой арифметической операции — сложению. Причем при переходе от одного участка функции к другому, когда требовалось сменить значение разности, разностная машина сама давала звонок (он звонил после выполнения определенного числа шагов вычисления).
Уже одно создание разностной машины обеспечило бы Бэббиджу почетное место в истории вычислительной техники. Однако он не остановился на этом и начал разрабатывать конструкцию гораздо более сложной — аналитической машины, которая стала прямой предшественницей всех современных ЭВМ. В чем же заключалась ее особенность? Дело в том, что разностная машина, по существу, оставалась еще только сложным арифмометром и требовала для своей работы постоянного присутствия человека, который держал в своей голове всю схему (программу) расчетов и направлял действия машины по тому или иному пути. Понятно, что это обстоятельство являлось определенным тормозом при выполнении расчетов. Около 1834 года Бэббиджу пришла в голову мысль: «Нельзя ли создать машину, которая была бы универсальным вычислителем, то есть выполняла бы все действия без вмешательства человека и в зависимости от полученного на определенном этапе решения сама выбирала бы дальнейший путь вычисления?»
По существу это означало создание программно-управляемой машины. Та программа, которая до этого находилась в голове оператора, теперь должна была быть разложена на совокупность простых и ясных команд, которые бы заранее вводились в машину и управляли ее работой. Никто и никогда еще не пытался создать подобной вычислительной машины, хотя сама идея программно-управляемых устройств уже была в то время реализована. В 1804 году французский изобретатель Жозеф Жаккар придумал ткацкий станок с программным управлением. Принцип его работы сводился к следующему. Ткань, как известно, представляет собой переплетение взаимно перпендикулярных нитей. Переплетение это осуществляется на ткацком станке, в котором нити основы (продольные) продеты через глазки — отверстия в проволочных петлях, а поперечные продергиваются через эту основу в определенном порядке при помощи челнока. При самом простом переплетении петли через одну поднимаются, соответственно приподнимаются и продетые через них нити основы. Между поднятыми и оставшимися на месте нитями образуется промежуток, в который челнок протягивает за собой нить утка (поперечную). После чего поднятые петли опускаются, а остальные приподнимаются. При более сложном узоре переплетения нити следовало приподнимать в других различных комбинациях. Опусканием и подниманием нитей основы вручную занимался ткач, что обычно отнимало много времени. После 30-летней настойчивой работы Жаккар изобрел механизм, позволявший автоматизировать движение петель в соответствии с заданным законом при помощи набора картонных карт с пробитыми в них отверстиями — перфокарт. В станке Жаккара глазки были связаны с длинными иглами, упирающимися в перфокарту. Встречая отверстия, иглы продвигались вверх, в результате чего связанные с ними глазки приподнимались. Если же иглы упирались в карты в том месте, где отверстий нет, они оставались на месте, удерживая так же связанные с ними глазки. Таким образом, промежуток для челнока, а тем самым и узор переплетения нитей определялся набором отверстий на соответствующих управляющих картах.
Этот же принцип управляющих перфокарт Бэббидж предполагал использовать в своей аналитической машине. Над ее устройством он работал в течение почти сорока лет: с 1834-го до конца своей жизни в 1871 году, но так и не смог ее закончить. Однако после него осталось более 200 чертежей машины и ее отдельных узлов, снабженных множеством подробных примечаний, объясняющих их работу. Все эти материалы представляют огромный интерес и являются одним из удивительнейших в истории техники примеров научного предвидения.
По мысли Бэббиджа, аналитическая машина должна была включать четыре основных блока.
Первое устройство, которое Бэббидж назвал «мельница», было предназначено для выполнения четырех основных арифметических действий. Второе устройство — «склад» — предназначалось для хранения чисел (исходных, промежуточных и окончательных результатов). Исходные числа направлялись в арифметическое устройство, а промежуточные и конечные результаты получались из него. Основным элементом двух этих блоков были регистры из десятичных счетных колес. Каждое из них могло устанавливаться в одном из десяти положений и таким образом «запоминать» один десятичный знак. Память машины должна была включать в себя 1000 регистров по 50 числовых колес в каждом, то есть в ней можно было хранить 1000 пятидесятизначных чисел. Скорость выполняемых вычислений напрямую зависела от скорости вращения цифровых колес. Бэббидж предполагал, что сложение двух 50-разрядных чисел будет занимать 1 секунду. Для переноса чисел из памяти в арифметическое устройство и обратно предполагалось использовать зубчатые рейки, которые должны были зацепляться с зубцами на колесах. Каждая рейка передвигалась до тех пор, пока колесо не занимало нулевое положение. Движение передавалось стержнями и связями в арифметическое устройство, где посредством другой рейки использовалось для перемещения в нужное положение одного из колес регистра. Базовой операцией аналитической машины, как и разностной, являлось сложение, а остальные сводились к ней. Для того чтобы вращать множество шестеренок, требовалось значительное внешнее усилие, которое Бэббидж рассчитывал получить за счет использования парового двигателя.
Третье устройство, управлявшее последовательностью операций, передачей чисел, над которыми производились операции, и выводом результатов, конструктивно представляло из себя два жаккаровых перфокарточных механизма. Перфокарты Бэббиджа отличались от перфокарт Жаккара, которыми управлялась только одна операция — подъем нити для получения нужного узора в процессе изготовления ткани. Управление работой аналитической машины включало различные виды операций, для каждой из которых требовался специальный вид перфокарт. Бэббидж выделил три основных вида перфокарт: операционные (или карты операций), переменные (или карты переменных) и числовые. Операционные перфокарты осуществляли управление машиной. Согласно выбитым на них командам происходило сложение, вычитание, умножение и деление чисел, находившихся в арифметическом устройстве.
Одной из наиболее дальновидных идей Бэббиджа было введение в совокупность команд, задаваемых последовательностью операционных перфокарт, команды условного перехода. Самого по себе программного управления (без использования условного перехода) было бы недостаточно для эффективной реализации сложной вычислительной работы. Линейная последовательность операций строго определена во всех пунктах. Это дорога известна во всех деталях до самого конца. Понятие «условный переход» означает переход вычислительной машины к другому участку программы, если предварительно выполняется некоторое условие. Имея возможность использовать команду условного перехода, составитель машинной программы был не обязан знать, по какой ступени расчета изменится признак, который оказывает влияние на выбор хода расчета. Применение условного перехода позволяло у каждой развилки дороги анализировать сложившуюся ситуацию и на основе этого выбирать тот или иной путь. Условные команды могли иметь самый различный вид: сравнение чисел, выборка требуемых численных значений, определение знака числа и т.п. Машина производила арифметические операции, сравнивала между собой полученные числа и сообразно с этим проводила дальнейшие операции. Таким образом, машина могла перейти к другой части программы, пропустить часть команд или вновь вернуться к выполнению какого-либо участка программы, то есть организовать цикл. Введение команды условного перехода знаменовало собой начало использования в машине логических, а не только вычислительных операций.
С помощью второго вида перфокарт — переменных (или, по терминологии Бэббиджа, «карт переменных») осуществлялась передача чисел между памятью и арифметическим устройством. На этих картах указывались не сами числа, а лишь номера регистров памяти, то есть ячеек для хранения одного числа. Регистры памяти Бэббидж называл «переменными», указывая этим, что содержание регистра меняется в зависимости от хранящегося в нем числа. Аналитическая машина Бэббиджа использовала три вида карт переменных: для передачи числа в арифметическое устройство с сохранением его далее в памяти, для аналогичной операции, но без сохранения в памяти, и для ввода числа в память. Они получили названия: 1) «нулевая карта» (число вызывается из регистра памяти, после чего в регистре устанавливается нулевое значение); 2) «сохраняющая карта» (число вызывается из памяти без изменения содержания регистра); 3) «получающая карта» (число передается из арифметического устройства в память и записывается в один из регистров). При работе машины на одну операционную перфокарту приходилось в среднем три карты переменных. Они указывали номера ячеек памяти (адреса, по современной терминологии), в которых хранились два исходных числа, и номер ячейки, куда записывать результат.
Числовые перфокарты представляли основной вид перфокарт аналитической машины. С их помощью осуществлялся ввод исходных чисел для решения некоторой задачи и новых данных, которые могли потребоваться по ходу вычислений.
После выполнения предложенных вычислений машина выбивала ответ на отдельную перфокарту. Эти перфокарты оператор складывал по порядку их номеров и в дальнейшем использовал в работе (они являлись как бы ее внешней памятью). Например, когда в ходе вычислений машине требовалось значение логарифма 2303, она показывала его в особом окошечке и давала звонок. Оператор находил нужную перфокарту со значением этого логарифма и вводил в машину. «Все карты, — писал Бэббидж, — однажды использованные и изготовленные для одной задачи, могут быль использованы для решения тех же задач с другими данными, поэтому нет необходимости готовить их во второй раз — они могут тщательно сохраняться для будущего использования; со временем машина будет иметь собственную библиотеку».
Четвертый блок был предназначен для приема исходных чисел и выдачи конечных результатов и представлял из себя несколько устройств, обеспечивающих операции ввода-вывода. Исходные числа вводились в машину оператором и поступали в ее запоминающее устройство, из которого извлекались и поступали на выход конечные результаты. Машина могла выводить ответ на перфокарте или печатать на бумаге.
В заключение следует отметить, что если разработка аппаратной части аналитической машины связана исключительно с именем Бэббиджа, то программирование решения задач на этой машине — с именем его хорошего друга — леди Адой Лавлейс, родной дочери великого английского поэта Байрона, которая горячо увлекалась математикой и великолепно разбиралась в сложных научных и технических проблемах. В 1842 году в Италии была напечатана статья молодого математика Менабреа с описанием аналитической машины Бэббиджа. В 1843 году леди Лавлейс перевела эту статью на английский язык, снабдив ее обширным и глубоким комментарием. Чтобы проиллюстрировать работу машины, леди Лавлейс приложила к статье составленную ею программу для вычисления чисел Бернулли. Ее комментарий по существу является первой в истории работой по программированию.
Аналитическая машина оказалась очень дорогим и сложным устройством. Английское правительство, поначалу финансировавшее работы Бэббиджа, вскоре отказало ему в помощи, поэтому он так и не смог завершить свой труд. Была ли оправдана сложность этой машины? Не во всем. Многие операции (особенно ввод-вывод чисел и передача их от одного устройства к другому) значительно упростились бы, если бы Бэббидж использовал электрические сигналы. Однако его машина была задумана как чисто механическое устройство без каких бы то ни было электрических элементов, что ставило ее изобретателя часто в очень трудное положение. Между тем электромеханическое реле, ставшее позже основным элементом вычислительных машин, в это время уже было изобретено: его придумали в 1831 году одновременно Генри и Сальваторе даль Негро.
Применение электромеханических реле в вычислительной технике ведет свою историю с изобретения американца Германа Голлерита, создавшего комплекс устройств, предназначенных для обработки большого объема данных (например, результатов переписи). Потребность в такой машине была очень велика. Например, результаты переписи 1880 года обрабатывались в США 7, 5 лет. Такой значительный срок объяснялся тем, что необходимо было отсортировать громадное количество карточек (по одной на каждого из 50 миллионов жителей) с очень большим — 210 рубрик — набором вариантов ответов на задаваемые в карточке вопросы. Об этих проблемах Голлерит знал не понаслышке — он сам был сотрудником Бюро цензов США — статистического учреждения, ведавшего проведением переписей населения и обработкой их результатов.
Много работая над сортировкой карточек, Голлерит пришел к мысли механизировать этот процесс. Сперва он заменил карточки перфокартами, то есть вместо карандашной пометки варианта ответа придумал пробивать отверстие. С этой целью он разработал специальную 80-колонную перфокарту, на которую в форме пробивок наносились все сведения об одном человеке, регистрируемые в ходе переписи. (Форма этой перфокарты не претерпела с тех пор существенных изменений.) Обычно для ответа на один вопрос использовалась одна полоска перфокарты, что позволяло фиксировать десять вариантов ответа (например, на вопрос о вероисповедании). В некоторых случаях (например, на вопрос о возрасте) можно было использовать две колонки, что давало сто вариантов ответа.
Вторая идея Голлерита была следствием первой — он создал первый в мире счетно-перфорационный комплекс, включавший в себя входной перфоратор (для пробивки отверстий) и табулятор с устройством для сортировки перфокарт. Перфорация осуществлялась вручную на пробойнике, состоявшем из чугунного корпуса с приемником для карты и собственно пробойника. Над приемником помещалась пластина с несколькими рядами отверстий; при нажиме рукояти пробойника над одним из них карта под пластинкой пробивалась нужным образом. Сложный пробойник пробивал на группе карт общие данные одним нажатием руки. Сортировочная машина представляла собой несколько ящиков с крышками. Карты продвигались вручную между набором пружинных штырей и резервуарами, наполненными ртутью. Когда штырь попадал в отверстие, он касался ртути и замыкал электрическую цепь. При этом приподнималась крышка определенного ящика, и оператор клал туда карту. Табулятор (или суммирующая машина) прощупывал отверстия на перфокартах, воспринимая их как соответствующие числа и подсчитывая их. Принцип его действия был аналогичен сортировочной машине и базировался на использовании электромеханического реле (в качестве них также применялись пружинные штыри и чашечки с ртутью). Когда стержни при движении перфокарт попадали через отверстия в чашечки с ртутью, электрическая цепь замыкалась, и электрический сигнал передавался на счетчик, добавлявший к имеющемуся в нем числу новую единицу. Каждый счетчик имел циферблат со стрелкой, которая перемещалась на единицу шкалы при обнаружении отверстия. Если в табуляторе было 80 счетчиков, он мог одновременно подсчитывать результаты по 8 вопросам (с десятью вариантами ответов на каждый из них). Для подсчета результатов по следующим 8 вопросам та же перфокарта вновь пропускалась через табулятор другим своим участком. За один прогон сортировалось до 1000 карточек в час.
Механизм переноса действовал только при одном направлении вращения счетных колес и не допускал выполнения операции вычитания вращением колес в обратную сторону. Поэтому Паскаль заменил вычитание сложением с десятичным дополнением. Пусть, например, необходимо из 532 вычесть 87. Метод дополнения приводит к действиям: 532-87=532-(100-13)=(532+13)-100=445. Нужно только не забывать вычесть 100. На машине, имевшей определенное число разрядов, об этом, впрочем, можно было не беспокоиться. Действительно, пусть на шестиразрядной машине выполняется вычитание 532-87. Тогда 000532+999913=1000445. Но самая первая единица потеряется сама собой, так как переносу из шестого разряда некуда деться.
Умножение также сводилось к сложению. Но поскольку в машине Паскаля слагаемое вводилось каждый раз заново, использовать ее для выполнения этой арифметической операции было крайне трудно.
Следующий этап в развитии вычислительной техники связан с именем знаменитого немецкого математика Лейбница. В 1672 году Лейбниц посетил голландского физика и изобретателя Гюйгенса и был свидетелем того, как много времени и сил отнимали у него разнообразные математические расчеты. Тогда у Лейбница и появилась мысль о создании арифмометра. «Это недостойно таких замечательных людей, — писал он, — подобно рабам, терять время на вычислительную работу, которую можно было бы доверить кому угодно при использовании машин». Однако создание такой машины потребовало от Лейбница всей его изобретательности. Его знаменитый 12-разрядный арифмометр появился только в 1694 году и обошелся в круглую сумму — 24000 талеров.
В основе механизма машины лежал изобретенный Лейбницем ступенчатый валик, представлявший собой цилиндр с нанесенными на нем зубцами различной длины. В 12-разрядном арифмометре таких валиков было 12 — по одному на каждый разряд числа.
Арифмометр состоял из двух частей — неподвижной и подвижной. В неподвижной помещался основной 12-разрядный счетчик и ступенчатый валик устройства ввода. Установочная часть этого устройства, состоявшая из восьми малых цифровых кругов, была расположена в подвижной части машины. В центре каждого круга располагалась ось, на которую под крышкой машины было насажено зубчатое колесо E, а поверх крышки установлена стрелка, которая вращалась вместе с осью. Конец стрелки мог быть установлен против любой цифры круга.
Ввод данных в машину осуществлялся с помощью особого механизма. Ступенчатый валик S был насажен на четырехгранную ось с нарезкой типа зубчатой рейки. Эта рейка входила в зацепление с десятизубым колесом E, на окружности которого были нанесены цифры 0, 1…9. Поворачивая это колесо так, чтобы в прорези крышки появилась та или другая цифра, перемещали ступенчатый валик параллельно оси зубчатого колеса F основного счетчика. Если после этого поворачивали валик на 360 градусов, то в зацепление с колесом F входили одна, две и т.д. наиболее длинные ступени, в зависимости от величины сдвига. Соответственно колесо F поворачивалось на 0, 1…9 частей полного оборота; также поворачивался диск или ролик R. Со следующим оборотом валика на счетчик вновь переносилось то же число.
Вычислительные машины Паскаля и Лейбница, так же как и некоторые другие, появившиеся в XVIII столетии, не получили широкого распространения. Они были сложны, дороги, да и общественная потребность в подобных машинах была еще не очень острой. Однако по мере развития производства и общества такая потребность стала ощущаться все больше и больше, особенно при составлении различных математических таблиц. Повсеместное распространение в Европе конца XVIII — начала XIX века получили арифметические, тригонометрические и логарифмические таблицы; банки и ссудные конторы применяли таблицы процентов, а страховые компании — таблицы смертности. Но совершенно исключительное значение (в особенности для Англии — «великой морской державы») имели астрономические и навигационные таблицы. Предсказания астрономов относительно положения небесных тел были в то время единственным средством, позволявшим морякам определять местонахождение их кораблей в открытом море. Эти таблицы входили в «Морской календарь», который выходил ежегодно. Каждое издание требовало огромного труда десятков и сотен счетчиков. Незачем говорить, как важно было избежать при составлении этих таблиц ошибок. Но ошибки все равно были. Сотни и даже тысячи неверных данных содержали также самые распространенные таблицы — логарифмические. Издатели этих таблиц были вынуждены содержать специальный штат корректоров, проверявших полученные вычисления. Но и это не спасало от ошибок.
Положение было настолько серьезным, что английское правительство — первое в мире — озаботилось о создании специальной вычислительной машины для составления подобных таблиц. Разработка машины (ее называют разностной) была поручена известному английскому математику и изобретателю Чарльзу Бэббиджу. В 1822 году была изготовлена действующая модель. Поскольку значение изобретения Бэббиджа, а также значение разработанного им способа машинных вычислений очень велики, следует подробнее остановиться на устройстве разностной машины.
Рассмотрим прежде на простом примере метод, предложенный Бэббиджем для составления таблиц. Допустим, требуется вычислить таблицу четвертых степеней членов натурального ряда 1, 2, 3…
Пусть такая таблица уже вычислена для некоторых членов ряда в колонке 1 — и полученные значения занесены в колонку 2. Вычтем из каждого последующего значения предыдущее. Получится последовательное значение первых разностей (колонка 3). Проделав ту же операцию с первыми разностями, получим вторые разности (колонка 4), третьи (колонка 5) и, наконец, четвертые (колонка 6). При этом четвертые разности оказываются постоянными: колонка 6 состоит из одного и того же числа 24. И это не случайность, а следствие важной теоремы: если функция (в данном случае это функция y(x)=x4, где x принадлежит множеству натуральных чисел) есть многочлен n-й степени, то в таблице с постоянным шагом его n-е разности будут постоянны.
Теперь легко догадаться, что получить требуемую таблицу можно исходя из первой строки с помощью сложения. Например, чтобы продолжить начатую таблицу еще на одну строку, нужно выполнить сложения:
156+24=180
590+180=770
1695+770=2465
4096+2465=6561
В разностной машине Бэббиджа применялись те же десятичные счетные колеса, что и у Паскаля. Для изображения числа использовались регистры, состоящие из набора таких колес. Каждой колонке таблицы, кроме 1, содержащей ряд натуральных чисел, соответствовал свой регистр; всего в машине их было семь, поскольку предполагалось вычислять функции с постоянными шестыми разностями. Каждый регистр состоял из 18 цифровых колес по числу разрядов изображаемого числа и нескольких дополнительных, используемых как счетчик числа оборотов для других вспомогательных целей.
Если все регистры машины хранили значения, соответствующие последней строке нашей таблицы, то для получения очередного значения функции в колонке 2 необходимо было последовательно выполнить число сложений, равное числу сложений имеющихся разностей. Сложение в разностной машине происходило в два этапа. Регистры, содержащие слагаемые, сдвигались так, чтобы произошло зацепление зубцов счетных колес. После этого колеса одного из регистров вращались в обратном направлении, пока каждое из них не доходило до нуля. Этот этап назывался фазой сложения. По окончании этого этапа в каждом разряде второго регистра получалась сумма цифр данного разряда, но пока еще без учета возможных переносов из разряда в разряд. Перенос происходил на следующем этапе, который назывался фазой переноса, и выполнялся так. При переходе каждого колеса в фазе сложения от 9 к 0 в этом разряде освобождалась специальная защелка. В фазе переноса все защелки возвращались на место специальными рычагами, которые одновременно поворачивали колесо следующего старшего разряда на один шаг. Каждый такой поворот мог в свою очередь вызвать в каком-то из разрядов переход от 9 к 0 и, значит, освобождение защелки, которая снова возвращалась на место, сделав перенос в следующий разряд. Таким образом, возвращение защелок на место происходило последовательно, начиная с младшего разряда регистра. Такая система получила название сложения с последовательным переносом. Все остальные арифметические операции выполнялись посредством сложения. При вычитании счетные колеса вращались в противоположную сторону (в отличие от машины Паскаля, разностная машина Бэббиджа позволяла это делать). Умножение сводилось к последовательному сложению, а деление — к последовательному вычитанию.
Описанный способ можно было применять не только для вычисления многочленов, но и других функций, например, логарифмических или тригонометрических, хотя в отличие от многочленов они не имеют строго постоянных старших разностей. Однако все эти функции можно представить (разложить) в виде бесконечного ряда, то есть многочлена простого вида, и свести вычисление их значений в любой точке к задаче, которую мы уже рассмотрели. Например, sin x и cos x можно представить в виде бесконечных многочленов:
sin x = x — x3/3! + x5/5! -… + (-1)n • x2n+1/(2n+1)! +…
cos x = 1 — x2/2! + x4/4! -… + (-1)n • x2n/(2n)! +…
Эти разложения истинны для всех значений функции от 0 до p/4 (p/4=3, 14/4=0, 785) с очень большой точностью. Для значений x, которые больше p/4, разложение имеет другой вид, но на каждом из этих участков тригонометрическая функция может быть представлена в виде какого-то многочлена. Количество пар слагаемых ряда, которые принимаются в расчет при вычислениях, зависит от точности, которую желают получить. Если, к примеру, требования к точности невелики, можно ограничиться двумя-четырьмя первыми слагаемыми ряда, а остальные отбросить. Но можно взять больше слагаемых и вычислить значение функции в любой точке с какой угодно точностью. (Заметим, что 2!=1•2=2; 3!=1•2•3=6; 4!=1•2•3•4=24 и т.д.) Так вычисление значений любой функции сводилось Бэббиджем к одной простой арифметической операции — сложению. Причем при переходе от одного участка функции к другому, когда требовалось сменить значение разности, разностная машина сама давала звонок (он звонил после выполнения определенного числа шагов вычисления).
Уже одно создание разностной машины обеспечило бы Бэббиджу почетное место в истории вычислительной техники. Однако он не остановился на этом и начал разрабатывать конструкцию гораздо более сложной — аналитической машины, которая стала прямой предшественницей всех современных ЭВМ. В чем же заключалась ее особенность? Дело в том, что разностная машина, по существу, оставалась еще только сложным арифмометром и требовала для своей работы постоянного присутствия человека, который держал в своей голове всю схему (программу) расчетов и направлял действия машины по тому или иному пути. Понятно, что это обстоятельство являлось определенным тормозом при выполнении расчетов. Около 1834 года Бэббиджу пришла в голову мысль: «Нельзя ли создать машину, которая была бы универсальным вычислителем, то есть выполняла бы все действия без вмешательства человека и в зависимости от полученного на определенном этапе решения сама выбирала бы дальнейший путь вычисления?»
По существу это означало создание программно-управляемой машины. Та программа, которая до этого находилась в голове оператора, теперь должна была быть разложена на совокупность простых и ясных команд, которые бы заранее вводились в машину и управляли ее работой. Никто и никогда еще не пытался создать подобной вычислительной машины, хотя сама идея программно-управляемых устройств уже была в то время реализована. В 1804 году французский изобретатель Жозеф Жаккар придумал ткацкий станок с программным управлением. Принцип его работы сводился к следующему. Ткань, как известно, представляет собой переплетение взаимно перпендикулярных нитей. Переплетение это осуществляется на ткацком станке, в котором нити основы (продольные) продеты через глазки — отверстия в проволочных петлях, а поперечные продергиваются через эту основу в определенном порядке при помощи челнока. При самом простом переплетении петли через одну поднимаются, соответственно приподнимаются и продетые через них нити основы. Между поднятыми и оставшимися на месте нитями образуется промежуток, в который челнок протягивает за собой нить утка (поперечную). После чего поднятые петли опускаются, а остальные приподнимаются. При более сложном узоре переплетения нити следовало приподнимать в других различных комбинациях. Опусканием и подниманием нитей основы вручную занимался ткач, что обычно отнимало много времени. После 30-летней настойчивой работы Жаккар изобрел механизм, позволявший автоматизировать движение петель в соответствии с заданным законом при помощи набора картонных карт с пробитыми в них отверстиями — перфокарт. В станке Жаккара глазки были связаны с длинными иглами, упирающимися в перфокарту. Встречая отверстия, иглы продвигались вверх, в результате чего связанные с ними глазки приподнимались. Если же иглы упирались в карты в том месте, где отверстий нет, они оставались на месте, удерживая так же связанные с ними глазки. Таким образом, промежуток для челнока, а тем самым и узор переплетения нитей определялся набором отверстий на соответствующих управляющих картах.
Этот же принцип управляющих перфокарт Бэббидж предполагал использовать в своей аналитической машине. Над ее устройством он работал в течение почти сорока лет: с 1834-го до конца своей жизни в 1871 году, но так и не смог ее закончить. Однако после него осталось более 200 чертежей машины и ее отдельных узлов, снабженных множеством подробных примечаний, объясняющих их работу. Все эти материалы представляют огромный интерес и являются одним из удивительнейших в истории техники примеров научного предвидения.
По мысли Бэббиджа, аналитическая машина должна была включать четыре основных блока.
Первое устройство, которое Бэббидж назвал «мельница», было предназначено для выполнения четырех основных арифметических действий. Второе устройство — «склад» — предназначалось для хранения чисел (исходных, промежуточных и окончательных результатов). Исходные числа направлялись в арифметическое устройство, а промежуточные и конечные результаты получались из него. Основным элементом двух этих блоков были регистры из десятичных счетных колес. Каждое из них могло устанавливаться в одном из десяти положений и таким образом «запоминать» один десятичный знак. Память машины должна была включать в себя 1000 регистров по 50 числовых колес в каждом, то есть в ней можно было хранить 1000 пятидесятизначных чисел. Скорость выполняемых вычислений напрямую зависела от скорости вращения цифровых колес. Бэббидж предполагал, что сложение двух 50-разрядных чисел будет занимать 1 секунду. Для переноса чисел из памяти в арифметическое устройство и обратно предполагалось использовать зубчатые рейки, которые должны были зацепляться с зубцами на колесах. Каждая рейка передвигалась до тех пор, пока колесо не занимало нулевое положение. Движение передавалось стержнями и связями в арифметическое устройство, где посредством другой рейки использовалось для перемещения в нужное положение одного из колес регистра. Базовой операцией аналитической машины, как и разностной, являлось сложение, а остальные сводились к ней. Для того чтобы вращать множество шестеренок, требовалось значительное внешнее усилие, которое Бэббидж рассчитывал получить за счет использования парового двигателя.
Третье устройство, управлявшее последовательностью операций, передачей чисел, над которыми производились операции, и выводом результатов, конструктивно представляло из себя два жаккаровых перфокарточных механизма. Перфокарты Бэббиджа отличались от перфокарт Жаккара, которыми управлялась только одна операция — подъем нити для получения нужного узора в процессе изготовления ткани. Управление работой аналитической машины включало различные виды операций, для каждой из которых требовался специальный вид перфокарт. Бэббидж выделил три основных вида перфокарт: операционные (или карты операций), переменные (или карты переменных) и числовые. Операционные перфокарты осуществляли управление машиной. Согласно выбитым на них командам происходило сложение, вычитание, умножение и деление чисел, находившихся в арифметическом устройстве.
Одной из наиболее дальновидных идей Бэббиджа было введение в совокупность команд, задаваемых последовательностью операционных перфокарт, команды условного перехода. Самого по себе программного управления (без использования условного перехода) было бы недостаточно для эффективной реализации сложной вычислительной работы. Линейная последовательность операций строго определена во всех пунктах. Это дорога известна во всех деталях до самого конца. Понятие «условный переход» означает переход вычислительной машины к другому участку программы, если предварительно выполняется некоторое условие. Имея возможность использовать команду условного перехода, составитель машинной программы был не обязан знать, по какой ступени расчета изменится признак, который оказывает влияние на выбор хода расчета. Применение условного перехода позволяло у каждой развилки дороги анализировать сложившуюся ситуацию и на основе этого выбирать тот или иной путь. Условные команды могли иметь самый различный вид: сравнение чисел, выборка требуемых численных значений, определение знака числа и т.п. Машина производила арифметические операции, сравнивала между собой полученные числа и сообразно с этим проводила дальнейшие операции. Таким образом, машина могла перейти к другой части программы, пропустить часть команд или вновь вернуться к выполнению какого-либо участка программы, то есть организовать цикл. Введение команды условного перехода знаменовало собой начало использования в машине логических, а не только вычислительных операций.
С помощью второго вида перфокарт — переменных (или, по терминологии Бэббиджа, «карт переменных») осуществлялась передача чисел между памятью и арифметическим устройством. На этих картах указывались не сами числа, а лишь номера регистров памяти, то есть ячеек для хранения одного числа. Регистры памяти Бэббидж называл «переменными», указывая этим, что содержание регистра меняется в зависимости от хранящегося в нем числа. Аналитическая машина Бэббиджа использовала три вида карт переменных: для передачи числа в арифметическое устройство с сохранением его далее в памяти, для аналогичной операции, но без сохранения в памяти, и для ввода числа в память. Они получили названия: 1) «нулевая карта» (число вызывается из регистра памяти, после чего в регистре устанавливается нулевое значение); 2) «сохраняющая карта» (число вызывается из памяти без изменения содержания регистра); 3) «получающая карта» (число передается из арифметического устройства в память и записывается в один из регистров). При работе машины на одну операционную перфокарту приходилось в среднем три карты переменных. Они указывали номера ячеек памяти (адреса, по современной терминологии), в которых хранились два исходных числа, и номер ячейки, куда записывать результат.
Числовые перфокарты представляли основной вид перфокарт аналитической машины. С их помощью осуществлялся ввод исходных чисел для решения некоторой задачи и новых данных, которые могли потребоваться по ходу вычислений.
После выполнения предложенных вычислений машина выбивала ответ на отдельную перфокарту. Эти перфокарты оператор складывал по порядку их номеров и в дальнейшем использовал в работе (они являлись как бы ее внешней памятью). Например, когда в ходе вычислений машине требовалось значение логарифма 2303, она показывала его в особом окошечке и давала звонок. Оператор находил нужную перфокарту со значением этого логарифма и вводил в машину. «Все карты, — писал Бэббидж, — однажды использованные и изготовленные для одной задачи, могут быль использованы для решения тех же задач с другими данными, поэтому нет необходимости готовить их во второй раз — они могут тщательно сохраняться для будущего использования; со временем машина будет иметь собственную библиотеку».
Четвертый блок был предназначен для приема исходных чисел и выдачи конечных результатов и представлял из себя несколько устройств, обеспечивающих операции ввода-вывода. Исходные числа вводились в машину оператором и поступали в ее запоминающее устройство, из которого извлекались и поступали на выход конечные результаты. Машина могла выводить ответ на перфокарте или печатать на бумаге.
В заключение следует отметить, что если разработка аппаратной части аналитической машины связана исключительно с именем Бэббиджа, то программирование решения задач на этой машине — с именем его хорошего друга — леди Адой Лавлейс, родной дочери великого английского поэта Байрона, которая горячо увлекалась математикой и великолепно разбиралась в сложных научных и технических проблемах. В 1842 году в Италии была напечатана статья молодого математика Менабреа с описанием аналитической машины Бэббиджа. В 1843 году леди Лавлейс перевела эту статью на английский язык, снабдив ее обширным и глубоким комментарием. Чтобы проиллюстрировать работу машины, леди Лавлейс приложила к статье составленную ею программу для вычисления чисел Бернулли. Ее комментарий по существу является первой в истории работой по программированию.
Аналитическая машина оказалась очень дорогим и сложным устройством. Английское правительство, поначалу финансировавшее работы Бэббиджа, вскоре отказало ему в помощи, поэтому он так и не смог завершить свой труд. Была ли оправдана сложность этой машины? Не во всем. Многие операции (особенно ввод-вывод чисел и передача их от одного устройства к другому) значительно упростились бы, если бы Бэббидж использовал электрические сигналы. Однако его машина была задумана как чисто механическое устройство без каких бы то ни было электрических элементов, что ставило ее изобретателя часто в очень трудное положение. Между тем электромеханическое реле, ставшее позже основным элементом вычислительных машин, в это время уже было изобретено: его придумали в 1831 году одновременно Генри и Сальваторе даль Негро.
Применение электромеханических реле в вычислительной технике ведет свою историю с изобретения американца Германа Голлерита, создавшего комплекс устройств, предназначенных для обработки большого объема данных (например, результатов переписи). Потребность в такой машине была очень велика. Например, результаты переписи 1880 года обрабатывались в США 7, 5 лет. Такой значительный срок объяснялся тем, что необходимо было отсортировать громадное количество карточек (по одной на каждого из 50 миллионов жителей) с очень большим — 210 рубрик — набором вариантов ответов на задаваемые в карточке вопросы. Об этих проблемах Голлерит знал не понаслышке — он сам был сотрудником Бюро цензов США — статистического учреждения, ведавшего проведением переписей населения и обработкой их результатов.
Много работая над сортировкой карточек, Голлерит пришел к мысли механизировать этот процесс. Сперва он заменил карточки перфокартами, то есть вместо карандашной пометки варианта ответа придумал пробивать отверстие. С этой целью он разработал специальную 80-колонную перфокарту, на которую в форме пробивок наносились все сведения об одном человеке, регистрируемые в ходе переписи. (Форма этой перфокарты не претерпела с тех пор существенных изменений.) Обычно для ответа на один вопрос использовалась одна полоска перфокарты, что позволяло фиксировать десять вариантов ответа (например, на вопрос о вероисповедании). В некоторых случаях (например, на вопрос о возрасте) можно было использовать две колонки, что давало сто вариантов ответа.
Вторая идея Голлерита была следствием первой — он создал первый в мире счетно-перфорационный комплекс, включавший в себя входной перфоратор (для пробивки отверстий) и табулятор с устройством для сортировки перфокарт. Перфорация осуществлялась вручную на пробойнике, состоявшем из чугунного корпуса с приемником для карты и собственно пробойника. Над приемником помещалась пластина с несколькими рядами отверстий; при нажиме рукояти пробойника над одним из них карта под пластинкой пробивалась нужным образом. Сложный пробойник пробивал на группе карт общие данные одним нажатием руки. Сортировочная машина представляла собой несколько ящиков с крышками. Карты продвигались вручную между набором пружинных штырей и резервуарами, наполненными ртутью. Когда штырь попадал в отверстие, он касался ртути и замыкал электрическую цепь. При этом приподнималась крышка определенного ящика, и оператор клал туда карту. Табулятор (или суммирующая машина) прощупывал отверстия на перфокартах, воспринимая их как соответствующие числа и подсчитывая их. Принцип его действия был аналогичен сортировочной машине и базировался на использовании электромеханического реле (в качестве них также применялись пружинные штыри и чашечки с ртутью). Когда стержни при движении перфокарт попадали через отверстия в чашечки с ртутью, электрическая цепь замыкалась, и электрический сигнал передавался на счетчик, добавлявший к имеющемуся в нем числу новую единицу. Каждый счетчик имел циферблат со стрелкой, которая перемещалась на единицу шкалы при обнаружении отверстия. Если в табуляторе было 80 счетчиков, он мог одновременно подсчитывать результаты по 8 вопросам (с десятью вариантами ответов на каждый из них). Для подсчета результатов по следующим 8 вопросам та же перфокарта вновь пропускалась через табулятор другим своим участком. За один прогон сортировалось до 1000 карточек в час.