А.П. Ершов, М.Р. Шура-Бура. Становление программирования в СССР (начальное развитие)
Препринт ВЦ СО АН СССР
№12, 1976 год
Р е з ю м е
В этом предварительном историческом исследовании, проведенном на основе публикаций, а также личных воспоминаний и архивов авторов, делается попытка проанализировать первые пятнадцать лет становления и развития программирования в СССР - как человеческой практики, так и научной дисциплины. После краткого описания контекста, в котором происходило развитие, и анализа исходного знания авторы показывают, что многие важные разделы программирования - прежде всего общая методология и теория, а также методы трансляции - развивались в СССР под воздействием мощных собственных творческих импульсов.
Исследование подготовлено для трудов международной научной конференции по истории вычислительного дела, состоявшейся в Лос-Аламосе (США) с 10 по 15 июня 1976 года.
Введение
История становления и развития программирования в СССР неотделима от остальных разделов вычислительного дела. Чем ближе к истокам, тем сильнее связь и зависимость научной дисциплины от общего контекста и смежных направлений. Собственно говоря, проследить рождение научной дисциплины или профессиональной человеческой деятельности - это значит усмотреть моменты формирования водоразделов и внутренней структуры. Сознавая эту неразрывность, авторы должны подчеркнуть предварительный характер и определенную неполноту данного исследования.
Во-первых, смежные вопросы, в частности, развитие вычислительного оборудования и численных методов, затронуты очень кратко. Мы даже и не пытались вскрыть внутреннюю логику их развития, и их история еще ждет своих авторов. Идентифицированы лишь некоторые стороны этих смежных дисциплин в той степени, в какой они были существенны для развития программирования.
Во-вторых, авторы работали, в основном, с публикациями и, в меньшей степени, с архивными материалами, ограничившись, главным образом, личными архивами и воспоминаниями. Некоторые публикации, в особенности, зарубежные, были авторам недоступны и поэтому в ссылках на них возможны некоторые неточности, за которые авторы заранее приносят свои извинения.
В-третьих, авторы сознательно ограничили себя первыми пятнадцатью годами развития программирования, обрывая повествование 1963-м годом, когда заработали первые трансляторы с Алгола 60. С одной стороны, программирование в СССР сформировало свой современный облик и приобрело необходимую полноту именно в последние 13 лет. С другой стороны, его развитие в эти последние годы было уже гораздо менее специфично и неотделимо от сложившейся к этому времени мировой научно-технической тенденции. В первые же пятнадцать лет, как увидит читатель, оно развивалось в значительной степени под воздействием собственных внутренних импульсов, ассимилируя интуицию и кругозор зрелых математиков, умноженные на энергию и энтузиазм молодого поколения первых новообразованных программистов.
В то же время не надо тратить много слов, чтобы обосновать решимость авторов выступить перед научной общественностью с этим предварительным исследованием. Преодолеть дистанцию можно, только начав с первого шага. Кроме того, история научной дисциплины - это часть ее самоутверждения, и авторы, посвятившие свою жизнь программированию, не в силах остаться в стороне от этого процесса. Наконец, выполнение подобной работы - это единственная возможность, оторвавшись от суетной повседневности, вспомнить как выдающихся ученых и инженеров, так и рядовых сотрудников, которые своим творческим трудом построили здание, в котором мы живем. К сожалению, некоторые из них оставили нас навсегда и не смогут услышать обращенные к ним слова признательности.
В ходе изложения авторам придется ссылаться на собственные работы. В таких случаях всегда возникает психологическая проблема самоидентификации. Желая, с одной стороны, освободиться от элемента персонализации, связываемой с местоимениями "я" и "мы", а с другой - избежать снобистского упоминания о себе как о постороннем человеке, авторы будут ссылаться на самих себя с помощью идентификаторов АЕ и ШБ соответственно, скрываясь за общим именем "авторы", когда речь идет о данной работе.
Хотя авторы зачастую и цитируют оригинальные работы, исследование в целом не считает своей главной целью реставрацию прошлого. Всюду, где это кажется уместным, научные идеи и результаты формулируются с использованием современной терминологии и интерпретируются в ретроспективном плане. Хотя в таком анализе возможен субъективизм, авторам все же представляется более интересным при изложении не уклоняться от обсуждения связи разных временных слоев развития.
Авторы будут благодарны каждому, кто пожелает обратить внимание на неточности или упущения, которые могут обнаружиться в этой работе.
1. Предыстория (1946-1949)
Вторая мировая война приостановила в СССР ряд научных исследований и проектов в области создания, как тогда говорили, математической техники. В то же время в СССР существовала непрерываемая традиция, идущая от П.Л. Чебышева, внимательного отношения и научного интереса к прикладной математике и методам вычислений. В годы становления советской науки она получила особое развитие в научной и общественной деятельности академика А.Н. Крылова. Потребности военного времени содействовали выполнению серии прикладных работ, требовавших разработки численных методов и способов автоматизации вычислений, прежде всего для управления стрельбой. Потребности радиолокации и радиосвязи создали предпосылки для освоения высокочастотной импульсной техники.
Это противоречивое положение было выразительно представлено в тематическом выпуске журнала "Успехи математических наук" (I, №5-6, 1946), начавшем регулярно публиковаться с первого послевоенного года [1]. Выпуск содержал две обзорных оригинальных статьи, подготовленных еще до войны, и две переводных, одна из которых (дифференциальный анализатор Буша) оказала заметное влияние на специалистов. Никакого намека ни на электронную вычислительную технику, ни на концепцию автоматических вычислительных машин с программным управлением этот выпуск даже и не содержал. В то же время вступительная статья Н.Е. Кобринского и Л.А. Люстерника начиналась замечательным предсказанием о роли вычислительной техники, которое даже в наше время могло бы в качестве постановки проблемы открывать любую вычислительную конференцию. Представляется необходимым воздать должное проницательности авторов статьи и привести выдержки из этой постановки проблемы ([1], 4-6).
"... Современная вычислительная практика весьма разнообразна, и соответственно этому весьма разнообразны и технические средства, в ней применяемые.
Прежде всего, укажем на "повседневную" вычислительную практику бухгалтерии, учета, статистики, рядового технического расчета. Математические задачи здесь большей частью несложны - в основном арифметические действия. Но количество людей, занятых их производством, огромно. : В настоящее время производство счетных приборов, обслуживающих эту массовую практику, является в ряде стран отраслью промышленности.
... Особым видом массовой вычислительной практики являются расчеты, :выполняемые в боевой обстановке. Здесь по понятным причинам особую роль играет быстрота расчета, иногда отнюдь не элементарного : Широкое применение подобные счетно-решающие устройства получают и в мирной технике, например, в навигации, в автоматизированном управлении сложными агрегатами и т.д.
Наконец, имеется область "кабинетных вычислений", квалифицированных и трудоемких расчетов, связанных с решением научных и сложных технических задач. Здесь постоянно приходится решать разнообразные задачи, часто новые в смысле своей математической постановки (системы линейных и обыкновенных дифференциальных уравнений, краевые и граничные задачи уравнений математической физики) :
Развитие науки и техники ставит все новые задачи перед вычислительной математикой. Еще недавно интегральные уравнения были изысканной областью теоретического анализа, теперь это - повседневное орудие расчета. Увеличение скоростей самолетов : потребовало решения граничных задач и для уравнения смешанного эллиптико-гиперболического типа. Развитие ракетных двигателей сделало актуальными расчеты траекторий тела с переменной массой. Концепции современной теоретической физики придают особое значение задачам нахождения собственных значений и функций разных операторов:
Актуальные потребности практики и науки привели, таким образом, к созданию новой отрасли техники - конструированию и производству "счетно-решающих устройств", т.е. приборов и машин для решения математических задач.
Появление этих технических средств ставит по-новому задачи вычислительной математики. Алгоритм решения задачи, ориентированный на те или иные технические средства, не всегда должен быть повторением алгоритма, принятого для ее решения ручным способом : Технические средства современной вычислительной математики позволяют "брать в лоб" такие задачи, которые ранее считались практически неразрешимыми и требовали обходных путей : Современная "машинная математика" превратилась в мощное орудие естественно-научных и технических дисциплин, увлекательную комплексную область, требующую совместной работы математиков, техников разных специальностей - механиков, электриков, оптиков и т.д. и физиков.
... Успехи "машинной математики" последнего времени связаны в значительной степени также с развитием автоматики. В современных больших математических машинах мы видим автоматическое управление сложным агрегатом, заставляющее отдельные его части выполнять в заданной последовательности заданные операции, сложные передачи показаний с одних частей машины на другие, регулирование синхронности происходящих процессов и т.д. Можно сказать, что "математическая техника" является экспериментальной базой для автоматики вообще. Тем самым ее достижения имеют большой общетехнический интерес."
Этот дальновидный взгляд на вычислительную технику сложился в стенах Математического института АН СССР (МИАН СССР). Институт в то время был не только средоточием первоклассных исследований в разделах теоретической математики, но и был весьма органически связан с широким кругом проблем прикладной математики, в частности, в связи с возложенными на Академию наук государственными заданиями по важным прикладным исследованиям и расчетам, связанным с созданием новой техники. Этой стороной деятельности МИАН руководил академик М.В. Келдыш, ставший к этому времени заместителем директора Института, академика И.М. Виноградова. Непосредственные вычислительные и машинные аспекты прикладной математики изучались в то время в отделе приближенных вычислений, который возглавлял член-корреспондент АН СССР Л.А. Люстерник.
Идея программно-управляемой автоматической цифровой вычислительной машины пришла в СССР из Соединенных Штатов в 1947 году. В этом году М.Л. Быховский, бывший в те годы чуть ли не монопольным переводчиком англоязычной литературы по вычислительной технике, опубликовал в УМН короткую информационную заметку [2], в которой на основе публикаций [3-5] известил о машинах МАРК I и ЭНИАК. Аналогичная более поздняя статья Хартри [6] и более подробное описание МАРКа I [7] появились в УМН в русском переводе в 1948 г., соответственно, в [8] и [9]. В заметке [2] не было каких бы то ни было оценочных комментариев к материалу, а ее название скорее подчеркивало преемственность в развитии счетно-аналитических машин, нежели выработку новой концепции автоматических вычислителей.
Материалы, которые принято считать основополагающими по логической структуре электронных вычислительных цифровых машин с хранимой программой [10-13], в то время (а в оригинальных изданиях и сейчас) были недоступны в СССР. (Правда, на трудную доступность этих исторических документов сетовали и авторы обзоров [16] и [20], бывшие в США.) Однако в течение 1947-1948 гг. в таких доступных журналах, как
- Review of Scientific Instruments
- Electronics
- Proceedings of the IRE
- Mathematical Tables and other Aids to Computation
- Journal of Franklin Institute,
а также в ряде других появилось изрядное число публикаций "второго эшелона", содержащих достаточное количество научной информации. С некоторым запозданием в СССР также стали доступны труды известного симпозиума 1947 года в Гарвардском университете [14]. На основе этих материалов в майском - июньском выпуске УМН 1949 г. появилась обширная обзорная статья М.Л. Быховского под названием "Основы электронных математических машин дискретного счета" [15]. Статья, судя по всему, из-за большой спешки, а также в связи с ограничениями на объем не содержала ни списка источников, ни описания конкретных машин. Этот, очень деловой, обзор содержал, главным образом, описание инженерных принципов реализации отдельных узлов ЭВМ и был во многом аналогичен первому монографическому описанию ЭВМ "Быстродействующие вычислительные машины" под редакцией У. Стифлера, подготовленному в США в 1950 г. [16] и изданному в СССР в русском переводе в 1952 г. [17].
Указанная монография вместе с небольшим разделом (глава V) книги Ф. Муррея "Теория математических машин" [18], вышедшей в русском переводе в 1949 г. [19], и широко известной в Европе обзорной статьей Г. Рутисхаузера, А. Шпайзера и Э. Штифеля [20], также переведенной на русский язык и изданной в 1952 г. [21], по-видимому, замыкает ту совокупность исходного знания, которым были вооружены советские специалисты, начавшие в первую послевоенную пятилетку работу в области электронной вычислительной техники.
Возвращаясь к публикации Быховского [15], представляет, как нам кажется, интерес процитировать первое на русском языке изложение принципов программного управления ([15], стр. 110-111):
"... Решение на машине некоторой задачи требует разложения ее в детальную последовательность арифметических и логических действий, причем эта последовательность должна быть записана в виде длинного ряда "команд", которые тем или другим способом вводятся в машину. Каждая такая "команда" в общем случае должна содержать в себе следующие сведения: 1) откуда взять числа, над которыми следует произвести арифметическую операцию, 2) какую операцию следует произвести, 3) куда передать результат и 4) откуда взять следующую команду.
... Команды записываются в кодированном виде посредством обычных цифр (чисел), чаще всего по двоичной системе. Эти числа-команды вводятся в машину при помощи перфокарт (или магнитных лент), откуда они поступают в другие блоки памяти, в частности, в устройства электронной памяти, где с ними оперируют, как с обычными числами. Из электронной памяти данная команда поступает в блок центрального управления, где она дешифрируется в виде включения определенных устройств, выполняющих эту команду. Кроме того, данная команда указывает еще место, где находится следующая команда. В блоке центрального управления указанное обстоятельство дешифрируется в виде подключения к блоку управления в следующем цикле того элемента памяти, где эта следующая команда находится. Таким образом, машина автоматически выполняет любую заданную последовательность. Следует отметить, что данная последовательность команд, необходимая для решения определенной задачи, может быть значительно упрощена, если строить ее по принципу получения новых команд путем логических операций над старыми, а такие операции можно свести к арифметическим действиям над числами, представляющими команды. Вследствие этого в современных машинах числа-команды подаются из устройства памяти не только в блок центрального управления, но и в счетные цепи.
Упрощение и рациональное построение серии программных команд для решения тех или иных задач представляет собой актуальнейшую задачу современных универсальных машин дискретного счета :"
В 1948 году проблемы развития вычислительной техники в СССР стали общегосударственной задачей. Проектирование и производство вычислительных средств были идентифицированы как самостоятельное научно-техническое направление. В Академии наук был создан новый Институт точной механики и вычислительной техники (ИТМ и ВТ). Его возглавил известный специалист в области машин и механизмов академик Н.Г. Бруевич - ученый широкого кругозора, бывший в то время Академиком-секретарем Президиума Академии наук СССР. Этот институт был создан на основе уже существовавших в то время в разных организациях Академии наук научных групп и подразделений, имевших отношение к проблеме механизации вычислений и создания математических инструментов. В частности, из МИАН в ИТМ и ВТ был переведен отдел приближенных вычислений во главе с Л.А. Люстерником. В Министерстве приборостроения и средств автоматизации СССР было создано специальное конструкторское бюро для проектирования электронного вычислительного оборудования. Его возглавил М.А. Лесечко - инженер, хорошо зарекомендовавший себя в решении задач создания новой техники в годы войны и обладающий выдающимися организаторскими способностями.
Примерно в это же время в Киеве директор Института электротехники Академии наук Украины С.А. Лебедев начал инициативные исследования по созданию электронных вычислительных машин. Его начальные идеи лежали в русле, проложенном разработкой ЭНИАКа. С самого начала особенностью интересов С.А. Лебедева было создание быстродействующих цифровых элементов и счетных цепей. Большую поддержку инициативе С.А. Лебедева оказал академик М.А. Лаврентьев, тоже работавший в то время в Киеве. В полуразрушенном городе в то время было очень трудно с производственными площадями, и М.А. Лаврентьев, проводя исследования и эксперименты, направленные на создание теории кумулятивного взрыва, предоставил несколько комнат для сотрудников С.А. Лебедева в старом здании бывшего монастыря в Феофании, под Киевом. Именно там в 1951 году заработала "первая в СССР и континентальной Европе" [22] ЭВМ, получившая впоследствии название МЭСМ (Малая Электронная Счетная Машина) Академии наук УССР.
2. Формирование начального знания (1950-1953)
Организованная научная работа в области программирования в СССР началась в 1950 году. Её инициатором явился Л.А. Люстерник, организовавший в этом году в отделе приближенных вычислений ИТМ и ВТ специальный семинар по программированию. ШБ был одним из сотрудников отдела и участником семинара. Работа протекала параллельно с проектированием машины БЭСМ и завершилась написанием одной из первых в мире монографий, специально посвященной вопросам программирования [23]. Книга была частью отчетного описания машины БЭСМ, опубликованного в нескольких томах в 1952 году. Поскольку на этой книге выросло все первое поколение советских программистов, имеет смысл остановиться на ее содержании более подробно.
В качестве источников, имеющих наиболее прямое отношение к предмету исследования, книга ссылается на перевод книги Муррея [19], на монографию под редакцией Стиффлера [16] и на обзор Рутисхаузера, Шпайзера и Штифеля [20].
Книга Муррея была в основном посвящена старой технике, но в небольшой главе, посвященной ЭВМ, содержала со ссылкой на [13] выразительный пример программирования циклического процесса со счетом индекса для организации заданного числа повторений и с использованием текущей разности для организации итерационного цикла.
В книге Стиффлера довольно подробно рассматривались арифметические основы ЭВМ, давалось общее описание принципа программного управления и была приведена одноадресная система команд со ссылкой на [12].
Обзор [20] во многом повторял содержание [16], но содержал в дополнение к нему изложение некоторых глав еще одной основополагающей работы Голдстайна и фон Неймана [24] (понятие блок-схемы как средства для наглядного представления ветвей и циклов программы, понятие параметра цикла и зависимости адресов от параметра), рассматривал различные системы команд (от одно- до четырехадресных систем) и впервые упоминал об индекс-регистре (i-регистр в МАРКе III). Не менее важной, однако, была попытка авторов обзора систематизировать процесс программирования в целом и обратить внимание на использование самой ЭВМ для упрощения программирования. Они писали (4.1 [20]):
"Подготовка задач, подлежащих решению в вычислительной машине с программным управлением, состоит из следующих этапов:
а) Задача, предлагаемая вычислительному бюро, вообще говоря, в физико-технической интерпретации, должна быть сформулирована математически :
б) Для задачи, ставшей теперь математической, необходимо подобрать соответствующий численный метод решения (численная формулировка) :
в) После того, как выбран метод, содержащий все необходимое для решения задачи, следует расчленить числовые формулы на отдельные арифметические операции. : Кроме того, здесь следует ввести "переходные операции", т.е. указания для работы машины.
Арифметические и "логические" операции объединяются под общим названием расчетных указаний; совокупность их и составляет программу расчета. По существу, она является не чем иным, как подробным описанием хода численного решения, приспособленным для неквалифицированного вычислителя, который и заменяется вычислительной машиной.
г) Наконец, программу расчета следует перевести на "язык" вычислительной машины. При этом каждое расчетное указание записывается в зашифрованной форме в виде соответствующего управляющего сигнала (или сигналов - "команд") на перфоленту или магнитную ленту:
Для разграничения понятий "программа расчета" и "последовательности управляющих сигналов" следует подчеркнуть, что программа расчета, выражаемая в виде формул и указаний, представляет собой весьма общее численное решение задачи и поэтому пригодна для любой вычислительной машины; напротив, последовательность управляющих сигналов приспособлена всегда для определенной вычислительной машины."
Из введения (1.3 - 1.4):
"Подготовку задачи частично можно производить при помощи отдельной вычислительной машины, расшифровывающей общий управляющий сигнал, задаваемый человеком, в целый ряд отдельных сигналов управления. Такой общий управляющий сигнал может, например, означать: "Следует вычислить неопределенный интеграл функции, находящейся в группе ячеек 1-100 накопителя". Первый шаг в этом направлении сделан в машине МАРК III, где запись программы на ленту осуществляется шифровальной машиной, в которую математик может задавать определенные вычислительные операции в их обычном математическом выражении. : Как видно из сказанного, не следует представлять себе дело так, что развитие вычислительных машин должно состоять (только) в увеличении их вычислительной скорости :
Подготовка вычислительной задачи для вычислительной машины (кодирование или программирование) сама по себе может рассматриваться как специальный раздел логики. Здесь требуется исследовать структуру математического процесса, а также ход преобразований этой структуры на язык вычислительной машины."
После анализа источников (к ним надо еще было бы добавить некоторые журнальные статьи, например, [25] в связи с использованием подпрограмм в машине ЭДСАК), вернемся к рассмотрению книги "Программирование для быстродействующих электронных счетных машин".
Глава I. Цифровые машины и автоматизация вычислений (21 стр.)
Определение цифровых машин, системы счисления, логическая структура алгоритмов (последовательные вычисления, циклы, разветвления), автоматические вычислительные машины, принцип программного управления, оперативная и внешняя памяти.
Глава II. Операции над числами в цифровых машинах (94 стр.)
Изображение чисел, фиксированная и плавающая запятая, операции над числами и двоичными кодами, особенности действий над конечно-разрядными числами, схемы умножения, деления и извлечения квадратного корня.
Материал этой главы излагается в книге весьма подробно и существенно шире, нежели того требуют специфические свойства БЭСМ.
Глава III. Некоторые стандартные процессы при автоматических вычислениях (24 стр.)
Конспективно описываются схемы вычислений и правила арифметизации некоторых, часто встречающихся, алгоритмов (сумма произведений, перевод числа из одной системы в другую, арифметика с двойной точностью, вычисление многочленов, последовательные суммы и разности, решение уравнения методом сужения интервала, вычисление функций с помощью рядов, непрерывных дробей и итерационных методов, логические методы контроля вычислений, включая контроль по четности и код Хэмминга).
Глава IV. Программирование решений математических задач (86 стр.)
Глава начинается с повторения принципа программного управления и свойств команд, адреса, кода операции, адресности. При сравнении одно- и трехадресных кодов как наиболее предпочтительных отмечается их принципиальная эквивалентность, большее удобство трехадресного кода и большая информационная экономичность одноадресного. Впервые формулируется известное прикидочное правило: число команд в одноадресной программе примерно вдвое больше того же числа в трехадресной. Затем дается пример простейшей программы (комплексного деления) в трехадресном и одноадресном (в символике ЭДСАКа) кодах. Подробно описываются команды условного и безусловного перехода в разных вариантах адресности команд.
На примере решения квадратных и кубических уравнений составляются программы, содержащие разветвления. Подробно описывается цифровое кодирование команд и связанные с ним способы преобразования как команды в целом, так и отдельных ее частей (в трехадресном коде). Выделяются случаи инициализации команды, аддитивного изменения адреса, формирования адреса, "реставрации" команды к начальному виду. Затем даются система команд абстрактной трехадресной машины, обозначения символического кодирования, дисциплина распределения памяти. Эти обозначения установили многолетнюю традицию стилистики написания машинных трехадресных программ и использования абстрактной машины для описания принципов программирования. На примерах демонстрируется управление циклом с помощью сравнения по переменной команде и по счетчику. Далее впервые формулируется общий принцип программирования цикла (с ненулевым числом повторений) ([23], стр. 189):
"... Если решение задачи состоит в периодическом повторении основной серии операций, то такую серию операций мы будем в дальнейшем называть циклом, а процессы, состоящие в повторении цикла, - циклическими. ... Пусть последовательность операций (или совокупности операций) есть A1, A2, ..., An и при некотором расположении исходных данных в запоминающем устройстве Ai+1 может быть единообразным способом получено из Ai. Тогда целесообразно составить программу по такому плану:
- I A1
- II Изменение Ai в Ai+1 (Ai -> Ai+1)
- III Контрольное сравнение
Или
- I (Ai -> Ai+1)
- II A0
- III Контрольное сравнение"
Специальный параграф обсуждает способы составления сложных программ из более простых. Способы вызова подпрограмм обсуждаются неподробно и содержат только два приема: формирование возврата на главную программу перед переходом к подпрограмме, находящейся на известном фиксированном месте, и использование двух (центрального и местного) управлений. Для больших задач рекомендуется разбиение задачи на содержательные подзадачи, а потом составление блок-схемы, состоящей из подзадач. Выделяется систематическая (но не автоматизированная) процедура настройки куска программы по месту. Затем описывается прием использования разными ветвями вычислений общих кусков, который сейчас можно было бы назвать запроцедуриванием. Глава завершается примером программы численного решения уравнений баллистики, а также 16-ю программами решения стандартных алгоритмов из предыдущей главы.
Глава V. Программы для решения некоторых математических задач (85 стр.)
Содержит 17 содержательных программ решения следующих задач: , преобразования алгебраических многочленов, решение системы линейных уравнений, интегрирования обыкновенных дифференциальных уравнений методом Рунге-Кутта, интегрирование уравнений внешней баллистики методом Адамса, вычисление таблицы бесселевых функций. Полезным свойством книги оказались весьма подробные пояснения к программам, описывающие большое количество технических программистских приемов (представление перестановок, взаимодействие команд управления во вложенных циклах, разные способы контроля числа повторений, униформизация вычислений для увеличения степени цикличности, повышение скорости за счет расхода памяти и наоборот и т.п.).
В этом же 1952 г., в СССР появилась известная книга М. Уилкса, Д. Уилера и С. Гилла [26], которая была переиздана в 1953 г. в русском переводе [27]. Она существенно дополнила опыт программирования, отраженный в [23]. Эта книга настолько хорошо известна, что не имеет смысла напоминать ее содержание. Осмысливая ее с сегодняшней позиции, можно оценить эту книгу не только как средоточие реального опыта, столь драгоценного в то время, и не только как глубокий вклад в технологию программирования, имея в виду использование библиотеки подпрограмм и программных средств отладки. Книга убедительно показала, насколько более эффективным становится использование о д е т о й машины, и была по существу первым описанием интегрированной системы программного обеспечения, являющейся одновременно и замкнутой в смысле полноты (тексты оборудования, как сейчас говорят, экстракоды 1-го уровня, математическая библиотека, служебные программы ввода-вывода, средства отладки, средства загрузки и ассемблирования, небольшие пакеты прикладных программ) и открытой в смысле способности к росту - все это, пронизанное единым стилем работы на машине, находящемся в гармоническом соответствии со скромными возможностями оборудования.
Заключая можно констатировать, что к началу интенсивного использования первых советских ЭВМ программисты были подготовлены сравнительно неплохо.
Следует отметить, что хотя важность развития вычислительной техники признавалась бесспорной, решительный поворот в сторону универсальных цифровых электронных машин было осуществить не так просто. Дело было не только в недостатке технической базы и других трудностях послевоенного периода. Имела место довольно серьезная дискуссия об установке на универсальные или специализированные средства. За представителями второго направления стояла не только инерция старой школы, но и методологический принцип "данную конкретную задачу часто можно эффективнее решить специальными средствами". Представители первого направления встречали дополнительное сопротивление некоторых философов-догматов, с опаской воспринимающих "кибернетические спекуляции по поводу электронного мозга". Нужны были авторитет и воля, чтобы утвердить это новое направление вычислительной техники и связанную с ним методологию.
В решение этой проблемы очень важный вклад внесли академики М.В. Келдыш, А.А. Дородницын, С.Л. Соболев и М.А. Лаврентьев. М.В. Келдыш, как авторы уже отмечали, возглавлял работу в области прикладной математики в МИАН, А.А. Дородницын возглавлял математический отдел в ЦАГИ, а С.Л. Соболев - математический отдел в Институте атомной энергии АН СССР. Каждый из них не только должным образом направил возглавляемые им коллективы, но и смог убедить заинтересованные ведомства в правильности ориентации на универсальные электронные вычислительные машины как главное звено в развитии вычислительной техники.
В начальный период своего существования ИТМ и ВТ представлял собой конгломерат разных научно-технических направлений, среди которых направление ЭВМ было в то время далеко не самым ведущим и, что самое главное, не имевшим своего носителя. Решающая роль в придании Институту более целеустремленного и современного направления работ принадлежит академику М.А. Лаврентьеву, который в 1950 году, приехав в Москву, стал директором Института. Он начал с того, что организовал в Институте отдел цифровых ЭВМ и пригласил С.А. Лебедева возглавить этот отдел с тем, чтобы, не дожидаясь завершения работ по МЭСМ, начать энергичную деятельность по конструированию большой ЭВМ. Проектная группа состояла, главным образом, из студентов - выпускников Московского энергетического института. Среди этих студентов были, в частности, В.С. Бурцев - нынешний директор ИТМ и ВТ, В.А. Мельников - ведущий конструктор знаменитой БЭСМ-6.
В 1951 году машина была спроектирована, а в 1952 году началась ее опытная эксплуатация. Машина была спроектирована в расчете на оперативную память на трубках Вильямса, но поскольку они были сначала недоступны, в качестве первого варианта памяти использовались ртутные линии задержки (до 1955 г.). Часть быстрой памяти была сделана только читающей и сконструирована в виде серии гнезд с пружинными контактами и прижимными крышками, сильно напоминающими вафельницы. "Вафельница" содержала одну 45-колонную перфокарту, в каждой строке которой содержалось по одной команде. Все оборудование, кроме трубок Вильямса и электроники, было "самодельное", включая ввод с перфоленты, двухдорожечный магнитофон, барабан и ртутную память. Машина по тем временам была весьма быстродействующей (см. таблицу в разделе 3), но трудности в ее реализации носили иногда самый неожиданный характер. В.С. Бурцев рассказывает, что когда наступило время сборки машины, потребовалось, естественно, несколько тысяч радиоламп новой конструкции. В то время это было непомерное количество: квоты распределения этого изделия между институтами исчислялись десятками, в лучшем случае сотнями. В поисках выхода из положения инженеры увидели, что на заводе радиоламп есть испытательный стенд, где тысячи ламп находятся под напряжением в течение сравнительно длительного времени. Была достигнута временная договоренность о том, чтобы использовать стойки БЭСМ в качестве испытательного стенда для продукции завода. Машина успешно выполняла эти двойные функции, пока не был накоплен необходимый запас.
БЭСМ имела трехадресную систему команд, обладавшую одним любопытным атавизмом, восходящим, по-видимому, к МАРК I и II: у нее было два счетчика команд: центральный и местный. Возвратная передача управления и возврат осуществлялись безусловным переходом с переключением на местное управление и обратным переключением на центральное управление. Местное управление использовалось также для выполнения операций обмена.
В этот же период в конструкторском бюро, руководимом М.А. Лесечко, началось проектирование другой ЭВМ, получившей название "Стрела" и предназначенной для серийного изготовления на Московском заводе счетно-аналитических машин. Главным конструктором машины стал Ю.Я. Базилевский, а одним из его ближайших сотрудников - Б.И. Рамеев, в дальнейшем создатель серии машин "Урал". Необходимость заранее предусмотреть проблемы заводского изготовления предопределила некоторые свойства проекта: меньше скорость, использование потенциальных электронных схем, просторный монтаж и т.п. Машина не имела магнитного барабана, но для нее были специально спроектированы 45-дорожечные магнитные ленты. Машина имела весьма удобную систему команд. В частности, каждая счетная команда вырабатывала логическое значение (признак ), по которому можно было устраивать условный переход. Другой особенностью было наличие "групповых операций", выполняющих покомпонентные действия с векторными массивами. Половина быстрой памяти была также односторонней, имела свое управление и использовалась для небольшой встроенной библиотеки подпрограмм.
Первая машина "Стрела" была установлена в отделении прикладной математики МИАН, где в конце 1953 года началась ее опытная, а вскоре и производственная эксплуатация.
Из пионеров советской вычислительной техники необходимо отметить также заведующего лабораторией электросистем Энергетического института АН СССР члена-корреспондента Академии наук И.С. Брука. Он приступил к работе над ЭВМ в 1951 году и построил небольшой макет, известный под названием М-1. После накопления первого опыта и формирования начального коллектива под его руководством в течение 1952 года была спроектирована машина М-2. Одним из ведущих разработчиков был М.И. Карцев, внесший впоследствии большой вклад в теорию и практику конструирования арифметических устройств. Эта машина положила начало серии машин среднего класса, причем экономичность была одним из основных принципов конструирования. В этом отношении конструкция машины М-2 была весьма удачной и создавшей долголетнюю традицию проектирования учениками И.С. Брука не одной серии недорогих и массовых ЭВМ. Среди них следует, в первую очередь, назвать Г.П. Лопатко - впоследствии главного конструктора серии машин "Минск".
3. Первый опыт и первые научные результаты на первой конференции (1954-1956)
Создание первых ЭВМ в СССР было расценено как весьма важное научно-техническое событие. С.А. Лебедев был выбран в 1953 году в действительные члены Академии наук по специальности "вычислительная техника", а Ю.Я. Базилевский был удостоен высшей в СССР правительственной награды - звания "Герой социалистического труда" с вручением Золотой звезды и ордена Ленина. В Академии наук и в Министерстве высшего образования был также осуществлен ряд организационных мер, направленных на формирование и укрепление коллективов, связанных с производством и использованием новой вычислительной техники.
Работы по прикладной математике в МИАН были сконцентрированы под руководством М.В. Келдыша в Отделении прикладной математики (ОПМ), ставшим впоследствии отдельным Институтом прикладной математики. В составе Отделения в 1953 г. был организован первый в СССР отдел программирования, который в течение первого года возглавлял А.А. Ляпунов, а с 1954 г. и по настоящее время - ШБ.
Годом раньше в Московском государственном университете была реорганизована кафедра вычислительной математики, предназначенная для обучения прикладных математиков, подготовленных для работы с ЭВМ. Заведующим кафедрой стал академик С.Л. Соболев.
Выпуски этой кафедры в 1953 и 1954 годах создали первое поколение специалистов, сознававших себя профессиональными программистами с самого начала своей карьеры.
В 1955 году был создан Вычислительный центр Академии наук СССР, предназначенный для ведения научной работы в области машинной математики и для предоставления открытого вычислительного обслуживания другим организациям Академии наук. Его директором стал А.А. Дородницын, также избранный в 1953 году в действительные члены АН СССР.
В 1952 году началась работа в области программирования в отделе приближенных вычислений Ленинградского отделения МИАН (ЛОМИ), который возглавлял Л.В. Канторович, до этого известный своими работами по функциональному анализу и пионерскими исследованиями в области линейного программирования.
После переезда С.А. Лебедева в Москву директор Института математики АН УССР профессор Б.В. Гнеденко привлек к себе в институт коллектив разработчиков МЭСМ, образовавший вычислительную лабораторию. Через несколько лет эту лабораторию возглавил В.М. Глушков, незадолго до этого защитивший докторскую диссертацию по теоретической алгебре. Кроме математического, он имел также инженерное электротехническое образование. В его проницательном представлении область вычислительной техники давала благоприятную возможность для реализации каждого из этих знаний. На базе вычислительной лаборатории в конце 50-х годов был создан Вычислительный центр Академии наук Украины, ставший впоследствии известным Институтом кибернетики АН УССР.
В 1954 году М.А. Лаврентьев передал пост директора ИТМ и ВТ С.А. Лебедеву. При образовании Вычислительного центра значительная часть сотрудников-математиков (включая АЕ, который начал свою работу в ИТМ и ВТ в 1953 г., еще будучи студентом МГУ) была переведена из института в ВЦ.
В 1955 году в МГУ был организован Вычислительный центр, развернувший научную и учебную работу на ЭВМ М-2.
Коллектив И.С. Брука в 1956 г. выделился из состава Энергетического института АН СССР и образовал Лабораторию управляющих машин и систем АН СССР, ставшую впоследствии Институтом электронных управляющих машин (ИНЭУМ).
Именно в этих коллективах были выполнены первые эксперименты и научные исследования, заложившие основы развития и применения 1-го поколения ЭВМ и нашедшие свое полное выражение в первом общесоюзном научном собрании, посвященном вычислительной технике. Это была конференция под названием "Пути развития советского математического машиностроения и приборостроения", которая состоялась в Москве с 12 по 17 марта 1956 г. в стенах Московского университета.
По тем масштабам это была в высшей степени представительная и обширная конференция. На ней присутствовало свыше тысячи участников, и было сделано 75 докладов [29].
Она происходила в обстановке большого политического и нравственного подъема, вызванного историческим 20-м съездом КПСС. На этом съезде, в частности, при определении программы развития народного хозяйства в 6-й пятилетке 1956-1959 годов было сказано ([30], стр. 447-448):
"Всемерно развивать радиотехническую и приборостроительную промышленность. : Увеличить за пятилетие изготовление : счетных и счетно-аналитических машин - в 4.5 раза. : Усилить работы по конструированию и производству автоматических быстродействующих машин для решения сложных математических задач и счетно-математических машин для автоматизации управления производственными процессами. : Широко развернуть научно-исследовательские работы по полупроводниковым приборами, расширить их практическое применение."
Этот период сопровождался преодолением догматического отношения к идеям кибернетики, единства законов управления и переработки информации и первыми экспериментами применения ЭВМ в моделировании интеллектуальной деятельности.
Незадолго до этого, на известной Дармштадтской конференции 1955 года, делегация советских специалистов, возглавляемая С.А. Лебедевым, впервые обнародовала советские работы по вычислительной технике и заслужила одобрение специалистов.
Этот общий контекст, а также деловая и насыщенная техническая программа объясняют ту исключительную роль, которую эта конференция сыграла в развитии вычислительного дела в СССР. Она отчетливо и захватывающе охарактеризовала новую реальность, созданную электронными вычислительными машинами.
Интересно отметить, что конференция открылась докладом профессора Д.Ю. Панова "История и развитие электронных вычислительных машин". Этот доклад, естественно, подчеркивал первые успехи советского электронного вычислительного машиностроения и характеризовал (уже упоминавшуюся в I-м разделе) серьезную историческую традицию, существовавшую в России и СССР. В то же время в нем был объективно показан решающий вклад американских и английских ученых в становление и развитие идеи автоматической вычислительной машины с программным управлением, начиная с работ Бэббеджа. Докладчик особенно обращал внимание на размах и всесторонний характер промышленного проектирования и производства ЭВМ в США ([28], Пленарные заседания, 5-30).
Выдвигая на первый план обсуждение вопросов, связанных с универсальными электронными вычислительными машинами, организаторы конференции, тем не менее, стремились подчеркнуть разнообразие средств вычислительной техники и представить программу, сбалансированную между несколькими направлениями. Таким образом, три из шести пленарных докладов, относящиеся к вычислительной технике, были посвящены следующим вопросам:
- С.А. Лебедев - "Быстродействующие универсальные вычислительные машины (общая сводка первых советских ЭВМ дана в Таблице I),
- Ю.Я. Базилевский - "Специализированные машины и пути их развития",
- В.Б. Ушаков - "Моделизирующие установки и тенденции их развития" ([28], Пленарные заседания, 31-43, 61-132).
С.А. Лебедев следующим образом идентифицировал основные направления развития универсальных математических машин:
- повышение быстродействия
- увеличение емкости памяти
- повышение надежности
- упрощение математической и технической эксплуатации.
Под упрощением математической эксплуатации С.А. Лебедев понимал "упрощение логики машин, разработку более совершенных типов машин в отношении логики программирования и решения математических задач". В качестве примера развития конструкции ЭВМ в этом направлении он привел автоматическую модификацию адреса команды и контроль за числом повторений цикла.
Пленарный доклад А.А. Дородницына "Решение математических и логических задач на быстродействующих электронных счетных машинах" ([28], Пленарные заседания, 44-52), посвященный, главным образом, решению уравнений с частными производными, содержал ряд постановок и прогнозов, связанных с разработкой и использованием ЭВМ. Он сказал:
"Анализ задач, которые выдвигаются сейчас в различных областях техники, показывает, что требование увеличения быстродействия до величины порядка миллиона операций в секунду и увеличения объема оперативной памяти до десятка и даже нескольких десятков тысяч чисел является вполне актуальным и, может быть, даже скромным требованием".
Это была первая постановка проблемы, приведшая через 8 лет к появлению БЭСМ-6.
А.А. Дородницын отметил также, что "... создание быстродействующей вычислительной техники принципиально меняет роль расчетных методов. При решении очень многих технических задач теперь можно предъявлять к расчетным методам требование наиболее полного учета факторов, влияющих на ход изучаемого процесса. Поэтому расчеты часто могут давать точность большую, чем эксперимент, поскольку последний осуществляется в условиях, не вполне соответствующих натурным, и, кроме того, точность его ограничена точностью измерений."
Следуя основной цели изложения, авторы охарактеризуют научные результаты в области программирования, доложенные на конференции.
Операторный метод А.А. Ляпунова. А.А. Ляпунов начал работу в отделе программирования ОПМ МИАН, имея за плечами военные годы офицера-артиллериста, докторскую диссертацию по дескриптивной теории множеств и опыт преподавания математики в военной академии. Особенностью его научного стиля была широкая естественнонаучная культура, интерес к выявлению общих закономерностей и широких аналогий и редкий дар проповедничества. Ему принадлежит заслуга формирования в СССР взгляда на программирование как на научную дисциплину.
А.А. Ляпунов проанализировал программирование в целом и выделил ряд его фундаментальных концепций. Процесс выполнения программы он рассмотрел как дискретную последовательность единиц действия - операторов, извлекаемых на основе правил управления из текста программы. Важной компонентой теории стала классификация операторов, введенная А.А. Ляпуновым. Он рассмотрел арифметические операторы (операторы присваивания), действующие на данные; логические операторы (включая как вычисление логических отношений, так и передачи управления); а также операторы модификации, действующие на другие операторы. Операторы модификации основывались на идее зависимости операторов от некоторого параметра (обычно, целочисленная переменная) и содержали в себе операторы формирования (инициализации), переадресации (модификация в соответствии с приращением параметра) и восстановления начального вида оператора. Текст программы представлялся состоящим из двух частей: схемы программы - символьного представления операторов, указывающего передачи управления и классификацию операторов, и спецификации операторов, указывающей их конкретное содержание. Это расчленение текста программы отражало также два этапа программирования: общее планирование алгоритма, находившее свое отражение в построении схемы программы и содержательной спецификации операторов (творческая часть), и затем систематическая реализация отдельных операторов средствами машинного языка (рутинная, формализуемая часть). Подчеркивалась также возможность систематических преобразований схемы программы, направленных на ее улучшение. Эта методология, которой А.И. Китов дал название "операторного метода" программирования [33], была описана А.А. Ляпуновым в первом в СССР учебном курсе программирования, прочитанным им в 1952/53 году в МГУ под названием "Принципы программирования", и в конспектной форме представлена докладом на конференции ([28], Часть III, 5-8), сделанным совместно с Ю.И. Яновым.
Этот метод привел к созданию теории схем программ и к первым в СССР трансляторам, а также создал многолетний стиль публикационной спецификации алгоритмов, дающий себя знать даже в наше время [34].
Первые трансляторы. Задача автоматизации программирования была в СССР впервые поставлена А.А. Ляпуновым в 1953 году в рамках его операторного метода как поиск систематических процедур, реализующих операторы схемы программы в терминах машинных команд, отправляясь от некоторой формализованной записи о функционировании этих операторов.
Идея создания интегрированной программной системы, производящей полную реализацию всех операторов, образующих схему программы, была высказана С.С. Камыниным и Э.З. Любимским летом 1954 года, когда они только-только начали свою работу в отделе программирования ОПМ МИАН.
В течение нескольких месяцев они опробовали на машине "Стрела" алгоритмы трансляции простых программ, содержащих арифметические, логические и переадресующие операторы. Эта экспериментальная программа была названа "Программирующей программой" (сокращенно ПП-1). Ее успешная работа побудила ШБ собрать широкую команду молодых программистов с тем, чтобы на этих идеях создать систему не только для отработки методов трансляции, но и для организации производственной работы. Транслятор, законченный в 1955 году, получил название ПП-2. Входной язык ПП-2 сохранял введенное Ляпуновым разбиение текста программы на схему и спецификацию операторов. К перечню операторов были добавлены засылки, позволяющие сократить число вхождений индексированных величин в программу, и операторы восстановления операторов программы к начальному виду. Программирование выражений не учитывало приоритета двуместных операций и выполнялось методом редукции, т.е. замены во входной строке запрограммированного терма на символ рабочей ячейки (при этом выяснялось, не входит ли этот терм в выражение несколько раз).
Параллельный проект транслятора для машины БЭСМ (ПП БЭСМ) был реализован АЕ с группой сотрудников ИТМ и ВТ. Толчком к этому проекту были доклад Э.З. Любимского о ПП-1, сделанный на семинаре в МГУ осенью 1954 г., эксперимент Л.Н. Королева по программированию арифметических выражений с учетом приоритета операций и собственные размышления АЕ о природе циклических процессов в программах. Входной язык ПП БЭСМ содержал арифметические операторы и логические операторы, несколько напоминающие современные операторы выбора. Наиболее важным новшеством в ПП БЭСМ были операторы цикла и индексные переменные (индексами могли быть параметры циклов). Наконец, текст программы не делился на схему и спецификацию операторов, а представлял собой бесформатный линейный текст, в котором операторы разделялись точкой с запятой.
Эти трансляторы были представлены на конференции в докладах С.С. Камынина и Э.З. Любимского и АЕ ([28], Часть III, 9-29).
На Таблице 2 приведены примеры текстов программы, выраженных в символике операторного метода А.А. Ляпунова и указанных трансляторов (туда также включены тексты двух более поздних трансляторов, которые будут обсуждаться в следующем разделе). В качестве примера взят алгоритм решения системы линейных уравнений n-го порядка итерационным методом Зейделя. Расчетная схема (I) этого алгоритма, приведенная Ф. Мурреем в его книге [19], является первой публикацией на русском языке алгоритма, предназначенного для решения на автоматической вычислительной машине с программным управлением, и взята, по-видимому, из ранних работ Х. Голдстайна и Дж. Неймана.
Очень интересным в сопоставлении с символикой А.А. Ляпунова является использованное мимоходом Ф. Мурреем символическое изображение (II) схемы вычислений. Оно является хорошим примером научного пророчества в период программистского Ветхого Завета.
Крупноблочное программирование. Л.В. Канторович, обсуждая проблемы программирования с группой выпускников Ленинградского университета 1953 и 1954 годов, образовавших программистское ядро ЛОМИ, высказал ряд глубоких идей. Он обратил внимание на роль информационных связей в представлении программы, в частности, изображая выражения как деревья. Он же ввел в рассмотрение составные данные как объект программы и определил понятие дескриптора. Соответствующие правила композиции составных объектов из простых получили название "геометрических операций". Процесс выполнения программного комплекса, представляющего собой информационную сеть (схему) отдельных модулей, Л.В. Канторович рассматривал как функционирование некоторой сверх-программы, которая определяет выполнение модулей на основе анализа информационных и управляющих связей схемы. Многие положения крупноблочного программирования были позднее переоткрыты или заново осмыслены на более высоком уровне при разработке систем работы со структурными файлами и в том, что сейчас называют модульным программированием.
Представляет интерес привести ряд выдержек из доклада Л.В. Канторовича, Л.Т. Петровой и М.А. Яковлевой на конференции ([28], Часть III, 30-36):
"... Сущность данной системы состоит в том, что в машину вводится вычислительный план работы, записанный в укрупненных элементах, который расшифровывается и выполняется раз навсегда составленной универсальной программой "Прораб". Последняя ведает также размещением данных в оперативной и внешней памяти, переадресацией и пр. Таким образом, полная программа данной работы фактически не составляется, ее получение и не ставится задачей, целью является нахождение результатов вычисления. Если угодно, хотя это звучит парадоксально, это система беспрограммного программирования."
"... Вопрос об используемой символике является очень существенным при передаче машине математического задания. Очевидно, этот процесс будет легче, если математический язык и язык, воспринимаемый машиной, будут приближены друг к другу. : Математическая символика изменялась и развивалась с развитием новых областей математики. Естественно, что и применение машин также должно оказать влияние на используемую символику. Можно также и машину "научить понимать" не только простейшие операции, но и более сложные, например, матричные и др."
"... Представляется удобным также при схемной записи оперировать не с отдельными числами, а с более крупными объектами - величинами. В качестве таких числовых величин могут быть взяты вектор, матрица, трехмерная матрица, поле и т.д. Для величины наряду с ее числовым содержанием вводится справка, представляющая собой описание числового материала и его расположения. ... Так справка о величине K(матрица порядка n x k - Авт.) имеет вид
где P - номер ячейки, в котором размещается первый элемент величины; n - число столбцов; k - число строк; h1 - расстояние между соседними элементами любой строчки; h2 - расстояние между первыми (и вообще - i-ми) элементами двух соседних строк. Отметим, что справка о транспонированной матрице K* имеет видОтделение справки от числового материала тем более оправдано, что несколько величин может опираться на один и тот же числовой материал."
"... Вычислительный план машине может быть задан в виде общей схемы (изображаемой в виде некоторого дерева, определяющего частичное упорядочение результатов), элементами которой могут быть: 1) числовые величины, а также программы, матрицы программ, схемы и 2) операции над этими величинами : например: упростить схему, по данной схеме (формуле) составить программу, провести рекуренцию схемы до выполнения некоторого условия."
Технология программирования и решения задач на ЭВМ.
На конференции эти вопросы обсуждались, главным образом, в докладе ШБ ([28]. Пленарные заседания, 53-60). Уже первые годы работы на ЭВМ показали, что "истинная производительность машины должна определяться числом фактически решенных на машине задач, временем, необходимым для реализации решения каждой задачи, и количеством людей, занятых на подготовке и проведении задач и технической эксплуатации машины".
В докладе был поднят вопрос о взаимодействии "математика" и "программиста" при решении задачи на машине. Была выдвинута формула равноправного сотрудничества при определенном разделении специализаций.
"Успешная работа по созданию новых методов вычислений возможна лишь при тесном контакте работников, занимающихся математической постановкой задач, с программистами. Целесообразность тесного контакта не означает, однако, смешение функций. Вопрос о выборе расширенного (т.е. адаптированного к решению на машине - Авт.) алгоритма решения столь же существенен, как и правильный выбор исходного алгоритма, в то же время эта сторона дела имеет свои специфические особенности и целесообразно, чтобы данная часть работы проводилась программистом."
К 1956 году в ОПМ МИАН постепенно сложились технологические принципы организации счета задач. Главной фигурой у машины стал оператор, формирующий и пропускающий пакет задач в отсутствие авторов задач на основе формализованных инструкций. Проблема "изгнания" программистов из машинного зала оказалась очень не простой. Появилось различие счетных и отладочных запусков, срочных и дежурных задач. В 1955 году появились первые программы контроля программ: интерпретирующая прокрутка с выдачей отладочной информации, "посмертные" выдачи, программы печати границ "линейных участков" программы и т.п.
В то же время в программировании сложилась, по нынешним понятиям, парадоксальная ситуация, когда автоматизация программирования с помощью трансляторов опередила в своем развитии другие методы, в частности, методы символического кодирования и использования библиотек программ. В докладе ШБ была поставлена задача более гармоничного объединения методов и расширения понятия "автоматизация программирования".
Обзор конференции 1956 года целесообразно заключить сводкой докладов о применении ЭВМ. Список докладов, как по представленным, так и по отсутствующим темам, авторам кажется весьма показательным ([28], Часть III, 62-180).
Три доклада были посвящены машинному переводу (с французского на русский и два проекта с английского на русский), остальные доклады - по одному на темы: вычисление элементарных функций, вычисление математических таблиц, решение задач газовой динамики, прогноз погоды, общее применение ЭВМ М-2 в учебном вычислительном центре МГУ, автоматический учет масштабов при вычислении с фиксированной запятой, расчеты методом Монте Карло, расчет линий уровня функций двух переменных, расчет устойчивости электрических систем.
Следует отметить, что в целом 1956 год был годом большого паблисити для вычислительного дела. В июне вышла первая в СССР книга учебного характера по ЭВМ: А.И. Китов "Электронные цифровые машины" [33]. В июне-июле 1956 г. на 3-м всесоюзном математическом съезде программисты впервые выступили перед математической аудиторией с докладами о своих работах [35]. Это были в основном повторения докладов мартовской конференции. Кульминацией выхода вычислительной науки и практики на общественную арену была специальная сессия Академии наук СССР, состоявшаяся в октябре 1956 года [36]. На ней выступили все ведущие ученые, причастные к рождению и первым годам развития ЭВМ в СССР. Это было собрание, единственное в своем роде, когда к строгому стилю академических собраний присоединялись элементы зрелища: доклад о машине БЭСМ сопровождался демонстрацией огромной электрифицированной динамической схемы, поясняющей принцип программного управления, а в момент доклада по машинному переводу была установлена прямая телетайпная связь с машиной для непосредственной демонстрации выдачи перевода заданного в этот же момент текста.
Это был период неограниченного оптимизма, своего рода компьютерная эйфория - детская болезнь, охватившая в то время, как пандемия, все страны мира, приступившие к производству и освоению электронной вычислительной техники.
4. Накопление опыта и развитие знаний (1956-1959)
Итак, практикующие программисты и студенты имели в 1956 г. в своем распоряжении 5 методов программирования конкретных задач:
- Операторный метод с использованием программирующих программ [28];
- Метод библиотечных программ [27];
- Символическое кодирование (изложенное впервые А.И. Китовым [33] со ссылкой на работы, выполненные для ИБМ 701 [37]);
- Крупноблочное программирование по Л.В. Канторовичу [28];
- "Ручное" программирование с 8-ричным или 16-ричным кодированием машинных программ и с использованием блок-схем или операторных логических схем в качестве неформального подспорья.
Первые работы по каждому из этих направлений, представленные либо своими авторами, либо проповедниками, требовали с одной стороны своего собственного развития и улучшения, а, главное, определенного периода совместного существования для выработки реальных и сбалансированных процедур производственного программирования, отвечающих не только амбициям своих пропонентов, но и более объективным требованиям общей эффективности и удобства.
С этой точки зрения было важно расширить фронт работ и, в частности, пережить опыт разработки и использования библиотеки стандартных подпрограмм. Это последнее направление получило особое развитие в Вычислительном центре МГУ, где в итоге интенсивной двухлетней работы была создана развитая библиотека подпрограмм, основная часть которой была опубликована в 1958 г. в монографии [38]. Вот как авторы объяснили свои цели:
"... Одним из путей автоматизации программирования является путь использования библиотеки стандартных подпрограмм. Сущность этого метода заключается в том, что для наиболее часто встречающихся алгоритмов раз и навсегда тщательно составляются подпрограммы, которые затем могут быть использованы в качестве готовых частей программы при решении любой конкретной задачи, где требуется реализация соответствующих алгоритмов. Это дает существенную экономию труда программиста.
Для большей эффективности этого метода требуется разработка определенной системы, обеспечивающей наиболее полную автоматизацию процесса подключения стандартных подпрограмм к общей программе и максимальные удобства их использования в различных задачах, а также наличие достаточно обширной библиотеки, подпрограммы которой удовлетворяют некоторым стандартным требованиям выбранной системы."
Естественно, что структура изложения во многом напоминала книгу М. Уилкса, Д. Уилера и С. Гилла [27], преследуя в целом общие цели. Полезным качеством книги было включение в текст очерка об основных понятиях и приемах программирования, собравшего воедино и объяснившего значительную часть накопившейся к тому времени программистской терминологии. Это была также первая книга, в которой повсеместно использовались ляпуновские схемы программ для описания логической структуры подпрограмм.
1958 г. был, вообще, урожайным годом на публикации по программированию. В издательстве АН СССР вышло описание транслятора ПП БЭСМ [39]. Оно содержало изложение операторного метода, описание входного языка и основных алгоритмов трансляции и подробные блок-схемы транслятора.
В этом же году вышел первый выпуск известной "красной серии", основанной А.А. Ляпуновым под названием "Проблемы кибернетики". В нем, в частности, были опубликованы статьи, содержащие полное описание транслятора ПП-2 [42.2 - 6], а также изложение работы А.А. Ляпунова, приведшей к операторному методу, выполненной им в 1952-1953 годах [42.1].
Разработка трансляторов, основанных на операторном методе, стала в то время весьма популярным занятием. Почти каждая команда программистов, осваивая очередной экземпляр машины "Стрела", создавала для нее свою версию программирующей программы. Авторы укажут на две работы, сыгравшие определенную роль в эволюции методов трансляции.
Группа сотрудников Вычислительного центра разработала транслятор ППС для ЭВМ "Стрела-3" [40, 41]. Он был непосредсвенным развитием транслятора ПП БЭСМ (см. Таблицу 2, УШ). В нем, в частности, были введены более естественные обозначения для операторов циклов и для условий в логических операторах. В весьма суженных пределах имелась возможность задавать описания унарных процедур-функций, при условии, что телом процедуры являлось выражение или машинная подпрограмма.
Когда ЭВМ "Стрела" появилась в Вычислительном центре МГУ в 1956 г., там уже сложилась методика программирования на М-2 (обсуждавшаяся авторами в начале этого раздела). Ее естественным развитием стала концепция интегрированной системы автоматизации программирования, в которой транслятор был бы одной из компонент. Таким образом, кроме транслятора, разработанного под руководством Н.П. Трифонова, система содержала библиотеку стандартных подпрограмм, разработанную Е.А. Жоголевым "составляющую программу" (представляющую собой комбинацию простого ассемблера с загрузчиком) и серию отладочных программ. Система автоматизации программирования была подробно описана в сборнике работ, вышедшем в 1961 году [43].
Составляющая программа по тем временам обладала большой общностью. Она могла осуществлять настройку модуля загрузчика по месту, имела редактор внешних связей, возможность совмещения модулей в памяти, возможность как заданного, так и автоматического распределения памяти.
Выходом транслятора был стандартный модуль загрузки. Входной язык транслятора во многом следовал стилю ПП-2, хотя уже и не требовал строгого разделения на схему программы и на спецификацию операторов. В трансляторе был реализован в некотором объеме аппарат макроопределений, в котором тело макроса обозначало некоторую "подсхему" задачи, подставляемую предпроцессором на место сокращенного обозначения подсхемы. Таким аппаратом в трансляторе реализовались операторы цикла, которые во входном языке трактовались как "обобщенные операторы", т.е. сводимые к базисным.
В это время ШБ заинтересовал другой способ использования стандартных подпрограмм, который не требовал бы от программиста статического ассемблирования, так что подпрограмма вызывалась бы из библиотеки и настраивалась бы по месту при первом обращении к ней при выполнении программы. Это требовало создания административной системы, находящейся в памяти ЭВМ в процессе решения задачи. Сравнительно малые объемы памяти ЭВМ требовали весьма экономного проектирования, а также решения определенных проблем резидентации библиотеки и создания некоторой тактики выбрасывания подпрограмм при переполнении рабочего поля. Такие экономичные решения удалось найти, и второй вариант интерпретирующей системы (ИС-2) стал основным способом использования подпрограмм в новой ЭВМ М-20, созданной в 1958 году (см. ниже) [44, 45].
Элементы символического кодирования можно усмотреть уже в первых трансляторах ПП-2 и ПП БЭСМ. Текст программы на входном языке мог содержать так называемые "нестандартные операторы", представляющие собой фрагменты машинных программ, где в адресных частях могли находиться имена величин. Однако система символического кодирования, так сказать в чистом виде, появилась поздно - лишь в 1957 году для ЭВМ "Стрела" и в 1959 году для М-20 [44. 4], [46].
Принципы символического кодирования получили своеобразное развитие в Вычислительном центре АН Украинской ССР, созданном в конце 1958 года на базе отделов Института математики АН УССР, включавших, в том числе, и коллектив разработчиков МЭСМ.
В.С. Королюк в 1958 году [47] ввел в рассмотрение функции именования и - обратную - разыменования, что позволило ему использовать на уровне абстрактных алгоритмов операции взятия значения по адресу, рассмотрения значения как адреса другого значения (косвенная адресация) и засылки значения по адресу. Указанные функции он назвал адресными функциями. С их помощью В.С. Королюк смог точно описать такие аспекты управляющих действий в программах, как настройка программы на место в памяти, вычисляемый переход, индексная арифметика, переадресация и формирование адресов, например, при вызове параметра подпрограммы по адресу [48]. В результате получился своеобразный язык программирования, содержащий только операторы присваивания с выражениями, содержащими только скалярные величины, и условными переходами по предикатам. (Таблица 2, IX.) С некоторыми расширениями этот язык, получивший название "адресного языка", был положен в основу целого семейства трансляторов, разрабатывавшихся в течение ряда лет в Киеве под руководством заведующей отделом программирования сначала Вычислительного центра, а затем Института кибернетики АН УССР Е.Л. Ющенко [49]. По стилистике эти трансляторы напоминали автокоды Р.А. Брукера [50]. В одной из первых версий такого транслятора, сделанного для ЭВМ "Киев" (первая крупная ЭВМ, спроектированная вслед за МЭСМ сотрудниками Вычислительного центра АН УССР в 1956-58 годах), впервые в качестве достоинства отмечалась однопроходная схема трансляции, а для записи выражений использовалась обратная польская запись [51].
В рамках крупноблочного программирования была создана серия экспериментальных прикладных программ, главным образом, в недрах лаборатории приближенных вычислений ЛОМИ. В этих системах получили определенное развитие принципы оперирования со структурными объектами: использование вырезок в работе с массивами [52.1], "геометрические операции" композиции массивов и теоретико-множественные операции над ними [52.2], а также были реализованы правила аналитических выкладок над некоторыми объектами анализа, в частности, весьма развитая система для работы с полиномами [52.5].
Перечисляя системы программирования, относящиеся к тому или другому из первых четырех методов программирования (см. начало раздела), следует отметить, без какой бы то ни было утайки, что их влияние на повседневную практику программирования в то время было хотя и существенным, но не подавляющим. Во-первых, в то время еще не сложилось понятие программного продукта, и первые системы программирования, за исключением некоторых библиотек стандартных подпрограмм, были еще практически неотчуждаемы от своих авторов. Во-вторых, машины БЭСМ-2 и "Стрела" не имели буквенно-цифрового ввода и вывода, и необходимость числовой кодировки буквенных текстов символических программ приводила опытных программистов к убеждению, что восьмеричное кодирование машинной программы по аккуратной блок-схеме не менее эффективно, чем числовое кодирование любой символической схемы программы. Эта старая гвардия производственных программистов первого поколения формировала общественное мнение почти до 60-х годов. Другим их принципиальным аргументом было требование полного контроля над исполняемой программой. Эти взгляды, хотя и в новых формах, но те же по существу, были позднее переданы новому поколению несгибаемых "ассемблерщиков", которые и в наше время одновременно являются и носителями консервативной традиции и источниками проблематики для неуемных "автоматизаторов" программирования.
В то же время, невзирая на внутреннее несовершенство и внешние препятствия, эти системы программирования первого поколения все-таки, во-первых, работали, во-вторых, формировали перспективную идеологию в головах как энтузиастов, так и критиков и, наконец, вносили в практику программирования конкретную методику и технику. Охарактеризуем те найденные технические приемы, относящиеся как к технике трансляции, так и к методам обработки информации, выдержавшие испытание временем.
В ПП-2 В.С. Штаркман реализовал применяемый и поныне метод экономии рабочих ячеек на линейном участке программы, основанный на возвратном просмотре команд линейного участка [42.6].
В ПП-2 был также реализован метод вычисления логических выражений в виде последовательности логических проверок с передачей управления сразу, как только становится ясным значение еще недовычисленного выражения [42.3].
В ПП БЭСМ был реализован придуманный Л.Н. Королевым метод декомпозиции арифметических выражений в трехадресный код с учетом приоритета операций и с использованием стека (получившего название "полупрограммы"). Декомпозированное выражение представлялось в виде списочной структуры, когда в позиции адреса промежуточного результата ставилась ссылка на команду, вычисляющую этот результат [39].
В ПП БЭСМ была реализована универсальная схема построения операторов цикла с рядом оптимизаций (контроль числа повторений по переменной команде, совмещение восстановления по внутреннему параметру с переадресацией по внешнему и т.д.) [39].
При программировании циклов в ПП БЭСМ применялся метод, получивший впоследствии название метода решающих таблиц. Имелось 12 способов реализации зависимости переменного адреса от параметра, выбор которых проводился по таблице решений, входом в которую были значения четырех двоичных признаков ([39], стр. 49-50).
В ПП-2 осуществлялась экономия совпадающих выражений в пределах выражения, а в ПП БЭСМ - в пределах линейного участка.
В трансляторе МГУ был реализован алгоритм экономии совпадающих выражений в пределах линейного участка с учетом альтернативных ветвей в условных выражениях (допускающихся в том трансляторе), ассоциативности операций и перемены знака выражений [43].
В трансляторе ППС был реализован частичный синтаксический контроль с использованием матрицы попарной сочетаемости элементарных символов входной программы [40].
АЕ рассмотрел задачу декомпозиции арифметического выражения как оптимального упорядочивания дерева формулы с сохранением заданного частичного порядка. Введя понятие "ширины" декомпозиции как максимального числа информационных связей от результата к аргументу, он нашел алгоритм упорядочивания, дающего минимальную ширину для бесповоротных выражений [53].
Охарактеризуем результаты, относящиеся к проблемам представления, поиска и занесения информации.
ШБ в 1952 г. предложил универсальный способ манипулирования с множествами, являющимися подмножествами некоторого генерального занумерованного множества {m1, ..., mn}. Любое такое множество {mi1, ..., mik} изображается двоичным вектором |σ1, ..., σn|, где σi1= ... =σik=1, а остальные равны нулю. Такой вектор получил название логической шкалы. Пересчет и теоретико-множественные операции над множествами в таком представлении удобно сводились к машинным операциям сдвига, нормализации и поразрядным логическим операциям [33].
В ПП БЭСМ АЕ выдвинул в качестве общего правила принцип "адресной кодировки" различных объектов, с которыми приходится иметь дело при трансляции. При такой кодировке всюду, где это имеет смысл, объект кодируется адресом ячейки, содержащей информацию об этом объекте. Такая кодировка существенно сокращает время поиска информации и хорошо соответствует структуре оперативной памяти с произвольным доступом [28.3]. Сейчас такие коды естественно назвать "квалифицированными указателями".
Мы уже упоминали о введенной Л.В. Канторовичем концепции дескриптора (справки) как объекта фиксированного формата, концентрирующего в себе описание способов доступа к компонентам динамического структурного объекта (величины) [28.4].
В 1957 г. АЕ независимо, хотя и позднее ИБМ-овских сотрудников, придумал функцию расстановки как способ беспереборного поиска информации по ключу, исследовал экспериментально ее статические свойства и применил ее для алгоритма экономии команд, работающего за линейное время [53].
В 1957 г. Л.Н. Королев в рамках экспериментов по машинному переводу, выполнявшихся в ИТМ и ВТ, разработал методы ускорения ассоциативного поиска в файлах словарного типа, а также способы сжатия ключевых слов без потери однозначности [54, 55].
В конце 50-х годов группа московских математиков занялась вопросом программирования шахматной игры. Через 16 лет эти исследования завершились выигрышем 1-го всемирного чемпионата шахматных программ, происходившего в Стокгольме в 1947 г. во время Конгресса ИФИП. Одной из важных компонент последовавшего успеха было глубокое изучение вопросов организации информации в памяти ЭВМ и разработка эвристик поиска, требующего перебора. Г.М. Адельсон-Вельский и Е.М. Ландис изобрели двоичное дерево поиска (дихотомическая справочная) [56], а А.Л. Брудно независимо от Дж. Маккарти придумал -эвристику для сокращения перебора на дереве игры [57].
В обсуждаемый период времени в Советском Союзе были выполнены работы, развитие которых привело к созданию теории схем программ - важному разделу теоретического программирования, или, выражаясь в англоязычной терминологии, математической теории вычислений.
Первые существенные результаты в этом направлении принадлежат Ю.И. Янову, который в 1953 году стал аспирантом А.А. Ляпунова и работал под его научным руководством. Опираясь на понятия операторного метода и выделение логической структуры программы в отдельную конструкцию, он пришел к формализации понятия схемы программы, вошедшую в литературы под названием "схемы Янова". Для этого класса схем Ю.И. Яновым была построена полная теория, содержащая алгоритмическое решение проблемы эквивалентности схем и полную систему преобразований эквивалентных схем. Результаты были анонсированы в совместном докладе А.А. Ляпунова и Ю.И. Янова на конференции 1956 года [28.1], а полное название результатов было опубликовано в первом выпуске "Проблем кибернетики" [58].
Результаты Ю.И. Янова породили целую серию исследований, в которых в рамках либо формализма Ю.И. Янова и его непосредственных обобщений, либо более общей символики А.А. Ляпунова предпринимались попытки построить более содержательную теорию. Возможные классы содержательных преобразований схем программ А.А. Ляпунова рассмотрела Р.И. Подловченко, также учившаяся в аспирантуре у А.А. Ляпунова с 1953 г. [59].
А.Н Криницкий в своей диссертации [60], выполненной под руководством А.А. Ляпунова, ввел в схемы программ имена величин, создав формализм, по существу совпадающий с современным понятием стандартных, или "алголоподобных" схем. В этом формализме он построил полную теорию схем без циклов, доказав для них разрешимость распознавания функциональной эквивалентности и построив полную систему преобразований [61].
Весьма полезной оказалась небольшая работа 1957 г. киевского математика Л.А. Калужнина "Об алгоритмизации математических задач" [62], в которой он в некотором смысле реабилитировал понятие блок-схемы, показав, что логическая структура программы, представленная в графической форме, служит не только ее наглядным изображением, но и может быть объектом плодотворного математического рассмотрения.
АЕ предложил некоторый метаязык, названный им "операторными алгоритмами", позволяющий формально описывать различные классы программ по отношению к базовой сигнатуре операций и свойствам запоминающей среды [63]. В этом формализме им был описан фрагмент алгоритмического языка и модельная ЭВМ и описаны инварианты, позволяющие вводить отношение эквивалентности между программами, выраженными в этих языках разного уровня. Кроме того им были доказаны свойства алгоритмической полноты некоторых минимальных сигнатур операций.
Э.З. Любимский, в своих поисках входного языка систем программирования более высокого уровня, свободного от "переопределенности" алгоритмических предписаний, высказал идею так называемой "параметрической записи" математических задач, когда задача представляла собой неупорядоченную совокупность расчетных формул. Каждая формула содержала в качестве свободных переменных "параметры", которые либо представляли элементы тех множеств, на которых эти формулы должны многократно (с помощью квантора "для всех") применяться, либо были аргументами особого "пускового" предиката. Этот предикат, "перманентно" вычисляясь, сигнализировал своим значением истинности, что "защищаемая" им формула может вычисляться. Если не считать нескольких публикаций [64, 65], эта идея не получила немедленного развития и нашла более позднее перевоплощение в концепциях "пусковых функций" параллельного программирования [66] и "охраняемых командах" Э. Дейкстры [67]. В 1958 году состоялись первые личные контакты советских программистов с их американскими и английскими коллегами. В июне 1958 г. по приглашению проф. Дж. В. Карра III в США для участия в Летней школе Мичиганского университета прибыла делегация из СССР, возглавляемая академиком А.А. Дородницыным. Л.Н. Королев, бывший членом делегации, выступил с лекцией, в которой он дал краткий обзор советских работ по трансляторам [68].
В ноябре 1958 г. АЕ в составе советской делегации по автоматизации выступил на известной конференции по механизации процессов мышления в НФЛ в Теддингтоне. Там он встретился с Джоном Бэкусом и Грейс М. Хоппер. Темой доклада АЕ был обзор трансляторов, разработанных в Вычислительном центре АН СССР [69], а также изложение некоторых результатов по теоретическому программированию. Сокращенное изложение доклада позднее появилось в журнале "Дейтамейшн" [70].
В августе 1958 г. Советский Союз посетила ответная американская делегация из 4-х человек, возглавляемая профессором Дж.В. Карром. Профессор Карр выступил с докладами по новой американской машине СТРЕТЧ, а профессор Алан Перлис привез и подарил "свежеиспеченное" предварительное сообщение о продукции совместного германо-американского комитета - проекте алгоритмического языка АЛГОЛ [71], получившего позднее название Алгол 58.
В результате этих контактов советские программисты познакомились с серией первых американских систем программирования, описание которых было издано в русском переводе в 1961 году [72].
Что же касается Алгола 58, то ему было суждено сыграть в развитии программирования в СССР весьма важную роль. Он явился своего рода центром кристаллизации новой ситуации в программировании, которая созревала в Советском Союзе в преддверии второго поколения ЭВМ.
Л и т е р а т у р а
Ссылки на источники относятся к списку литературы, помещенной в работе А.П. Ершова, М.Р. Шура-Буры "Становление программирования в СССР (переход ко второму поколению языков и машин)". Препринт Вычислительного центра СО АН СССР, Новосибирск, 1976.
Таблица 1
Первые советские ЭВМ
Название |
МЭСМ |
БЭСМ |
М-2 |
Стрела |
Урал |
М-3 |
Руководитель |
С.А. Лебедев |
С.А. Лебедев |
И.С. Брук |
Ю.Я. Базилевский |
Б.И. Рамеев |
И.С. Брук |
Головной экземпляр |
1951 |
1952 |
1952 |
1953 |
1955 |
1956 |
Серийная продукция |
- |
1956 |
- |
1953 |
1956 |
1957 |
Адресность |
3 |
3 |
3 |
3 |
1 |
2 |
Время тактирующего импульса (мксек) |
2.5 |
12.5 |
6 |
|||
Время
основного такта |
77 |
220 |
220 |
10000 |
60+30000 |
|
Средняя скорость (оп/сек) |
8000 |
2000 |
2000 |
100 |
30 |
|
Цикл обращения к памяти (мксек) |
12 |
25 |
30 |
10000 |
10000 |
|
Тип оперативной памяти |
триггер. яч. |
элт |
элт |
элт |
барабан |
барабан |
Емкость оперативной памяти (слов) |
31 число |
1024+ |
512 |
1024+ |
1023 |
2048 |
Разрядность слова (бит) |
21 |
39 |
34 |
43 |
35 |
30 |
Арифметика |
фикс |
плав |
фикс |
плав |
фикс |
фикс |
Количество ламп |
3800 |
4000 |
1879 |
8000 |
870 |
805 |
Барабан |
2500 |
5120 |
512 |
1023 |
2048 |
|
Лента (слов) |
4х30К |
50К |
2х100К |
40К |
||
Ввод |
ручной |
П/Л |
П/Л |
П/Л |
П/Л |
П/Л |
Вывод |
таб.* |
таб |
Т/Т |
П/К |
таб. |
таб. |
Источник |
[28] |
[28] |
[28, 31] |
[28] |
[28] |
[28, 32] |