- PVSM.RU - https://www.pvsm.ru -

Фортран как культурное явление

Футурама, специальная выпивка для роботов

Футурама, специальная выпивка для роботов

В фильме «Скрытые фигуры» есть прекрасная сцена: на дворе 1961-62, афроамериканка из лабораторий НАСА едет в библиотеку для белых и тихонько без разрешения увозит оттуда книжку по Фортрану. На автобусе увозит. Сопровождая это комментарием своему сыну: «А что? Я плачу налоги».

Фортран перестал быть просто языком программирования, это давно культурный феномен. Настолько, что стал иллюстрацией в борьбе чернокожих женщин за свои права (попробуйте, навскидку, придумать ещё хоть одно понятие из ИТ, которое можно было бы положить в эту категорию).

Масштаб явления очень легко недооценить: на современный избалованный взгляд ничего такого волшебного в Фортане нет. Зато если немного разобраться в контексте, становится понятно, что Фортран – просто квантовый скачок, уделавший все альтернативные разработки минимум на 10 лет.

Единорог в женском обувном

История началась настолько необычно, что хоть кино снимай.

В 1944 в военный госпиталь в Атлантик-сити прибыл 20-летний солдат, на практику. Так получилось, что солдат-студент попал работать в нейрохирургию, и кто-то из коллег обратил внимание на странность его черепа. У солдата реально рос рог, слева.

Рог – костный рак – солдату удалили, прикрыли дырку в черепе размером с пол-ладошки накладкой, и отправили на реабилитацию и дальнейшую учёбу-работу в Нью-Йорк. Там у солдата после замены одной накладки на другую внезапно полностью пропал интерес к медицине, зато появился интерес к математике, и он поступил в Колумбийский университет.

IBM building в то время

IBM building в то время

В 1950, уже выпустившись, новоиспечённый математик волею случая прогуливался мимо 590 Мэдисон, IBM building. Как раз в 1950 там в соседнем здании бывшего женского обувного магазина установили что-то типа демонстрационного ВЦ, несколько тогдашних IBM SSEC [1], видимых с улицы через большую витрину. IBM прощупывала рынок и пиарилась таким вот оригинальным способом.

Математик – его звали Джон Бэкус – заинтересовался и зашёл посмотреть, попросил поговорить с шефом, решил две задачки – и был принят на работу программистом SSEC.

Главной фичей этих в общем очень сложных и неудачных машин была концепция хранимой программы [2], что в теории позволяло писать машинный код, порождающий другой код. SSEC – первая серийная машина с такой возможностью. Тем не менее, эта фича не очень-то использовалась – просто не было инструментов – и конечно, программисты пытались такой инструмент создать. Тогда из этого получился примитивный очень медленный интерпретатор, прототип Speedcoding [3].

Через год Бэкуса перевели на только что появившуюся IBM 701, писать софт для расчёта траекторий баллистических ракет. Занятие это он очень не любил и искал способ ускорить кропотливый и нудный процесс программирования циклических FP-вычислений на машине с фикс. точкой. Так Speedcoding получил дальнейшее развитие уже на новой машине, был отлит как спек [4] и выпущен в сообщество.

Спек занятный: 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 уже был компилятор [5], транслирующий мат. формулы в более-менее человеческой записи в машинный код для 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 [6], 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 [7] к нему прекрасно написан и свёрстан, и там всего 50 страниц с широченными полями.

Основные синтаксические отличия – 6-символьные переменные, ещё более ужасный чем в драфте синтаксис для IF, зато улучшенный для DO, и богатый ввод-вывод разных сортов. Операторных скобок всё ещё не было.

Тем не менее под капотом Fortran I был совершенно удивительный для тех времён шестистадийный оптимизирующий компилятор. Сам Бэкус о нём вспоминал так:

Это было волнующее время. Когда мы начали анализировать фрагменты машинного кода, порождённого компилятором, мы были поражены изменениями в порядке вычислений и оптимизации индексных операций. Мы бы никогда не сделали таких оптимизаций вручную.

К апрелю 1957 компилятор перешел в стадию готовности к распространению, и было принято передать его всем примерно 30 пользователям IBM 704. Один комплект распространения состоял из ~2000 перфокарт, 5 кило Фортрана.

Первые пользователи были в восторге, оно сразу работало, а если не работало – сообщения об ошибках были на человечьем языке: Computers&Automation №11 1971, p17 [8].

К концу 1957 было продано ~30 машин IBM 704, и более половины из них использовали Фортран минимум в половине задач.

Fortran II

Вторая версия вышла через год после первой. Она содержала исправления ошибок – и две новых супер-фичи: подпрограммы и функции. То-есть функциональные выражения-однострочники типа DIST(X,Y)=SQRT(X**2+Y**2) были и в Фортране I, но многострочные функции появились только в версии II. Правда, без рекурсии на ближайшие 2–3 года.

На заднем плане – книжка Митчелл. https://comic.browserling.com/49

На заднем плане – книжка Митчелл. https://comic.browserling.com/49

Примечательно, что дополнительный код компилятора для новых фич практически в одиночку реализовала Grace E. Mitchell, по совместительству автор прекрасной книги Programmer’s Primer for Fortran [9], расширенного руководства к языку. Бэкус с удивлением вспоминал, что она сдала весь код раньше графика, чего раньше там не случалось, и всё сразу заработало.

Увы, в Фортран 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 [10]. Занятно, что строкового типа данных в стандарте ещё нет, но зато есть Hollerith type [11], специальный грязный хак для уталкивания букв в числовые константы.

Нормальный IF (с ELSE) также не завезли, но в условии IF уже можно писать логические выражения.

К концу 60-х Фортран был абсолютно везде, и даже – о ужас – в 1968 был назван разработчиками Бейсика устаревшим языком! А в 1971, когда примерно 90% мат. расчётов считали Фортраном, Rober F. Rosin объявил, что Фортран и вовсе мёртв [12]. Так всегда бывает с продуктами, доминирующими на каком-то рынке: кто-нибудь непременно считает их мёртвыми просто потому что они ему не нравятся.

Fortran style

https://onionesquereality.wordpress.com/2014/01/29/the-evolution-of-programming-languages/

https://onionesquereality.wordpress.com/2014/01/29/the-evolution-of-programming-languages/ [13]

Нелюбовь академического сообщества к Фортрану, в общем, была оправдана. Операторные скобки так и не появились – так что никакого структурного программирования, рекурсия была нечастой опцией, а Hollerith constants вместо текста и вовсе были просто уродливыми.

Стандарт Fortran 77, опубликованный в 1978, прикрыл самые страшные огрехи – появились строки, ELSE и всякое такое. Но в общем уже было понятно, что из ниши высокопроизводительной математики Фортран не выберется. Но и никуда не исчезнет, потому что в том же 1978 Фортран 77 с некоторыми дополнениями был стандартизирован министерством обороны.

Примечательно, что зло от GO TO в высокоуровневых языках уже было в целом хорошо осознанно комьюнити, и в качестве шутки предлагалось вовсе запретить букву O в Фортране, ну чтобы не путали с 0 и чтобы GO TO даже написать было нельзя.

Характерный стиль написания софта на Фортране породил в 70…80-х сразу несколько мемов, самый известный из которых – «Настоящий программист может писать Фортран-программы на любом языке [14]».

В СССР

К 1978 Фортран в СССР укоренился настолько, что в доме моих родителей появилась книжка Карпова про Фортран. Какими судьбами она там оказалась, я выснить не смог – программированием никто не интересовался.

Эта книжка случайно попала мне в руки лет через 9–10 практически нетронутой – некоторые страницы были не разрезаны. Английский нам преподавали со 2 класса, всё было понятно – только вот применить это было совершенно негде. Зато когда мне через 2 года попался Бейсик и Агат-8 в компьютерном кружке при Дворце пионеров, первая программа написалась за 10 минут.

В культуре

Главное наследие Фортрана – подход к разработке компиляторов: хороший компилятор должен выдавать быстрый код. По этому показателю Фортран уделывал все конкурирующие разработки минимум до конца 60-х, на Фортран равнялись все.

Второе главное наследие: подход к разработке софта. Техники программирования на Фортране (вернее, неудобства) сыграли огромную роль в популяризации идеи «структурного программирования» и отказе от GOTO.

Конечно, при таком распространении в инженерной среде 60…70-х, Фортран неизбежно стал просачиваться «в народ», в массовую культуру. Музыка [15], компьютерное искусство, мультипликация, даже настольная игра [16] была.

В 1978 MIT выпустил и вовсе книжку-раскраску по Фортрану [17], выдержала 6 переизданий. В СССР была выпущена аж полноценная серия образовательных комиксов для младших школьников, сразу единой книгой почти на 200 страниц, «Энциклопедия профессора Фортрана» – жаль поздно, в 1991.

Ещё, согласно Forebears на Земле живёт несколько десятков людей по фамилии Фортран [18].

Вы даже можете увековечить Фортран в мебели, тканью для диванных подушек под названим Fortran in Woodland [19]. На ней при некотором воображении можно разглядеть узор из заглавных F.

И вообще, Фортран – это астероид [20], открытый в 1985. Он с нами очень надолго.

Ну и самое главное: именно благодаря Фортрану мы точно знаем, что GOD is REAL [21].

Автор:
ermouth

Источник [22]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/ibm/385192

Ссылки в тексте:

[1] IBM SSEC: https://en.wikipedia.org/wiki/IBM_SSEC

[2] хранимой программы: https://en.wikipedia.org/wiki/Stored-program_computer

[3] Speedcoding: https://en.wikipedia.org/wiki/Speedcoding

[4] отлит как спек: https://archive.computerhistory.org/resources/access/text/2018/02/102678975-05-01-acc.pdf

[5] компилятор: https://archive.computerhistory.org/resources/text/Fortran/102653982.05.01.acc.pdf

[6] Preliminary Report: https://archive.computerhistory.org/resources/text/Fortran/102679231.05.01.acc.pdf

[7] Programmer’s Reference Manual: http://bitsavers.informatik.uni-stuttgart.de/pdf/ibm/704/704_FortranProgRefMan_Oct56.pdf

[8] Computers&Automation №11 1971, p17: http://www.bitsavers.org/magazines/Computers_And_Automation/197111.pdf

[9] Programmer’s Primer for Fortran: https://archive.computerhistory.org/resources/text/Fortran/102653987.05.01.acc.pdf

[10] Fortran 66: https://wg5-fortran.org/ARCHIVE/Fortran66.pdf

[11] Hollerith type: https://en.wikipedia.org/wiki/Hollerith_constant

[12] Фортран и вовсе мёртв: https://dl.acm.org/doi/pdf/10.1145/873674.873675

[13] https://onionesquereality.wordpress.com/2014/01/29/the-evolution-of-programming-languages/: https://onionesquereality.wordpress.com/2014/01/29/the-evolution-of-programming-languages/

[14] Настоящий программист может писать Фортран-программы на любом языке: https://www.pbm.com/~lindahl/real.programmers.html

[15] Музыка: https://(https://en.wikipedia.org/wiki/Fortran_5)

[16] настольная игра: https://www.computerhistory.org/collections/catalog/X1005.89

[17] книжку-раскраску по Фортрану: https://archive.org/details/9780262610261/page/n3/mode/2up

[18] по фамилии Фортран: https://forebears.io/surnames/fortran

[19] Fortran in Woodland: https://allaboutfabrics.com/products/richloom%C2%A9-fortran-in-woodland

[20] астероид: https://minorplanetcenter.net/db_search/show_object?object_id=9548

[21] GOD is REAL: https://ell.stackexchange.com/questions/163171/god-is-real-unless-declared-integer

[22] Источник: https://habr.com/ru/articles/740018/?utm_source=habrahabr&utm_medium=rss&utm_campaign=740018