| |||
![]()
|
![]() ![]() |
![]()
Фортран Вова Патрышев предается воспоминаниям про 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 - в порядке эксперимента я ее переписал на Паскаль(впрочем ее кжется там на все возможное языки народ переписывал - благо программка простая и прикольная). |
||||||||||||||
![]() |
![]() |