[Перевод] FORTRAN — первый язык высокого уровня

Возможно, это был первый в мире язык высокого уровня и Майк Бедфорд обнаруживает, что FORTRAN жив и процветает по сей день.

Когда FORTRAN только зарождался, языков высокого уровня практически не существовало, и уж тем более не было таких, которые получили бы широкую известность. Сейчас, когда такие языки стали практически универсальными, необходимо помнить, что языки высокого уровня были созданы для облегчения работы программиста. Раньше код писался на «родных» инструкциях компьютера, определяемых его аппаратной частью. С помощью языка высокого уровня стало возможным использование инструкций, приближенных к человеческим. Кроме того, появилась возможность переносить программы с одного компьютера на другой, хотя при разработке FORTRAN это не учитывалось, поскольку язык изначально создавался специально для компьютера IBM 704.

Сегодня об этом практически забыли, но научный компьютер IBM 704 сыграл важную роль в запуске проекта FORTRAN.

Сегодня об этом практически забыли, но научный компьютер IBM 704 сыграл важную роль в запуске проекта FORTRAN.

Оригинальный FORTRAN был представлен в 1957 году и содержал всего 32 инструкции, что сильно отличает от большинства современных языков. Более того, некоторые из этих инструкций были привязаны к аппаратному обеспечению IBM 704, поэтому они были удалены из более поздних версий, которые должны были стать аппаратно независимыми.

Команда IBM, занимавшаяся разработкой FORTRAN, возглавлялась Джоном Бэкусом, имя которого вы можете узнать по нотации Backus Naur Form.

Команда IBM, занимавшаяся разработкой FORTRAN, возглавлялась Джоном Бэкусом, имя которого вы можете узнать по нотации Backus Naur Form.

Если вы хотите попробовать свои силы в кодинге на FORTRAN 1957, то компилятора FORTRAN для IBM 704 вы не найдете. Однако, хотя некоторые инструкции, специфичные для оригинального FORTRAN 704, в последующем были удалены, каждая версия FORTRAN сохраняла большинство (но не все) инструкций своих предшественников для обеспечения обратной совместимости. Таким образом, вы можете использовать более современный компилятор, но при этом только оригинальные инструкции и избегать использования тех, которые были удалены совсем недавно. Пожалуй, наиболее авторитетным FOSS-компилятором является GFortran (GNU Fortran), доступный в основных репозиториях. Если же хотите сразу опробовать код на FORTRAN перед тем, как перейти к локально установленному решению, — воспользуйтесь онлайн-ресурсом Try It Online, который позволяет сразу увидеть результат работы вашего кода и фактически использует компилятор GFortran.

В качестве первого примера мы предлагаем попробовать, а затем, возможно, и модифицировать следующий код, написанный на оригинальной версии языка FORTRAN. Обратите внимание, что мы намеренно оставили в этом коде ошибку, которую вы обнаружите, если введете значение 10 или больше, так что, возможно, Вам получится ее исправить. Она выводит факториал числа — факториалом числа является результат умножения всех положительных чисел до этого числа включительно. По определению, факториал нуля равен 1, а факториала отрицательного числа не существует.

      READ 30,N
   30 FORMAT(I2)
      IF(N) 40,60,70
   40 PRINT 50
   50 FORMAT(17HCAN’T BE NEGATIVE)
      GOTO 110
   60 NFAC=1
      GOTO 90
   70 NFAC=1
      DO 80 I=1,N
      NFAC=NFAC*I
   80 CONTINUE
   90 PRINT 100,NFAC
  100 FORMAT(I6)
  110 STOP
      END

Несколько комментариев помогут вам понять код. В 1957 году компьютеры, как правило, не имели терминалов типа VDU или телетайпов, поэтому оператор READ должен был считывать данные с перфокарты. Если вы используете Try It Online, введите в область Input значение для чтения — число, для которого нужно вычислить факториал, и которое было бы считано с перфокарты. По умолчанию все имена переменных, начинающиеся с букв I, J, K, L, M или N, считаются целыми числами; переменные, начинающиеся с любой из других букв, — вещественными. Операторы READ и PRINT ссылаются на оператор FORMAT по номеру строки, определяющий способ интерпретации или отображения данных. Например,  FORMAT, связанный с оператором READ, указывает, что ожидается целочисленное значение, состоящее максимум из двух цифр, а FORMAT, связанный с последним оператором PRINT, указывает, что оно должно быть выведено в виде шестизначного целого числа. Оператор IF — это арифметический оператор IF, в отличие от логического IF, который мы чаще всего используем в других языках и который появился только в более поздней версии FORTRAN. Арифметический IF ветвится на одну из трех строк, в зависимости от того, является ли результат выражения в скобках отрицательным, нулевым или положительным соответственно. Цикл DO завершается оператором CONTINUE, номер строки которого указан в операторе DO. Изначально использовались только прописные буквы, хотя сейчас большинство компиляторов допускают использование строчных букв. Код имеет фиксированный формат. Символ C в первом столбце означает, что строка является комментарием, необязательный номер строки может быть указан в столбцах 1–5, любой символ в столбце 6 означает, что строка является продолжением предыдущей строки, а собственно оператор отображается в столбцах 7–72.

Более подробно об оригинальном FORTRAN можно узнать из справочника IBM Programmer’s Reference Manual.

Возможно, лучшим способом проиллюстрировать зрелость FORTRAN является указание на то, что в IBM 704, на котором он был впервые запущен, использовались электронные лампы.

Возможно, лучшим способом проиллюстрировать зрелость FORTRAN является указание на то, что в IBM 704, на котором он был впервые запущен, использовались электронные лампы.

Продолжение пути

Поскольку оригинальный FORTRAN содержал всего 32 инструкции, некоторые из которых были связаны с уникальным аппаратным обеспечением IBM 704, неудивительно, что с течением времени FORTRAN был расширен. Первое расширение получило название FORTRAN II, оно по-прежнему предназначалось исключительно для использования на 704-й модели и добавляло поддержку подпрограмм и функций, определяемых пользователем, что, безусловно, было большим недостатком исходного FORTRAN, плюс комплексные числа. Существовал также FORTRAN III, но он так и не был опубликован.

Еще одно свидетельство того, что в момент создания FORTRAN мир был совсем другим: программистам приходилось носить с собой огромные стопки перфокарт с кодом.

Еще одно свидетельство того, что в момент создания FORTRAN мир был совсем другим: программистам приходилось носить с собой огромные стопки перфокарт с кодом.

Первым действительно важным обновлением стал FORTRAN IV. Он поддерживался на гораздо более широком спектре компьютеров и на несколько лет стал языком де-факто для научных, инженерных и математических приложений. Он появился в 1962 году и, если пропустить FORTRAN 66, который по сути был тем же самым, что и FORTRAN IV, но названный так в связи с тем, что в 1966 году он был принят в качестве стандарта ANSI, оставался неоспоримым до появления FORTRAN 77. Основным отличием FORTRAN IV от FORTRAN II стало введение логического оператора IF, примером которого является IF (N.EQ.10) I=I+1 . Заметим, что, в отличие от большинства более современных языков, реляционные операторы представляли собой не символы =, >, < и т.д., а двухбуквенные коды, окруженные точками. Так, например, реляционный оператор в нашем предыдущем примере был "меньше или равно", а другие, значения которых очевидны - это .NE.,  .GT.,  .GE.,  .LT. и .LE.. Их можно было комбинировать с логическими операторами .OR.,  .AND. и .NOT.. Однако концепция структуры IF … THEN … ELSE отсутствовала, несмотря на то, что блоки уже появились в ALGOL. Единственным оператором в FORTRAN IV, предполагавшим выполнение блока кода, был DO … CONTINUE. Другим главным новшеством FORTRAN IV стала замена поддержки устройств массового хранения данных, реализованной в оригинальном FORTRAN для IBM 704, на более общую поддержку устройств массового хранения данных. Если вам наскучил оригинальный FORTRAN, но вы все же хотите получить некоторый опыт работы с классическим FORTRAN, под которым мы имеем в виду версию, которой более полувека, то FORTRAN IV — ваш очевидный выбор. Руководство по языку IBM System/360 FORTRAN IV. А вот код, который можно использовать в качестве первого примера:

      GR = (1 + SQRT (5.0))/2
      NMARK=78
      PRINT 10
   10 FORMAT(39H N FIBONACCI GOLDEN RATIO WITHIN 0.001%)
      NFIB1=1
      NFIB2=1
      DO 200 N=1,30
      IF(N.GT.2) GOTO 50
      NFIB=1
      GOTO 60
   50 NFIB=NFIB1 + NFIB2
      NFIB1=NFIB2
      NFIB2=NFIB
   60 GRAPP=REAL(NFIB)/REAL(NFIB1)
      ERR=ABS(GR-GRAPP)/GR*100
      IF(ERR.LT.0.001) NMARK=89
      PRINT 100,N,NFIB,GRAPP,NMARK
  100 FORMAT(I2,XXXX,I6,XX,F11.9,X,A1)
  200 CONTINUE
  210 STOP
      END

Прежде чем приступить к рассмотрению кода, необходимо объяснить, что он делает. Сначала вычисляется и выводится N-е число Фибоначчи для значений N от 1 до 30. Первые два числа Фибоначчи определяются как 1 и 1, а все последующие числа являются суммой двух предыдущих. Таким образом, первые несколько чисел Фибоначчи — это 1, 1, 2, 3, 5, 8, 13 и 21. Далее, для каждого N мы также рассчитываем и выводим приближенное значение золотого сечения и указываем с помощью символов N или Y, находится ли оно в пределах 0,001% от действительного значения. Золотое сечение — если вы не знакомы с этим понятием, мы рекомендуем вам почитать о нем, это очень интересно. Если вернуться к числам Фибоначчи, то соотношения пар последовательных чисел Фибоначчи все больше приближаются к реальному значению золотого сечения.

Теперь уместно сделать несколько замечаний по поводу кода. Основное отличие этого кода от программы, написанной на оригинальном языке FORTRAN, заключается в использовании логического оператора IF. В первой строке вычисляется фактическое значение золотого сечения. Хотя FORTRAN IV не поддерживает переменные символьных строк, целочисленная переменная может хранить значение ASCII, и если затем напечатать его, используя обозначение A в операторе FORMAT, то будет напечатан соответствующий символ. Такой переменной является NMARK, а значения ASCII для N и Y равны 78 и 89 соответственно. Мы используем несколько функций, в том числе SQRT и ABS, но особое внимание заслуживает REAL в строке 60. Она необходима, поскольку мы делим два целых числа, и если бы мы не использовали функцию REAL, то результат был бы целочисленным.

Мы не будем так подробно рассматривать все преемники FORTRAN IV/66 — их было достаточно много, но кратко опишем основные особенности наиболее важных версий. В FORTRAN 77 к оператору IF была добавлена опция ELSE, а также введено понятие блоков, но только для оператора IF. Впервые был добавлен символьный тип данных. Со временем была добавлена поддержка блочной структуры, включающая конструкции DO WHILE и CASE. С появлением Fortran 90, и это не опечатка, с наступлением 1990-х годов FORTRAN стал Fortran — требование помещать номера строк и операторов в определенные столбцы было ослаблено. Также было разрешено использовать сочетание символов верхнего и нижнего регистров, а прежнее требование использовать только заглавные буквы было отголоском эпохи перфокарт. Fortran 90 также допускал рекурсию и позволял работать с массивами как с единым целым, а не с отдельными элементами в цикле или во вложенных циклах. Объектно-ориентированная обработка появилась в Fortran 2003, а с появлением Fortran 2008 была реализована поддержка параллельной обработки. Вскользь следует упомянуть также Fortran 95 и Fortran 2018, но мы пропустим мимо ушей замечание, возможно, анафемное для приверженцев FORTRAN, о том, что добавленные в них новые возможности были довольно незначительными.

Сегодня на ПК под управлением Linux можно запустить FORTRAN или практически любой другой язык. Однако если мы перейдем от термина «ПК» к термину «домашний компьютер», то те, у кого длинная память, вспомнят бум домашних компьютеров начала 80-х годов. И практически все эти компьютеры предлагали один-единственный встроенный язык программирования: Basic. Интересно, однако, что FORTRAN появился и на самых ранних микропроцессорных компьютерах.

Персональные компьютеры в самом широком смысле этого слова появились в начале 70-х годов, многие из них были построены на базе 8-разрядного процессора Intel 8080 образца 1974 года, а также его близких родственников — Intel 8085 и Zilog Z80. Они были дорогими, поэтому широко использовались в ранних бизнес-приложениях, а также привлекали состоятельных любителей. Даже в те ранние времена, несмотря на большое разнообразие, на первый план выходила стандартизация в виде операционной системы CP/M. С 1977 по конец 80-х годов CP/M появилась на целом ряде компьютеров, хотя иногда только при наличии дополнительного сопроцессора. Хотя большинство этих компьютеров принадлежали уже забытым именам, другие компании, включая Acorn, Amstrad, Atari, Commodore и Tandy, также продавали машины на базе CP/M. В основном он не входил в стандартную комплектацию, но когда другие пользователи домашних компьютеров программировали на Basic, FORTRAN позволил пользователям CP/M взять на вооружение более совершенный язык.

В то время, как другие домашние компьютеры 80-х годов работали только на Basic, Amstrad CPC 464 предлагал в качестве опции CP/M, а значит, и FORTRAN.

В то время, как другие домашние компьютеры 80-х годов работали только на Basic, Amstrad CPC 464 предлагал в качестве опции CP/M, а значит, и FORTRAN.

FORTRAN сегодня

Если бы мы были более критичными, то могли бы назвать FORTRAN устаревшим языком. Конечно, он продолжает обновляться, но можно утверждать, что новые версии представляют собой запоздалые попытки внедрить парадигмы программирования, которые уже десятилетиями были общепринятыми в других языках. Например, блочная ориентация начала ограниченно проявляться только в FORTRAN 77, почти через 20 лет после того, как это понятие было введено в ALGOL. А если взять пример объектной ориентации, то она появилась только в Fortran 2003, появившемся на сцене не менее чем через 31 год после того, как язык Simula впервые познакомил мир с этой парадигмой. Однако если все это справедливая критика, то будет несколько удивительно узнать, что, согласно последнему индексу популярности языков программирования TIOBE, FORTRAN сегодня занимает вполне достойное 14-е место.

Чтобы узнать больше о том, что FORTRAN по-прежнему привлекателен, мы побеседовали с Рафиком Зуробом, менеджером по разработке компилятора IBM Open XL Fortran. Для начала мы хотели узнать, какие организации используют FORTRAN и в каких типичных приложениях. Из ответа Рафика следовало, что что он используется в высших эшелонах вычислительной техники для передовых исследований. «FORTRAN обычно используется для высокопроизводительных вычислений и других приложений, требующих больших вычислений. В качестве примера можно привести научное моделирование и симуляцию в области прогнозирования погоды, физики, химии, биологии, медицины, астрономии и искусственного интеллекта. Среди крупных пользователей — крупные исследовательские лаборатории в США и Европе, — рассказал он.

Но используется ли он только для поддержки устаревших приложений, или на FORTRAN сегодня пишутся новые проекты? По всей видимости, верно и то, и другое, — продолжил Рафик. «Хотя унаследованные библиотеки FORTRAN по-прежнему составляют значительную часть пользовательской базы FORTRAN, многие пользователи также используют новые возможности более поздних стандартов FORTRAN. Использование FORTRAN также изменилось: вместо того, чтобы использовать его для написания всего приложения, теперь он чаще используется для написания вычислительных ядер для приложения. Другие языки, такие как C/C++ или Python, используются для написания пользовательского интерфейса или другого кода, вызывающего вычислительное ядро. В результате многие пользователи не подозревают, что используют библиотеки FORTRAN. Например, если вы пользовались модулями SciPy или NumPy в Python, то, скорее всего, использовали библиотеку BLAS, написанную на FORTRAN. В настоящее время программы на FORTRAN также часто используют спецификации OpenMP или MPI для добавления параллелизма (множество одновременных потоков в одной программе), выгрузки на ускорители, такие как GPU, и распределения, то есть взаимодействия между разными программами, возможно, на разных компьютерах. Это позволило использовать преимущества FORTRAN на больших суперкомпьютерах, имеющих несколько CPU и GPU».

Список Top500, публикуемый дважды в год, определяет 500 самых быстрых суперкомпьютеров в мире, и в настоящее время в нем лидирует 8 699 904-ядерный Frontier, расположенный в Национальной лаборатории DOE/SC/Oak Ridge в США. Это единственный компьютер, производительность которого превысила 1EFLOPS, т.е. один квинтиллион (1 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000) инструкций с плавающей точкой в секунду, что измеряется с помощью бенчмарка LINPACK.

При такой производительности — в 100 000 раз большей, чем у игровых ПК высшего класса — выбор подходящего языка очень важен для того, чтобы использовать его по максимуму. Поэтому интересно отметить, что практически во всем, что можно прочитать о программном обеспечении Frontier, упоминаются всего три языка: C, C++ и FORTRAN. И это не единичный случай. С момента создания первого компьютера с хранимыми программами до появления первого экзафлопсного компьютера прошло 74 года, но другие уже идут по пятам. Например, готовящийся к выпуску суперкомпьютер El Capitan, расположенный в Ливерморской национальной лаборатории имени Лоуренса, имеет проектную скорость, вдвое превышающую скорость Frontier, а Aurora, расположенная в Аргоннской национальной лаборатории, как ожидается, превысит этот показатель в 2EFLOPS. И, хотя о поддерживаемых El Capitan языках пока ничего не говорится (но мы можем предположить), как и Frontier, Aurora будет программироваться на языках C/C++ и FORTRAN. Может ли быть лучшее свидетельство о языке 50-х годов, чем то, что в 2023 году на нем будут работать самые требовательные приложения в мире?

В мире высокопроизводительных вычислений FORTRAN остается очень важной рабочей лошадкой.

В мире высокопроизводительных вычислений FORTRAN остается очень важной рабочей лошадкой.

Итак, какие же преимущества FORTRAN способствовали его использованию в настоящее время и как в этом отношении он соотносится с более современными языками? По словам Рафика, «FORTRAN — это язык высокого уровня, что дает компилятору больше возможностей для оптимизации. Примером тому может служить конструкция указателей. FORTRAN позволяет пользователю указывать цели, к которым может обращаться указатель. Это позволяет компилятору построить более точный анализ алиасинга, чем в других языках, таких как C, в которых указатели могут адресоваться к чему угодно». Остается только гадать, вызовут ли Python и Java столь благожелательные отзывы через полвека.

© Habrahabr.ru