Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет kouzdra ([info]kouzdra)
@ 2011-10-28 09:12:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Фортран
Вова Патрышев предается воспоминаниям про 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)
правда программировать их приходилось на асме либо с использованием написанных на асме хаков для. [info]leshij-frir@lj тогда как раз то ли в качестве курсовика, то ли диплома написал к Фортрану строковую либу, вполне в общем в стиле неизвестного ему тогда еще С, и за счет активного юзания этой фичи - поудобнее: всеж-таки возможность писать
      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 - в порядке эксперимента я ее переписал на Паскаль(впрочем ее кжется там на все возможное языки народ переписывал - благо программка простая и прикольная).