«Упрощённые системы кодирования», которые затем стали называть привычным нам термином «языки программирования», появились очень давно. Одним из первых языков, которые действительно упростили работу операторов вычислительных машин, стал язык, разработанный Аликом Гленни в 1952 году. О нём сегодня и поговорим.

Что это за язык

В середине прошлого века код писался сразу на машинном языке или ассемблере, это был понятный машинам код. Не зря примерно в то же время появились различные научно-фантастические произведения, в которых с машинами взаимодействовали при помощи специальных звуков (свиста), мысли и т. п. — программировать было реально сложно. Ошибок можно было наделать много, а кодить приходилось долго. Каждая операция, адрес задавались в виде кодов, которые кроме написания нужно было затем ещё и разместить на перфокартах.

Кстати, если вы соскучились по ним либо хотите проверить свой скил DIY-мастера, у нас есть статья о том, как создать считыватель для перфокарт из современных компонентов.

Первый, можно сказать, высокоуровневый язык программирования был разработан Аликом Гленни в 1952 году для компьютера Mark I. Гленни работал в Манчестерском университете. Сам компьютер разработали Алан Тьюринг, Алик Гленни и другие специалисты, так что Гленни лучше других понимал, что нужно для того, чтобы наладить более эффективную работу с машиной.

ЭВМ, для которой разработан язык

«Марк I» (Automatic Sequence Controlled Calculator, сокращённо ASCC — автоматический вычислитель, управляемый последовательностями) — одна из первых в США вычислительных машин с возможностью программирования. Разработан и построен в США в 1944 году по субподрядному договору с IBM группой из пяти инженеров-разработчиков под руководством капитана 2-го ранга ВМФ США Говарда Эйкена на основе более ранних наработок британского учёного Чарльза Бэббиджа. Программа исследований и создания машины финансировалась ВМФ США.

Генподрядчиком выступала компания IBM. После завершения работ по отладке вычислитель был передан в распоряжение флота и использовался им на завершающем этапе Второй мировой войны. Это была очень большая и сложная система, так что понятно, что работали над ней не два человека. «Марк I» представлял собой усовершенствованный арифмометр, заменявший труд примерно 20 операторов с обычными ручными устройствами.

Компьютер содержал около 765 тысяч деталей (электромеханических реле, переключателей и т. п.), достигал в длину почти 17 м (машина занимала в Гарвардском университете площадь в несколько десятков квадратных метров), в высоту — более 2,5 м и весил около 4,5 тонны. Общая протяжённость соединительных кабелей составляла почти 800 км. Основные вычислительные модули синхронизировались механически при помощи 15-метрового вала, приводившегося в движение электрическим двигателем мощностью в 5 л. с. (4 кВт).

Машина была примечательна таблицей текстовых символов, вот она:

0  00000   /   8	00010   %   16   00001   T   24   00011   O
1  10000   E   9	10010   D   17   10001   Z   25   10011   B
2  01000   @   10   01010   R   18   01001   L   26   01011   G
3  11000   A   11   11010   J   19   11001   W   27   11011   "
4  00100   :   12   00110   N   20   00101   H   28   00111   M
5  10100   S   13   10110   F   21   10101   Y   29   10111   X
6  01100   I   14   01110   C   22   01101   P   30   01111   V
7  11100   U   15   11110   K   23   11101   Q   31   11111   ?

Современному специалисту может показаться, что никакой системы здесь нет. Но на самом деле она есть, просто битовая раскладка повторяет коды международного телеграфного кода тех лет.

А мы продолжаем

Автор Autocode решил облегчить работу себе и коллегам и создал язык, который компилируется машиной. Именно поэтому можно считать, что проект был первым в мире компилируемым языком. Правда, с этим утверждением можно и поспорить, так что холивары по этому поводу можем запустить в комментариях.

Вот участок кода для машины, это уже код Autocode:

c@VA t@IC x@½C y@RC z@NC
INTEGERS +5 →c       	# Put 5 into c
  	→t             	# Load argument from lower accumulator
                     	# to variable t
   +t     TESTA Z    	# Put |t| into lower accumulator
   -t
      	ENTRY Z
SUBROUTINE 6 →z      	# Run square root subroutine on
                     	# lower accumulator value
                     	# and put the result into z
  +tt →y →x          	# Calculate t^3 and put it into x
  +tx →y →x
+z+cx   CLOSE WRITE 1	# Put z + (c * x) into
                     	# lower accumulator
                     	# and return

И ещё несколько примеров кода. Вот, например, участок программы, который позволял сложить два числа:

LOAD A, 5  // Загрузить число 5 в регистр A
ADD A, 3   // Добавить число 3 к значению в регистре A
STORE A, B // Сохранить результат в регистр B

А вот вычисление факториала числа:

LOAD A, 1 // Загрузить число 1 в регистр A
LOAD B, 5 // Загрузить число 5 в регистр B
LOAD C, 1 // Загрузить число 1 в регистр C
 
LOOP:
  MUL A, C  // Умножить значение в регистре A на значение в регистре C
  INC C     // Увеличить значение в регистре C на 1
  CMP C, B  // Сравнить значение в регистре C со значением в регистре B
  JLE LOOP  // Перейти к метке LOOP, если значение в регистре C меньше или равно значению в регистре B
 
STORE A, D // Сохранить результат в регистр D

И, наконец, проверка чётности числа:

LOAD A, 10   // Загрузить число 10 в регистр A
DIV A, 2 	// Разделить значение в регистре A на 2
MOD A, B 	// Получить остаток от деления и сохранить в регистр B
CMP B, 0 	// Сравнить значение в регистре B с 0
JNZ ODD  	// Перейти к метке ODD, если значение в регистре B не равно 0
// код, выполняющийся в случае, если число чётное
JMP END  	// Перейти к метке END
ODD:
// код, выполняющийся в случае, если число нечётное
END:

Это, можно сказать, был опыт, язык использовали далеко не все сотрудники, имевшие доступ к компьютеру. В документах того времени говорится, что влияние Autocode на программистов было совсем незначительным.

Но через несколько лет всё изменилось.

Mark 1 AutoCode и другие языки

Это ещё один язык программирования, разработанный коллегой Гленни, Тони Брукером. Он стал почти полностью машинно-независимым, арифметическим с плавающей запятой. К сожалению, у него не было возможности вставить более одной операции в строку, предлагалось несколько мнемонических имён.

Но потом Брукер создал и ещё один автокод, уже для компьютера Ferranti Mercury. К слову, в то время для каждой машины нужен был собственный уникальный язык. То, что разработали Гленни и Брукер для Mark I, не годилось для других машин.

Этот язык уже немного напоминал то, что появится позже. Можно сказать, что Autocode Mercury был предшественником Algol, правда, без концепций стека выполнения, динамических массивов и рекурсии. Если требовалась длинная программа, она писалась в виде глав. Каждая из них была оверлейной программой для работы с небольшим объёмом памяти машины.

Ну и наконец, позже появился EDSAC 2, разработанный Дэвидом Хартли из математической лаборатории Кембриджского университета. Язык разработан в 1961 году. Хартли доработал Mercury и адаптировал к новым условиям. Достоинства языка — в оптимизации объектного кода.

Более поздние версии автокода уже были универсальными, с ними можно было работать на разных платформах, работал язык без изменений. Также появилось определение типов данных, что сделало код эффективным.

Фактически автокоды стали предтечами современных языков программирования. Основы и концепции, заложенные тогда, стали базой для современной практики кодинга.

Комментарии (2)


  1. saipr
    25.09.2023 15:52
    +3

    Читая статью, я вспоминал как меня учили программированию на автокоде на ЭЦВМ М-220 и как потом на нем я написал транслятор РПГ М-220.
    Я решил посмотреть в интернете как создавался автокод у нас в СССР. И тут мне попалось на глаза замечательное издание


    Рекомендуемая форма библиографической ссылки: Луховицкая Э.С., Езерова Г.Н.
    Информатика в ИПМ им.М.В.Келдыша. 1960-е годы // Препринты ИПМ им. М.В.Келдыша. 2013.
    No 29. 33 с. URL: http://library.keldysh.ru/preprint.asp?id=2013-29

    Я прочитал как захватывающий детектив. Чего стоит одно это:


    Несколько слов о ПАПА (Программе Автоматического Присвоения
    Адресов). В процессе программирования и отладки программ в кодах машины
    возникает необходимость переставить, заменить, вставить или выбросить
    отдельные группы команд или чисел, или заимствовать некоторые куски из уже
    имеющихся программ. Такие действия, выполняемые вручную, очень
    трудоемки, т.к. они требуют систематической коррекции большого числа
    адресов. ПАПА взяла на себя труд освободить программиста от этой
    механической работы. Выполняя его указания, ПАПА формировала программу
    с нужного адреса и выдавала ее на перфокарты для последующего ввода и счета.

    Мне показалось, что это будет хорошим дополнением к данной статье.


  1. aborouhin
    25.09.2023 15:52
    +3

    Что-то первый листинг сильно отличается от остальных. Второй, третий и четвёртый примеры - чистый макроассемблер, с привязкой к конкретным регистрам и инструкциям процессора. А в первом самостоятельная, хоть и своеобычная, арифмеиическая нотация.