На пятом курсе у нас появился новый предмет – программирование для ЭВМ (если бы это было на первом, как теперь, я провел бы пять лет с гораздо большей пользой). Машина была «Урал-2», ламповая, занимала огромный зал, а чтобы ввести в нее программу, надо было замкнутую фотоленту установить на сложное устройство, напоминавшее стиральную машину. Система команд была примитивная, например, для модификации адреса данных внутри цикла приходилось изменять адрес ячейки памяти непосредственно в команде – программа изменяла себя по мере выполнения (какая свобода для творчества!).
Тем не менее, принципы работы компьютера не изменились с тех пор и, соответственно, программирование, несмотря на все современные парадигмы, требует от человека тех же качеств, что и в те далекие годы. Суперпрограммист 60—70-х был бы суперпрограммистом и сегодня.
Программировать я стал сразу. На зачетах писал программы за всех друзей и других желающих. Мне это нравилось и получалось легко. Чисто случайно я попал по распределению в вычислительный центр вместо аспирантуры и фактически почти двадцати пять лет программировал. Это моя профессия.
В 1970 году мне пришлось программировать для ЭВМ «Минск-22» в машинных кодах, и я до сих пор помню систему команд «Минск-22». Например, программа вычисления факториала целого числа N! = N * (N-1) * … * 3 * 2 * 1 выглядит приблизительно следующим образом (аргумент N передается в ячейке 0040, результат N! возвращается в ячейке 0041):
7000) – 10 00 7005 0041 переслать 1 в ячейку 0041 (Здесь будет N!)
7001) – 32 00 0040 0041 умножить 0041 на N (Далее в 0040 будет N–1)
7002) – 22 00 7005 0040 вычесть 1 из 0040 (Получить в 0040 N–1)
7003) – 34 00 7001 0000 если после вычитания не ноль, то повторить с 7001
7004) – 30 00 0017 0000 возврат в вызывающую программу
7005) – 00 00 0000 0001 константа – целая 1.
Для отладки надо было идти в машинный зал и работать непосредственно за пультом. Программу набивали на перфоленту и вводили в память машины, а затем скорректированный вариант записывали на магнитную ленту (во времена всеобъемлющего дефицита кое-кто пытался использовать эту ленту в бытовых магнитофонах, но благодаря своим, как кто-то остроумно заметил, абразивным качествам она буквально спиливала магнитные головки несчастных магнитофонов, которые были еще более дефицитны, чем лента). Программист за пультом должен был точно представлять свою программу в памяти. Все данные, команды и адреса читались и набирались в двоичной системе непосредственно на пульте управления ЭВМ. Когда программист работал быстро, он напоминал со стороны пианиста.
Я старался брать машинное время ночью – во-первых, нет конкуренции за время (женщины-программистки, а их было почему-то очень много, предпочитали работать днем), во-вторых, можно работать до результата. Работа мне нравилась, шеф меня ценил.
Мне сильно повезло с первым шефом – Александром Михайловичем Гуляевым. Он был суперпрограммистом. Чтобы ввести в профессию, он заставил меня отладить написанный им довольно большой комплекс программ для шахтной вентиляции. После этого я стал одновременно модульным, структурным и, возможно уже тогда, объектно и сервисно ориентированным. Модные парадигмы создаются не программистами, а так называемыми менеджерами. Эти менеджеры никогда ничего не пишут сами и не могут написать в силу отсутствия соответствующих способностей, но полезную функцию (что-то подсмотреть и своевременно прокричать) выполняют. К сожалению, Гуляев никогда не стремился к признанию, рано ушел в себя и умер где-то на станции космических лучей. Другого суперпрограммиста, моего старшего, как он любил говорить, приятеля Володю Медведева, который мог написать эффективную программу для чего угодно, вообще убили при дурацких обстоятельствах. Хорошие программисты не часто добиваются в жизни того, чего могли бы, и чего принято добиваться, и чего всегда добиваются менеджеры.
Потом был долгий период ЕС ЭВМ и алгоритмических языков – «Фортран», «ПЛ/1» и др. На одном из алгоритмических языков программа вычисления факториала могла бы выглядеть так:
fact:= 1; n1:= n;
do while (n1>0); fact:= fact * n1; n1:= n1 – 1; end;
Специальная программа – компилятор – переводит этот текст в машинный код, который может быть выполнен компьютером. Ясно, что записывать программы удобнее на языке, но от разработки алгоритма язык не освобождает.
Отражая объектно-ориентированную структуру окружающего мира, алгоритмическое программирование (через модульное, структурное и др.) эволюционировало в объектно-ориентированное, в котором объект, тем не менее, представляется совокупностью алгоритмов.
Другой подход в программировании связан с разработками в области искусственного интеллекта. Теоретической базой искусственного интеллекта является логика, а в практическом программировании используются языки функционального и логического программирования.
Например, функцию вычисления факториала можно определить в виде функции следующим образом: