В школе моим любимым предметом была математика, и мне не пришлось долго думать, в какой вуз поступать - туда, где математика, только математика, ничего кроме математики. Мой выбор пал на математико-механический факультет Уральского университета, находящегося в Свердловске (ныне Екатеринбург). Я послала туда запрос и получила письмо с проспектом и другими материалами. Проспект сообщал, что мат-мех УрГУ готовит высококвалифицированных математиков, разрабатывающих теоретические вопросы, и математиков, обслуживающих электронные вычислительные машины, то есть тех, кого впоследствии будут называть программистами. Дело было в 1968 году. В ту пору профессия программиста ещё только зарождалась вместе с зарождением вычислительных машин и вычислительных центров, до массовости ей было ещё далеко. Эту новую профессию поручили готовить университетам, и кроме университетов выучиться на программиста было негде.
Быть программистом, писать программы для вычислительных машин и тем самым заставлять их работать, - это должно быть очень увлекательно. Я решила, что именно это мне и нужно - стать математиком, обслуживающим электронные вычислительные машины.
Я благополучно поступила, и началась учёба. Два первых курса мы, как водится, изучали общие математические дисциплины - математический анализ, высшую алгебру, дифференциальные уравнения и другие. Про ЭВМ и что-либо с ними связанное никто не упоминал, и лишь на третьем курсе наряду с продолжающимися математическими дисциплинами начались лекции по программированию.
В ту пору слово "компьютер", если и было известно в каких-то кругах, широкого распространения ещё не получило, потому что и компьютеров в широком пользовании не было. Теперь-то это слово знает каждый младенец, а тогда все знали аббревиатуру ЭВМ, то есть электронно-вычислительная машина. Хотя это были в самом прямом смысле компьютеры-"вычислители", но их никто так не называл. ЭВМ были довольно большими и стояли в специальных машинных залах, куда вход посторонним был запрещён. Их обслуживал специальный персонал, который следил, чтобы всё исправно работало.
Известно, что ЭВМ понимает только двоичную систему счисления - нули и единицы, и разговаривать с ней можно только на таком языке. Да-нет, есть импульс-нет импульса - одно из этих значений назначено единицей, другое нулём, и можно вести с ней разговоры, давать задания, а она вам выдаст некий результат. Но это ваша забота - давать задания на понятном ей языке и получать результат на языке, который понятен вам. Собственно, это и есть задача программирования.
Вот только человеку неудобно обращаться с двоичной системой счисления, ведь, например, даже не очень большое десятичное число 99 в двоичной системе представляется как семизначное 1100011. И попробуй не перепутай нуль с единицей в их длинном ряду, не пропусти где-нибудь в таком ряду один-другой знак! Поэтому программисты пользовались восьмеричной системой счисления, в которой есть восемь цифр от 0 до 7. Перевод чисел из двоичной системы в восьмеричную и обратно происходит легко и непринуждённо, особенно если ты немного в этом поднаторел.
Потом в программировании к восьмеричной системе счисления добавится шестнадцатиричная. Она компактнее и потому удобнее. В конце концов шестнадцатиричная система станет преобладающей.
Итак, мы стали изучать программирование для ЭВМ. Каждый вид ЭВМ имел свои особенности конфигурации устройств и свою систему команд, поэтому изучать программирование абстрактно для любой ЭВМ было невозможно. На нашем факультете была машина М-20, вот на её примере мы и учились. Прежде всего нам рассказали устройство ЭВМ. Она включала три основные части - оперативное запоминающее устройство (ОЗУ), предназначенное для хранения исполняемой программы и её данных, арифметическое устройство (АУ) и устройство управления (УУ), а также два вспомогательных - устройство ввода и устройство вывода. Поскольку ОЗУ имеет магнитную основу, его нередко называли магнитным оперативным запоминающим устройством (МОЗУ). Эта аббревиатура сопровождала нас всё время, пока мы изучали программирование. Позднее оперативные запоминающие устройства станут называть просто оперативной памятью. Это понятие теперь вполне обиходное, с ним знакомы не только программисты.
За это время помимо аббревиатуры МОЗУ мы познакомились с изобилием всяких аббревиатур и сокращений. Программисты были на них горазды, потому что короткие обозначения удобнее длинных, вот и говорить краткое "МОЗУ" предпочтительнее тех четырёх слов, которые за ним стоят. Или вот слово "авост", означающее автоматический останов (не остановка). Машине иногда приходится останавливать свою работу, если исполняемая программа завела её в тупик, и она не знает, что дальше делать. Это происходит, например, при попытке деления на ноль или извлечения квадратного корня из отрицательного числа. Мнимых чисел машина не знала, её пока не научили. Вот тогда-то и происходит авост.
То давнее поколение программистов было первопроходцами, и терминология вырабатывалась на ходу, в процессе работы и освоения новой, до той поры не существовавшей специальности. Что-то из тех терминов прижилось, что-то ушло, когда исчезла надобность в соответствующем понятии, а что-то изменилось до неузнаваемости.
Продолжая изучать программирование для М-20, мы узнали, что МОЗУ, где происходит выполнение программы, состоит из 4096 отдельных ячеек, у ячейки есть уникальный номер, называемый адресом. Каждая ячейка имеет 45 двоичных разрядов, у разрядов ячейки разное назначение. Их надо наполнить неким содержанием с помощью программы, а программу, понятное дело, создаст программист.
Далее мы занялись изучением машинных команд. Код команды, адреса ячеек, откуда брать информацию и куда её посылать. Сначала самое простое - арифметические действия, то бишь сложение, вычитание, умножение, деление. Для сложения код команды такой-то, в разрядах нужно поместить адреса ячеек, где лежат слагаемые, и адрес ячейки, куда поместить результат. В ячейки со слагаемыми надо заранее поместить нужные числа, и опять же задача программиста этим озаботиться. Даже с такими простыми арифметическими действиями у машины не так всё просто, тут есть множество нюансов, и изучение идёт подробно и небыстро. Нам порой начинает казаться, что мы попали в первый класс. Первоклассниками мы стали, такие вот дела! Первоклассниками от программирования! Скучновато, и сколько же это будет продолжаться? Неужели это и есть программирование? Мы малость разочаровались и с нетерпением стали ждать перехода в другие классы. Не век же быть первоклассниками!
Познакомившись с арифметическими действиями, стали составлять программки для вычисления простеньких выражений, например, многочленов третьей степени. И тут вплотную встал вопрос о рачительном использовании оперативной памяти, которая состоит всего-то из 4096 ячеек. Это же мизер, по современным масштабам сущий пустяк, не стоящий внимания, а у нас это всё, чем мы можем располагать, так что вопрос экономии памяти был отнюдь не праздным. При вычислениях возникают промежуточные результаты, их можно хранить так и этак, но желательно использовать поменьше ячеек, и мы упоённо стали их экономить, рассуждая примерно так: мы заняли ячейку для хранения промежуточного результата А, а нельзя ли в эту же ячейку поместить результат В, если результат А к этому моменту уже был использован и больше не нужен? Тут надо чётко осознавать, что он действительно не нужен, а то выйдет совсем не то, что было задумано. Сэкономив таким образом две-три ячейки, мы чувствовали глубокое удовлетворение. Это была уже в некотором смысле творческая задача, а не примитивная арифметика.
Но вот наконец с арифметическими действиями покончено, и мы вышли на широкий простор! Условная и безусловная передача управления, циклы. Вот оно, реальное программирование! Мы воспрянули духом. Циклы в программировании - это главное оружие, для этого и создавались ЭВМ. Если нет надобности в циклах, с вычислениями справится и арифмометр.
За один проход цикла вычисляются некие переменные, затем на основе полученных значений происходит анализ, не пора ли закончить работу цикла или надо выполнить его снова. Здесь существует опасность получить так называемое зацикливание, то есть создать такой цикл, из которого нет выхода. Вы что-то не так сделали, неправильно сосчитали ту переменную, от которой зависит выход из цикла, и он стал вечным. Что ж, придётся принудительно остановить работу программы и убраться восвояси, чтобы проанализировать свой алгоритм и понять, где вы накосячили.
Мы разобрали на лекциях несколько примеров на использование циклов. Тут столько всевозможных нюансов, которые нужно держать в голове ну или в бесценной тетрадке с лекциями! А ведь циклы могут быть ещё и вложенными один в другой как матрёшки. Возможен также вариант, когда во внешний цикл вложены два или более отдельных, не вложенных друг в друга цикла. Да, тут есть простор для творчества!
В какой-то момент мы отправились на экскурсию в машинный зал и познакомились со своей М-20, на которой предстояло решать свои студенческие задачки, чтобы в конце концов стать настоящими программистами. По форме машина отдалённо напоминала музыкальный инструмент типа пианино, только в отличие от пианино у неё на вертикальной панели несколько рядов лампочек, которые отображают содержимое регистров, сумматора и других важных параметров. На горизонтальной панели тоже лампочки, они тоже отображают внутреннее состояние неких параметров. Во время работы машины эти лампочки бессистемно мигают - одни загораются, другие гаснут, и эта картина беспрестанно меняется. Это означает, что машина нормально работает. А вот если мигание прекратится и вся панель будет гореть неярким ровным светом, тут уж не надо гадать, что именно произошло - это случилось зацикливание.
На панели, разумеется, есть и кнопки для управления машиной - кнопки пуска, останова (не остановки! это слово для посвящённых в таинство программирования слишком обыденное), кнопки сброса АУ, УУ и МОЗУ. Всё во власти человека, сидящего за пультом! Он над машиной полный властелин! Но это и возлагает большую ответственность. Если досконально не разобраться во всех нюансах, никакого толку от твоей власти не будет.
Кнопкой останова можно остановить работу машины и не спеша посмотреть содержимое регистров и текущих адресов. Далее можно запустить машину в пошаговом режиме и следить за исполнением команд. Если в программе есть ошибка, её таким образом можно поймать, но это, конечно, высший пилотаж, нам ещё не доступный. Лампочки на панели что-то вам скажут, если вы уже поднаторели в их чтении, а для этого надо не одну собаку съесть, программируя в машинных кодах. Это умели некоторые корифеи-программисты из числа сотрудников факультета, решавших реальные задачи. При нас одна сотрудница, остановив машину, уверенно говорила, что происходило в момент останова. Мы смотрели на неё с уважением и некоторой долей восхищения.
А ещё есть кнопка ввода. Программу и исходные данные нужно ввести в память машины с внешнего носителя информации. И тут на сцену выступает её величество Перфокарта! Вообще говоря, это прямоугольный кусок тонкого картона, в котором пробиваются отверстия. Перфокарты бывают разные и для разных целей, а на наших отечественных ЭВМ они были в так называемом "формате IBM" - размером 187х82 мм. Обычно они были бежевого цвета, но бывали розовые, голубые, зелёные и, возможно, иных цветов, но других мне видеть не доводилось. На стандартной перфокарте размечены 10 строк и 80 колонок, на их пересечении пробивается прямоугольное отверстие специальным устройством, которое называется перфоратором. У него есть тёзка, долбящий стены, но наш перфоратор подобным не занимается, он интеллигентно пробивает небольшие отверстия чёткой прямоугольной формы в строго обусловленных местах перфокарты. Информация на перфокарте простая: если есть отверстие, это единица, а отсутствие отверстия означает ноль. Всё остальное, вся интерпретация сочетания нулей и единиц находится во власти программистов вкупе с создателями ЭВМ, как они между собой договорятся и что сообщат всем остальным. Левый верхний угол у перфокарты срезан, чтобы не перепутать верх-низ и лицевую сторону с изнанкой.
Программисты - люди с чувством юмора, а работа с цифирью, с одной стороны, обостряет потребность шутить, а с другой - предоставляет для этого нестандартные возможности. Для шуток можно использовать подручные материалы, вот хотя бы перфокарты. Кто-то неленивый постарался и набил на перфокарте такое сочетание отверстий, из которого получился текст "Привет из МОЗУ". Это забавно, и, подхватив почин, можно передать уйму приветов из разных частей машины, но привет из МОЗУ самый актуальный. Вы же именно с ним всегда имеете дело, когда запускаете свою программу.
Перфокарты очень долго были главным способом ввода программ в память ЭВМ. Помимо перфокарт были ещё перфоленты, заимствованные из других сфер, но они не получили широкого распространения.
Итак, вы написали программу, переписали её начисто, возможно, на специальном бланке, сами сели за перфоратор и старательно набили программу на перфокарты. Теперь надо положить их в карман приёмного устройства и нажать на кнопку ввода. Программа в памяти машины, следующий этап - запуск. Машина выполнит вашу программу, если только не зациклится, и вы получите на узкой бумажной ленте напечатанный результат. На ней в строке печатается одно число в десятичном виде, но в специфическом формате, к которому ещё надо привыкнуть. Всё, процесс создания программы с целью получения результата закончен! Изучайте результат, удостоверьтесь, что он правильный, что ошибок нет. Для проверки результата нужен контрольный пример, созданный иными способами, например, ручным подсчётом. Такой контрольный пример - это тоже ваша забота, ну или кого-то ещё, не менее вас заинтересованного в полученном результате. Если всё правильно, можете себя похвалить, вы это заслужили!
Помимо лекций у нас были практические занятия по программированию. Мы составляли какие-то программки, ходили с ними на машину, постепенно осваиваясь с нею. А на четвёртом курсе в сентябре у нас была учебная практика.
Здесь начинается этап моего повествования, когда я могу говорить только за себя. Мой руководитель дал мне задачку, которую я быстро решила. После этого он дал задачу посложнее и посерьёзнее, с реальным смыслом. Нужно было получить значения довольно замысловатого выражения на заданном промежутке с заданным шагом. При этом он не сообщил, какого результата можно ждать, объяснив это тем, что результат очень уж специфический. Я удивилась, была заинтригована, но не расстроилась. У меня не было намерения подгонять процесс под нужный ответ, даже мысли такой не могло возникнуть. Напишу программу, и она сама сообщит, что получилось.
Алгоритм программы можно было выстроить по-разному. Требовалось вывести на печать промежуточные и конечные результаты. Можно было ограничиться одним циклом: за один проход накопить некоторые результаты, вывести их на печать и далее снова пройти этот цикл с другими данными, каждый раз печатая порцию результатов. Мне это показалось слишком простым. Ну что такое один цикл? Просто и неинтересно. Я решила сделать вложенный цикл, накопить все результаты и в конце одним махом вывести их на печать. Это сложнее, но и интереснее.
Моя программа работала 20 минут и действительно в конце концов выдала на-гора все нужные числа. Я сидела за машиной и следила за пультом, нет ли признаков зацикливания. Но ничего плохого не случилось, все 20 минут пульт бодро подмигивал мне, сообщая, что всё идёт как надо. Работа шла и благополучно закончилась. Это не значит, что у меня всё получилось с первого раза. В программировании есть законный этап работы над программой, называемый отладкой. Во всякой написанной на бумаге программе наверняка есть ошибки. Более того, даже существует шуточное утверждение, что во всякой отлаженной программе есть хотя бы одна ошибка. Эта шутка намекает, что без отладки уж точно никак не обойтись. Такого не бывает, чтобы программа безошибочно получилась сразу. Я тоже отдала дань этому процессу, и настал момент, когда я пришла к своему руководителю и предъявила ему длинную ленту с результатами.
И тут он мне сказал, какой ожидался результат. Оказывается, это должен быть ноль. Да, действительно, результат очень специфический. Если программа даже ничего не вычислит, ноль получится сам собой. Разумеется, в распечатке были и иные данные, а не один чистый ноль. Они сообщали, что он получился не просто так, а вполне обоснованно. Я догадалась, что на самом деле то замысловатое выражение состояло из двух частей, и надо было проверить гипотезу, что они равны. Что ж, гипотеза оказалась верной, все остались довольны. За практику я получила пятёрку.
В качестве самокритики надо сказать, что усложнение алгоритма, создание вместо одного цикла двух вложенных, вообще говоря, было неправильным решением. Я искусственно усложнила задачу, заняла больше машинной памяти, задействовала дополнительные команды и тем самым увеличила время работы программы. Другое дело, если бы этот накопленный в памяти массив данных пошёл дальше, использовался ещё для какой-то цели, а не только для печати. Что ж, учебная практика на то и учебная, что можно поэкспериментировать и проверить себя, свои возможности, осилить сложные алгоритмы. Я была рада, что поставила перед собой такую задачу и справилась с ней.
Больше мне не пришлось программировать в машинных кодах, но я не жалею о потраченном времени и полученном опыте, который, казалось бы, никуда не пригодился. Нет, это не так. Во-первых, это было интересно, во-вторых, я почувствовала уверенность в своих силах, и в-третьих, всякий опыт обогащает.
Ну а жизнь быстро бежала вперёд, вычислительная техника и программирование бурно развивались. Программировать в машинных кодах очень сложно и трудоёмко, поэтому уже появились языки программирования высокого уровня, такие как Алгол-60 и Фортран. На четвёртом курсе нам прочитали курс лекций "Математическое обеспечение ЭВМ". На нём нас, в частности, познакомили с Алголом-60, и мы во всеоружии нового знания подошли к пятому курсу, где у нас была полугодовая производственная практика уже не в стенах университета, а на различных предприятиях и в организациях Свердловска и других городов.
С Фортраном мне встретиться не довелось, о чём я не жалею, а вот Алгол стал моим языком и на производственной практике, и на моей первой работе, куда я попала по распределению. Если кто не помнит или не знает, в те времена молодых специалистов, только что окончивших вуз, отправляли на работу "по распределению", то есть туда, куда решит распределительная комиссия факультета. Заинтересованные предприятия и организации подавали заявки, что им нужны выпускники нашего факультета. Места были разные, одни лучше, другие хуже, и твоё распределение зависело от разных факторов, в том числе и прежде всего от успеваемости. Меня распределили на "Уралмаш", а точнее - в НИИ Тяжёлого машиностроения при Уралмашзаводе. Это был неплохой вариант, я сама его выбрала из тех возможных, которые были мне доступны.
В НИИ "Уралмаша" имелся собственный вычислительный центр, но с ним были какие-то сложности, а наша лаборатория была богатой и стала покупать машинное время в Институте математики и механики Уральского научного центра Академии наук СССР (ИММ УНЦ АН СССР). Между собой мы по-свойски называли его ИММ. Туда, кстати говоря, распределились несколько человек с нашего курса. ИММ был на передних рубежах развития информационных технологий. У него уже была самая быстродействующая по тем временам ЭВМ БЭСМ-6. Она совершала 1 млн. операций в секунду и была мультизадачной, то есть могла параллельно исполнять несколько программ. Вы уже не могли стать на какое-то время её единоличным властелином. Рядовых программистов вообще не пускали в машинный зал ни под каким предлогом, да и делать им там было нечего. Всё быстро и резко изменилось.
Видимо, именно в это время произошло основное разделение программистов на системных и прикладных. Системщики занимались программным обеспечением машины как таковой, а прикладники решали прикладные задачи в той или иной области науки и производства. Кроме того, появилась новая специальность - оператор ЭВМ. Его обязанностью было запускать в работу программы, которые создали программисты-прикладники, следить за их выполнением и возвращать им распечатанные результаты.
Программы по-прежнему набивались на перфокартах, только сочетание отверстий на них означало уже иное - в нулях и единицах перфокарты были зашифрованы буквы, цифры и иные символы, из которых складывались операторы Алгола. И набивали их не программисты, а специальные сотрудники - как их назвать? операторы перфораторов? Вот ещё одна специализация, связанная с ЭВМ. От программиста требовалось разборчиво написать на бумаге свою программу, а чтобы это было точно разборчиво, писали печатными буквами. Поскольку все люди, не исключая операторов, имеют свойство делать ошибки, текст программы набивали два оператора. После этого две колоды перфокарт сравнивали на специальном устройстве, и если они совпадали с точностью до каждого отверстия, один или оба экземпляра отдавали автору, а если у какой-то перфокарты строгое устройство обнаруживало несовпадение, её перебивали заново.
И вот начинается этап отладки написанной вами программы. Колоду перфокарт с необходимым информационным сопровождением вы отдаёте в некое окошко и ждёте результат. Через некоторое время, часто довольно длительное, вам возвращают колоду и распечатку результатов. Вы впиваетесь в распечатку, обнаруживаете ошибки и недочёты. Их надо исправить, а это значит перебить какие-то перфокарты. Вы пишете на листе бумаги уже не всю программу, а только исправляемые фрагменты, отдаёте их на пробивку и снова ждёте.
Всё это довольно муторно, и получается непроизводительная трата вашего рабочего времени. Но тут ничего не поделаешь, зато ЭВМ задействована максимально эффективно. Машинное время в ту пору было дороже времени программиста.
Иногда можно не ждать, а взять процесс исправления перфокарт в свои собственные руки. Порой удачно случается так, что ошибка сводится к одной или нескольким лишним пробивкам, а это можно устранить самому. В общем зале, где обитают приходящие программисты, стоит копировщик перфокарт. Кладёшь в нужный карман одну или несколько перфокарт, нажимаешь куда надо и получаешь их точные копии. Иногда это бывает нужно. Так вот, в некоем месте копировщика лежит куча отходов от пробитых перфокарт. Вы запускаете туда руку, вылавливаете несколько маленьких прямоугольных картоночек точно в размер пробитого на перфокарте отверстия и аккуратно затыкаете такой картоночкой лишнее отверстие, от которого надо избавиться. Она там держится более-менее прочно, но отдавать такую перфокарту в работу, разумеется, нельзя, потому что рано или поздно картоночка выпадет, причём скорее рано, чем поздно, ведь на самом деле она держится на чьём-то честном слове. Поэтому нужно донести исправленную перфокарту до копировщика и получить её копию. Чаще всего это вполне благополучно удаётся, а если нет, то терпение вам в помощь - сделайте то же самое ещё раз, и в конце концов всё получится. После этого вы можете радостно нести свою колоду в окошко приёма на новую итерацию отладки.
На БЭСМ-6 и других подобных ЭВМ печать происходила на АЦПУ - алфавитно-цифровое печатающее устройство. Это сложный агрегат, способный печатать не только цифры, но и буквы латиницы и кириллицы, а также различные символы. В АЦПУ заправляется специальная фальцованная бумага шириной 42 см с перфорацией по краям. Длинная лента бумаги сложена не рулоном, а гармошкой, состоящей из листов, между которыми также есть перфорация, позволяющая при необходимости без проблем разделить длинную ленту на отдельные листы. Эта разница особенно ощутима после работы на М-20, где мы довольствовались распечаткой чисел на узкой ленте. Всё познаётся в сравнении.
С появлением широкой печати и возможностью печатать различные символы возник немалый простор для побочного творчества программистов. Какой-то неленивый энтузиаст, имя которого потеряно, создал для печати на АЦПУ свою версию Джоконды. Она была чёрно-белой со всеми необходимыми полутонами и состояла из множества символов, имевшихся в распоряжении АЦПУ и соответственно создателя портрета. Джоконда была узнаваемой, никто бы не ошибся в её идентификации. Если правильно подобрать символы, на печати они дадут тёмные и светлые участки, а также переходы от тёмных к светлым, что создаст полутона. Символы по-разному заполняют предназначенное им место на бумаге. Например, компактное расположение некоторого количества буквы Ж создаст тёмный участок, а буквы О - участок светлее. Поскольку в распоряжении АЦПУ есть множество символов, можно эмпирически выбрать нужные. Не исключено, что для создания Джоконды её творец написал не просто программку, а сделал её с изменяющимися параметрами и варьировал их, пока не добился хорошего результата.
Чёрно-белая Джоконда была популярна. Она висела в машинных залах и в других местах, где обитали программисты, проникала и туда, где причастность к программированию была косвенной, а то её и вовсе не было.
Но вернёмся к нашей программе. Отдав её в работу в виде колоды перфокарт, обратно вы помимо своей колоды получаете распечатку итогов работы программы. Прежде всего на ней распечатана ваша программа, написанная на Алголе, далее идут синтаксические ошибки, допущенные в тексте программы. Если ошибок нет, значит, программа отработала и выдала на печать предусмотренные вами результаты. Если они не вполне такие, какие вам нужны, вы анализируете, что же в вашей программе не так, исправляете ошибки вышеописанными способами и вновь отдаёте программу в работу. И так до победного конца. Программисту важно уметь быстро локализовать и устранять ошибки. Его квалификация помимо грамотного написания программ заключается также в том, чтобы процесс отладки был техничным, эффективным и происходил за максимально короткое время.
На этом можно закончить рассказ о начале начал, потому что дальше было уже не начало, а продолжение. С той поры утекло так много времени, сфера IT так сильно изменилась и усложнилась, что сейчас уже трудно представить, с чего это начиналось более пятидесяти лет назад. Я попробовала дать об этом некоторое представление.
(C) Солодовникова Елена
февраль 2024г.
|