Фортран как культурное явление
Футурама, специальная выпивка для роботов
В фильме «Скрытые фигуры» есть прекрасная сцена: на дворе 1961–62, афроамериканка из лабораторий НАСА едет в библиотеку для белых и тихонько без разрешения увозит оттуда книжку по Фортрану. На автобусе увозит. Сопровождая это комментарием своему сыну: «А что? Я плачу налоги».
Фортран перестал быть просто языком программирования, это давно культурный феномен. Настолько, что стал иллюстрацией в борьбе чернокожих женщин за свои права (попробуйте, навскидку, придумать ещё хоть одно понятие из ИТ, которое можно было бы положить в эту категорию).
Масштаб явления очень легко недооценить: на современный избалованный взгляд ничего такого волшебного в Фортане нет. Зато если немного разобраться в контексте, становится понятно, что Фортран — просто квантовый скачок, уделавший все альтернативные разработки минимум на 10 лет.
Единорог в женском обувном
История началась настолько необычно, что хоть кино снимай.
В 1944 в военный госпиталь в Атлантик-сити прибыл 20-летний солдат, на практику. Так получилось, что солдат-студент попал работать в нейрохирургию, и кто-то из коллег обратил внимание на странность его черепа. У солдата реально рос рог, слева.
Рог — костный рак — солдату удалили, прикрыли дырку в черепе размером с пол-ладошки накладкой, и отправили на реабилитацию и дальнейшую учёбу-работу в Нью-Йорк. Там у солдата после замены одной накладки на другую внезапно полностью пропал интерес к медицине, зато появился интерес к математике, и он поступил в Колумбийский университет.
IBM building в то время
В 1950, уже выпустившись, новоиспечённый математик волею случая прогуливался мимо 590 Мэдисон, IBM building. Как раз в 1950 там в соседнем здании бывшего женского обувного магазина установили что-то типа демонстрационного ВЦ, несколько тогдашних IBM SSEC, видимых с улицы через большую витрину. IBM прощупывала рынок и пиарилась таким вот оригинальным способом.
Математик — его звали Джон Бэкус — заинтересовался и зашёл посмотреть, попросил поговорить с шефом, решил две задачки — и был принят на работу программистом SSEC.
Главной фичей этих в общем очень сложных и неудачных машин была концепция хранимой программы, что в теории позволяло писать машинный код, порождающий другой код. SSEC — первая серийная машина с такой возможностью. Тем не менее, эта фича не очень-то использовалась — просто не было инструментов — и конечно, программисты пытались такой инструмент создать. Тогда из этого получился примитивный очень медленный интерпретатор, прототип Speedcoding.
Через год Бэкуса перевели на только что появившуюся IBM 701, писать софт для расчёта траекторий баллистических ракет. Занятие это он очень не любил и искал способ ускорить кропотливый и нудный процесс программирования циклических FP-вычислений на машине с фикс. точкой. Так Speedcoding получил дальнейшее развитие уже на новой машине, был отлит как спек и выпущен в сообщество.
Спек занятный: Speedcoding внешне выглядит как трёхадресный ассемблер с шириной команды в 72 бита. В отличие от просто ассемблера Speedcoding оперирует сразу FP-числами (команда, кроме опкода, содержит три 10-битных указателя), и к мат. оператору внутри команды может быть пришит безусловный или условный переход по результатам исполнения. Из коробки поддерживаются синусы-косинусы, логарифмы и всё такое.
Это было невероятно круто, но очень медленно. «Духовенство» (priesthood, по словам Бэкуса) идею похоронило.
Духовенство
В 50-х почти любым управленцем, слышавшем про компьютеры хоть что-то, программирование считалось искусством в полном смысле. То-есть очень плохо предсказуемым по срокам процессом, где-то между просто безвредными заклинаниями и откровенно чёрной магией.
Понятно, что люди, практикующие магию, автоматом образуют очень узкую касту по признаку владения уникальным скиллом — в данном случае это было программирование в машинных кодах. И высокое духовенство программистов в машинных кодах тогда в идее высокоуровневых языков Бэкусу отказало, точнее — по его словам — просто не заметило.
По итогам нескольких очень холодных презентаций идеи по комьюнити в конце весны 1954 Бэкус пошел питчить идею Фортрана (он, правда, тогда ещё так не назывался) своему начальству. Но — после некоторых предварительных наработок — уже как компилятор.
Контекст
К началу 50-х сразу несколько коллективов инженеров пришли к выводу, что разумно записывать последовательность вычислений не в кодах процессора, а в вызовах подпрограмм, и иметь интерпретатор, исполняющий эти вызовы. Идея — прекрасный пример конвергентной эволюции: Бэкуса к ней привела лень (в каждом втором интервью он про это говорит), Мокли — проработка идей Тьюринга (Лос-Аламос 1976, не помню кто), Цузе по этому поводу тоже что-то говорил в 1976 там же.
Идея для начала 50-х была рискованной: сообществом программистов подход считался в основном тупиковым, и небезосновательно. Реализации как Speedcoding для IBM 701, так и Short Code для ENIAC (Мокли) были интерпретаторами, и кратно (а то и на порядки) проигрывали по скорости программам, написанным вручную в кодах процессора.
С учётом того, что объём RAM измерялся тысячами слов, и например Speedcoding занимал 300 36-битных слов из 1024, идея запросто могла показаться нежизнеспособной.
Удивительно, что примерно к началу 1954 в MIT уже был компилятор, транслирующий мат. формулы в более-менее человеческой записи в машинный код для Whirlwind I. Про этот компилятор Лэнинга-Цирлера вообще мало упоминаний, у него даже собственного имени нет, но Бэкус его видел, и много раз признавал, что эта работа оказала на синтаксис Фортрана определённое влияние. Из работы видно, что влияние было довольно существенным.
Чисто синтаксически, тем не менее, работа Лэнинга-Цирлера была очень ограниченной, как и многие предыдущие: имплицитное умножение (это когда ab значит a×b, то-есть только однобуквенные переменные разрешены), типографские индексы для возведения в степень и единственная команда ветвления CR — это ну очень неудобно. Но главная проблема компилятора Лэнинга-Цирлера была в том, что он был написан для компьютера, существующего в единственном экземпляре.
IBM 701 при этом расходился как горячие пирожки (аж 19 машин за два года), на подходе был IBM 704, который поддерживал FP аппаратно, и его надо было на чём-то программировать. В общем, в начале 1954 Бэкусу дали карт-бланш на команду под проект, машинное время, помещение со столами типа нынешних опенспейсов — и полгода времени.
Проект
Результатом проекта должна была стать символическая система записи математических расчётов с упором на циклические вычисления, и компилятор к этой символической системе. Главным требованием была эффективность порождаемого кода: хотелось, чтобы порождаемый код был близок по эффективности к написанному вручную.
Ну и надо было придумать плоский (без над/подстрочников и спецсимволов) синтаксис, который позволяет эффективно организовывать циклы, ветвление расчётов и взятие/запись значений по индексу.
Также существенным драйвером проекта была экономика: к тому моменту уже было видно, что к каждому компьютеру прикладывается «духовенство», обходящееся примерно так же дорого, как и сам компьютер (сотни тысяч в месяц). Удешевление программирования и отладки считалось чуть не главной официальной целью.
К маю 1954 команда из 4 человек занимала помещение на 19 этаже в боковом крыле IBM building. В цокольном этаже стоял IBM 701, на нём покупатели в очереди на машину могли тестировать свои программы. Ночное время было отдано команде. Первый код на Фортране заработал в режиме интерпретации 20 сентября 1954.
10 ноября 1954 появился драфт спецификации: Preliminary Report, Specifications for the IBM Mathematical FORmula TRANslating System, FORTRAN. Основные фичи этого драфта:
двухсимвольные имена переменных, начинающиеся на i…n — целые 15 бит со знаком, остальные — FP
1…3-мерные массивы
подстрочные индексы записываются как
A(3*I+N,M)
илиA(N(I,J), M(K,L))
, скобки выражений внутри индексов запрещеныфункции синтаксически отличаются от переменных тем, что имеют имя от 3 символов длиной
номера строк называются «номер формулы»
синтаксис циклов
DO
и ветвленийIF
— в зачаточном состоянииуже есть
go to
и ввод-выводникакой обработки ошибок, с замечанием, что профессионал, мол и так поймёт, что сломалось
есть явный синтаксис для указания компилятору на часто используемый код, для оптимизации.
В целом это мало похоже на знакомый Фортран, в частности, операторных скобок ещё не придумали, и поэтому цикл выглядел, например, так: DO 10, 15, 25 I=4, 20, 2
. Это значит «исполняй формулы с 10-й по 15-ю, начни с i=4, шаг 2, закончи на i=20 и потом перейди к формуле 25».
Fortan I
Полностью работающий компилятор очень близкий к первой спецификации появился в конце 1956, Programmer«s Reference Manual к нему прекрасно написан и свёрстан, и там всего 50 страниц с широченными полями.
Основные синтаксические отличия — 6-символьные переменные, ещё более ужасный чем в драфте синтаксис для IF
, зато улучшенный для DO
, и богатый ввод-вывод разных сортов. Операторных скобок всё ещё не было.
Тем не менее под капотом Fortran I был совершенно удивительный для тех времён шестистадийный оптимизирующий компилятор. Сам Бэкус о нём вспоминал так:
Это было волнующее время. Когда мы начали анализировать фрагменты машинного кода, порождённого компилятором, мы были поражены изменениями в порядке вычислений и оптимизации индексных операций. Мы бы никогда не сделали таких оптимизаций вручную.
К апрелю 1957 компилятор перешел в стадию готовности к распространению, и было принято передать его всем примерно 30 пользователям IBM 704. Один комплект распространения состоял из ~2000 перфокарт, 5 кило Фортрана.
Первые пользователи были в восторге, оно сразу работало, а если не работало — сообщения об ошибках были на человечьем языке: Computers&Automation №11 1971, p17.
К концу 1957 было продано ~30 машин IBM 704, и более половины из них использовали Фортран минимум в половине задач.
Fortran II
Вторая версия вышла через год после первой. Она содержала исправления ошибок — и две новых супер-фичи: подпрограммы и функции. То-есть функциональные выражения-однострочники типа DIST(X,Y)=SQRT(X**2+Y**2)
были и в Фортране I, но многострочные функции появились только в версии II. Правда, без рекурсии на ближайшие 2–3 года.
На заднем плане — книжка Митчелл. https://comic.browserling.com/49
Примечательно, что дополнительный код компилятора для новых фич практически в одиночку реализовала Grace E. Mitchell, по совместительству автор прекрасной книги Programmer«s Primer for Fortran, расширенного руководства к языку. Бэкус с удивлением вспоминал, что она сдала весь код раньше графика, чего раньше там не случалось, и всё сразу заработало.
Увы, в Фортран II операторные скобки и нормальный IF так и не появились. Тем не менее, к началу 1959 более половины машинного кода для 66 установленных IBM 704 было сгенерировано компилятором Фортрана.
Fortran IV и 66
Разработка следующей версии началась в 1961, по запросам пользователей. Предполагалось убрать машинно-зависимые фичи, добавить логический тип данных и булевы выражения в IF, и выпускать компиляторы сразу под несколько видов несовместимых на уровне машинного кода компьютеров IBM.
В том-же 1961 появилось две первых реализации Фортрана под не-IBM машины: UNIVAC и Rand. Фортран набирал популярность с такой скоростью, что к 1962, когда Fortran IV наконец вышел для IBM 7090, существовало уже 8 компиляторов под разные не-IBM платформы. Ещё через год их было уже 40.
В 1962 был создан комитет по стандартизации Фортрана при ASA, само по себе беспрецедентное событие — языки программирования никто до этого не стандартизировал, и было вообще непонятно, как это делать. Тем не менее в 1966 Fortran IV стал национальным стандартом Fortran 66. Занятно, что строкового типа данных в стандарте ещё нет, но зато есть Hollerith type, специальный грязный хак для уталкивания букв в числовые константы.
Нормальный IF (с ELSE) также не завезли, но в условии IF уже можно писать логические выражения.
К концу 60-х Фортран был абсолютно везде, и даже — о ужас — в 1968 был назван разработчиками Бейсика устаревшим языком! А в 1971, когда примерно 90% мат. расчётов считали Фортраном, Rober F. Rosin объявил, что Фортран и вовсе мёртв. Так всегда бывает с продуктами, доминирующими на каком-то рынке: кто-нибудь непременно считает их мёртвыми просто потому что они ему не нравятся.
Fortran style
Нелюбовь академического сообщества к Фортрану, в общем, была оправдана. Операторные скобки так и не появились — так что никакого структурного программирования, рекурсия была нечастой опцией, а Hollerith constants вместо текста и вовсе были просто уродливыми.
Стандарт Fortran 77, опубликованный в 1978, прикрыл самые страшные огрехи — появились строки, ELSE
и всякое такое. Но в общем уже было понятно, что из ниши высокопроизводительной математики Фортран не выберется. Но и никуда не исчезнет, потому что в том же 1978 Фортран 77 с некоторыми дополнениями был стандартизирован министерством обороны.
Примечательно, что зло от GO TO
в высокоуровневых языках уже было в целом хорошо осознанно комьюнити, и в качестве шутки предлагалось вовсе запретить букву O в Фортране, ну чтобы не путали с 0
и чтобы GO TO
даже написать было нельзя.
Характерный стиль написания софта на Фортране породил в 70…80-х сразу несколько мемов, самый известный из которых — «Настоящий программист может писать Фортран-программы на любом языке».
В СССР
К 1978 Фортран в СССР укоренился настолько, что в доме моих родителей появилась книжка Карпова про Фортран. Какими судьбами она там оказалась, я выснить не смог — программированием никто не интересовался.
Эта книжка случайно попала мне в руки лет через 9–10 практически нетронутой — некоторые страницы были не разрезаны. Английский нам преподавали со 2 класса, всё было понятно — только вот применить это было совершенно негде. Зато когда мне через 2 года попался Бейсик и Агат-8 в компьютерном кружке при Дворце пионеров, первая программа написалась за 10 минут.
В культуре
Главное наследие Фортрана — подход к разработке компиляторов: хороший компилятор должен выдавать быстрый код. По этому показателю Фортран уделывал все конкурирующие разработки минимум до конца 60-х, на Фортран равнялись все.
Второе главное наследие: подход к разработке софта. Техники программирования на Фортране (вернее, неудобства) сыграли огромную роль в популяризации идеи «структурного программирования» и отказе от GOTO.
Конечно, при таком распространении в инженерной среде 60…70-х, Фортран неизбежно стал просачиваться «в народ», в массовую культуру. Музыка, компьютерное искусство, мультипликация, даже настольная игра была.
В 1978 MIT выпустил и вовсе книжку-раскраску по Фортрану, выдержала 6 переизданий. В СССР была выпущена аж полноценная серия образовательных комиксов для младших школьников, сразу единой книгой почти на 200 страниц, «Энциклопедия профессора Фортрана» — жаль поздно, в 1991.
Ещё, согласно Forebears на Земле живёт несколько десятков людей по фамилии Фортран.
Вы даже можете увековечить Фортран в мебели, тканью для диванных подушек под названим Fortran in Woodland. На ней при некотором воображении можно разглядеть узор из заглавных F.
И вообще, Фортран — это астероид, открытый в 1985. Он с нами очень надолго.
Ну и самое главное: именно благодаря Фортрану мы точно знаем, что GOD is REAL.