Фортран
kouzdra — 28.10.2011
Вова Патрышев предается
воспоминаниям про subj: Чем фортран специфически хорошо -
1to1 мапингом строк программы на ассемблерный код.Я с этим продуктом сумрачного американского гения 50-х годов столкнулся в 10-м классе (во второй половине 81 года) на СМ-4 - успев уже покувыркаться с годик на Минск-22 с А-60 и немножко летом на производственной практике попрограммировать на ассемблере PDP-11 (практика была в ЛИАПе в какой-то лаборатории где еще стояла огромная механическая рука, которая что-то даже умела, для управления ей и стояла Электроника-60*, с которой я и поигрался).
Надо сказать что после Минск-22 где все делалось при помощи пульта,перфоленточек RSX-11M была большим прогрессом - вполне нормальные, хоть и медленные терминалы, даже редактор экранный где-то в середине года появился (назывался TED). В общем вполне пристойно. И был там Фортран.
Помню что главное чем впечатлил меня оный - тем, что я будучи развращенным A-60 и молодым и глупым никак не мог поверить, что там нельзя ввести число и создать массив введенного размера. Мне это казалось совершенно естественным. Все искал пути. Вообще - после Алгола-60 Фортран представлялся изрядным уродцем (которым и был) - правда вполне практичным. Но самое смешное там касалось кода - компилировал он вообще не в ассемблер, а в прямой шитый код - своего роде виртуальную машину, только у которой не байт-код, а адреса подпрограмм.
Что-то вроде:
a + 1 =>
.word $load
.word a
.word $const
.word 1
.word $add
Где
$load: mov @(r4)+, -(sp)
jmp @(r4)+
$const:mov (r4)+, -(sp)
jmp @(r4)+
$add: add (sp)+, (sp)
jmp @(r4)+
Примеры условные (а r4 выполнял функции счетчика команд**) - я
ессно уже не помню точно какие там псевдокоманды были. В принципе
фортран умел генерить и асм (с ключиками fis или eis), но этим
пользовались как-то достаточно умерено - выигрыша по перформансу
оно особенно не давало.Пожалуй единственная специфически тамошняя языковая конструкция которая меня привлекла - была возможность делать функции с переменным числом аргументов и "необязательными параметрами в середине":
call subr (a,b,,c)правда программировать их приходилось на асме либо с использованием написанных на асме хаков для.
call cat ('[', s, ']', s1)
вместо цепочки strcpy и strcat или
call substr (src,1,,dst)вместо
call substr (src,1,strlen(src)+1,dst)заметно облагораживает.
Поскольку в Фортране передача параметров - по ссылке - то представить отсутствующий параметр можно просто адресом - что и делалось (функции null на DEC-овских ОС-ах традиционно выполнял -1 - с С потом были трудности - поскольку обращение по нулевому адресу было вполне корректно и аппаратурой не ловилось***).
В ассемблерный код это компилилось смешным извратом:
call func
br next
.word arg1
.word arg2
...
next:
Прикол тут состоял в том, что у команды короткого перехода вперед в младшем байте сидит как раз число слов, на сколько перейти - то есть - число аргументов функции.
Кувыркался с этим чудом я недолго - года два - в начале 82 приволокли Паскаль****, а в ЛГУ уже на ЕС-ках был A-68, бывший уже и по современным понятиям вполне нормальным языком, да и скоро народился С. Хотя на первом курсе пришлось - в лаборатории Чиркова на СМ-4 жили Star Trek и Adventure (его тогда как-то хакал Фима Монарх), ну и желание в них поковыряться вынуждало.
Но в общем Фортран совершенно не смотрелся - даже в сравнении с ассемблером (тем более что ассемблер PDP-11 - видимо самый удобный для ручного кодирования ever made). Потом еще в конце 80-х пришлось годик с ним иметь дело в порядке сопровождения программули, которая считала всякие электромагнитные штуки. Там было великое программирование со списками и структурами данных (надо же описывать геометрическую конфигурацию устройства), имитируемыми в целочисленных массивах (ассоциировалось это более всего с "через жопу и автогеном"), но тьфу-тьфу этот ужас уже был более или менее позади.
Никакого кайфа я не испытал - по сравнению с "настоящими" автокодами (даже минским АКИ) Фортран был уродом, как раз вполне изолирующим программиста от аппаратуры. Ну а появление A-68 и С (да даже пожалуй и PL/I) лишило его остатков обаяния.
*) Такая хардкорная - почти в базовой конфигурации - перфоратор, перфолетна и пишмашка в виде консоли, заодно если надо выполнявшая и функцию принтера. Правда был дисплей и можно было на нем редактировать текст: грузишь с перфоленты редактор, потом редактор грузит с перфоленты текст, правишь его и сбрасываешь обратно на перфоленту :)
**) Обращу внимание - "интерпретатор шитого кода" тут размазан по подпрограммам и состоит в одной команде в конце - jmp @(r4)+ - r4 там выполнял функцию указателя команд.
***) Историческая болячка PDP-11 - то что адресное пространство (64KB) меньше физической памяти - потому каждому процессу отводилась память начиная с нулевых адресов - ну а верх мог двигаться туда-сюда (также как в unix sbrk). В принципе - аппаратура позволяла подрезать и нижнюю границу - но сделано это в RSX-11 не было (за ненадобностью) - потому с NULL были проблемы - сделать его не нулем С не позволял, а обращение по нулевому адресу не вызывало прерывания.
****) Почти одновременно с Паскалем кто-то приволок и Элизу - правда, почем-то написанную на PL/I - в порядке эксперимента я ее переписал на Паскаль(впрочем ее кжется там на все возможное языки народ переписывал - благо программка простая и прикольная).
|
|
</> |
Обзор модельного ряда Belgee: характеристики X70, X50 и S50
Пространство альтернативных реальностей
Предновогодний Петербург
Сталинский "Самокат"
Враги!..
Сварочные электроды ОЗЛ-32 — технические характеристики
О женщинах русских селений Почему провалился «их план»?
С Рождеством католическим!
А вот за то...

