vak: (Default)
[personal profile] vak
Была ли жизнь до динозавров? Что там вообще шевелилось? 😀 Я не имею в виду теоретически, а чем реально программисты пользовались.

Жизнь была, хотя и в странных формах. С 1959 года существовал MAD, то есть Michigan Algorithm Decoder. Вполне развитый для того времени язык программирования. К примеру, на MAD был написан MAIL (ставший впоследствии /usr/bin/mailx) и RUNOFF (ставший потом nroff/troff). Описание языка: MAD-manual.pdf.

Для иллюстрации вот рекурсивная функция вычисления факториала. Конструкции языка многословные, зато суть сразу понятные. Имена функций, в отличие от переменных, обязаны заканчиваться точкой.
            EXTERNAL FUNCTION (N)
NORMAL MODE IS INTEGER
ENTRY TO FACT.
WHENEVER N .E. 0, FUNCTION RETURN 1
SAVE RETURN
SAVE DATA N
T1 = FACT.(N-1)
RESTORE DATA N
RESTORE RETURN
FUNCTION RETURN T1*N
END OF FUNCTION
Несколько лет назад известный товарищ Эрик Рэймонд воссоздал компилятор MAD. Сайт проекта: gitlab.com/esr/mad. Попробуем запустить вышеприведённый факториал. Добавим главную вызывающую процедуру:
            DIMENSION LIST(100)
NORMAL MODE IS INTEGER
SET LIST TO LIST
BACK READ FORMAT IN, NR
PRINT FORMAT OUT, NR, FACT.(NR)
TRANSFER TO BACK
VECTOR VALUES IN = $I2*$
VECTOR VALUES OUT = $4H0N= I3,14HN FACTORIAL= I11*$
END OF PROGRAM
Компилируем, запускаем:
$ mad factmain.mad factfunc.mad 
$ ./factmain
6

N= 6N FACTORIAL= 720
10

N= 10N FACTORIAL= 3628800
Работает в лучшем виде. MAD транслируется в Си, который дальше компилируется в нативный бинарник.

Исторический факт: известная Элиза, первая программа, общавшаяся на естественном языке, была изначально написана на языке SLIP (варианте Лиспа), который сам был написан на MAD. Исходный код той Элизы: 1966_01_CACM_article_Eliza_script.txt.

Date: 2024-09-14 00:17 (UTC)
fizzik: (Default)
From: [personal profile] fizzik
А что означает "NORMAL MODE IS INTEGER"? Дефолтный тип для переменной, чтобы не объявлять его явно для T1?

Date: 2024-09-14 01:46 (UTC)
sab123: (Default)
From: [personal profile] sab123
Ой, ручной стек с SAVE/RESTORE?

Date: 2024-09-14 05:52 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Память тогда была не резиновая.
Хорошо ещё, что не надо было адрес возврата явно сохранять.

Зачем в данном случае сохранять ячейку для возврата значения, неясно.

Date: 2024-09-14 07:01 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Ого сколько чудесного.

Языки-то, конечно, были. Фортран, например. На нём что угодно можно было написать (особенно если немножко конструкций навалять на ассемблере).

Date: 2024-09-14 07:11 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Тогда, значит, всё сама. Но и так неплохо, всяко лучше, чем в Фортране было.

Date: 2024-09-14 20:26 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Вообще мой многолетний опыт с фортраном научил меня чему:
- можно написать всё;
- каждая строка фортрана мапится на несколько команд ассемблера, никакого смешивания и перехлёста;
- в результате можно на ассемблере навалять несколько конструкций - и можно всё - case statement, while, filter, foreach, etc;
- нужна хорошая библиотека для строк (что мы и сделали);
- система месседжей, и система контроля событий ("дёрни меня, когда давление станет выше стольки-то при стольких-то оборотах" - это пишется в виде логической формулы, в DNF)...
- поменьше сложностей, побольше доступности для простых инженеров. У нас приходили люди, и врубались быстро (а кто не врубался, тех я не держал).

Короче, система реального времени, многозадачная, с горячим рестартом (бекап в "своп спейс") - на буровой же электричество вырубают пару раз в день.

Мне иногда кажется, что в этом было что-то уникальное. Архитектура сдёрнута с Дейкстровской системы THE.