Fortran ( / ˈ f ɔːr t r æ n / ; ранее FORTRAN ) — компилируемый императивный язык программирования третьего поколения , который особенно подходит для числовых вычислений и научных расчетов .
Fortran изначально был разработан IBM . [3] Впервые он был правильно скомпилирован в 1958 году. [4] Компьютерные программы Fortran были написаны для поддержки научных и инженерных приложений, таких как численное прогнозирование погоды , конечно-элементный анализ , вычислительная гидродинамика , физика плазмы , геофизика , вычислительная физика , кристаллография и вычислительная химия . Это популярный язык для высокопроизводительных вычислений [5] и используется для программ, которые тестируют и ранжируют самые быстрые суперкомпьютеры в мире . [6] [7]
Fortran развивался через многочисленные версии и диалекты. В 1966 году Американский национальный институт стандартов (ANSI) разработал стандарт для Fortran, чтобы ограничить распространение компиляторов, использующих немного отличающийся синтаксис. [8] Последующие версии добавили поддержку символьного типа данных (Fortran 77), структурного программирования , программирования массивов , модульного программирования , универсального программирования (Fortran 90), параллельных вычислений ( Fortran 95 ), объектно-ориентированного программирования (Fortran 2003) и параллельного программирования (Fortran 2008).
С апреля 2024 года Fortran входит в десятку лучших языков в индексе TIOBE — показателе популярности языков программирования. [9]
Первое руководство по FORTRAN описывает его как Formula Translating System (Систему преобразования формул ) и печатает название заглавными буквами : Fortran . [10] : стр. 2 [11] Другие источники предполагают, что название расшифровывается как Formula Translator ( Транслятор формул ) [12] или Formula Translation (Трансляция формул ) [13]
Ранние компьютеры IBM не поддерживали строчные буквы, и названия версий языка вплоть до FORTRAN 77 обычно писались полностью заглавными буквами . [14] FORTRAN 77 была последней версией, в которой набор символов Fortran включал только заглавные буквы. [15]
Официальные стандарты языка Fortran именуют язык «Fortran» с заглавными буквами, начиная с Fortran 90. [ необходима ссылка ]
В конце 1953 года Джон В. Бэкус представил своему руководству в IBM предложение разработать более практичную альтернативу языку ассемблера для программирования их мэйнфреймового компьютера IBM 704. [11] : 69 Историческая команда Бэкуса по FORTRAN состояла из программистов Ричарда Голдберга, Шелдона Ф. Беста, Харлана Херрика, Питера Шеридана, Роя Натта , Роберта Нельсона, Ирвинга Циллера, Гарольда Стерна, Лоис Хайбт и Дэвида Сейра . [16] Ее концепции включали более простой ввод уравнений в компьютер, идею, разработанную Дж. Холкомбом Лэнингом и продемонстрированную в системе Лэнинга и Цирлера 1952 года. [17]
Проект спецификации для IBM Mathematical Formula Translating System был завершен к ноябрю 1954 года. [11] : 71 Первое руководство по FORTRAN появилось в октябре 1956 года, [10] [11] : 72 а первый компилятор FORTRAN был выпущен в апреле 1957 года. [11] : 75 Fortran создавал достаточно эффективный код для программистов на языке ассемблера , чтобы принять замену на языке программирования высокого уровня . [18]
Джон Бэкус сказал в интервью 1979 года журналу Think для сотрудников IBM: «Большая часть моей работы — это результат лени. Мне не нравилось писать программы, и поэтому, когда я работал над IBM 701 , писал программы для вычисления траекторий ракет, я начал работать над системой программирования, чтобы упростить написание программ». [19]
Язык был широко принят учеными для написания численно-интенсивных программ, что побудило авторов компиляторов создавать компиляторы, которые могли бы генерировать более быстрый и эффективный код. Включение в язык типа данных комплексного числа сделало Fortran особенно подходящим для технических приложений, таких как электротехника. [20]
К 1960 году версии FORTRAN были доступны для компьютеров IBM 709 , 650 , 1620 и 7090. Примечательно, что растущая популярность FORTRAN подтолкнула конкурирующих производителей компьютеров к предоставлению компиляторов FORTRAN для своих машин, так что к 1963 году существовало более 40 компиляторов FORTRAN.
FORTRAN был предоставлен для компьютера IBM 1401 инновационным 63-фазным компилятором, который работал полностью в его основной памяти, состоящей всего из 8000 (шестибитных) символов. Компилятор мог запускаться с ленты или с колоды из 2200 карт; он не использовал дополнительную ленту или дисковое хранилище. Он хранил программу в памяти и загружал оверлеи , которые постепенно преобразовывали ее на месте в исполняемую форму, как описано Хейнсом. [21] Эта статья была перепечатана, отредактирована в обоих изданиях Anatomy of a Compiler [22] и в руководстве IBM "Fortran Specifications and Operating Procedures, IBM 1401". [23] Исполняемая форма не была полностью машинным языком ; скорее, арифметика с плавающей точкой, субскриптинг, ввод/вывод и ссылки на функции были интерпретированы, опередив UCSD Pascal P-код на два десятилетия. GOTRAN , упрощенная, интерпретируемая версия FORTRAN I (только с 12 операторами, а не с 32) для операции «загрузить и запустить» была доступна (по крайней мере, для раннего компьютера IBM 1620 ). [24] Современный Fortran и почти все более поздние версии полностью скомпилированы, как это сделано для других высокопроизводительных языков.
Развитие Fortran шло параллельно с ранним развитием технологии компиляторов , и многие достижения в теории и проектировании компиляторов были специально мотивированы необходимостью создания эффективного кода для программ на Fortran.
Первоначальный выпуск FORTRAN для IBM 704 [10] содержал 32 оператора , в том числе:
DIMENSION
и EQUIVALENCE
заявленияIF
оператор, который передавал управление в одно из трех мест в программе в зависимости от того, был ли результат арифметического выражения отрицательным, нулевым или положительным.IF ACCUMULATOR OVERFLOW
, IF QUOTIENT OVERFLOW
, и IF DIVIDE CHECK
); и управляющие операторы для управления сенсорными переключателями и сенсорными лампами ( IF (SENSE SWITCH)
, IF (SENSE LIGHT)
, и SENSE LIGHT
)GO TO
, вычислено GO TO
, ASSIGN
, и назначеноGO TO
DO
петлиFORMAT
, READ
, READ INPUT TAPE
, WRITE OUTPUT TAPE
, PRINT
, иPUNCH
READ TAPE
, READ DRUM
, WRITE TAPE
, иWRITE DRUM
END FILE
, REWIND
, иBACKSPACE
PAUSE
, STOP
, иCONTINUE
FREQUENCY
оператор (для предоставления компилятору подсказок по оптимизации ).Арифметическое IF
выражение напоминало (но не было легко реализовано) инструкцию трехстороннего сравнения (CAS — Compare Accumulator with Storage), имевшуюся на 704. Выражение предоставляло единственный способ сравнения чисел — путем проверки их разницы, с сопутствующим риском переполнения. Этот недостаток был позже преодолен «логическими» возможностями, введенными в FORTRAN IV.
Первоначально (и необязательно) этот FREQUENCY
оператор использовался для задания вероятностей ветвления для трех случаев ветвления арифметического IF
оператора. Его также можно было использовать для указания того, сколько итераций DO
может выполнить цикл. Первый компилятор FORTRAN использовал это взвешивание для выполнения во время компиляции моделирования Монте-Карло сгенерированного кода, результаты которого использовались для оптимизации размещения базовых блоков в памяти — очень сложная оптимизация для своего времени. Метод Монте-Карло описан в статье Бэкуса и др. об этой оригинальной реализации, The FORTRAN Automatic Coding System :
Основная единица программы — базовый блок ; базовый блок — это фрагмент программы, имеющий одну точку входа и одну точку выхода. Целью раздела 4 является подготовка для раздела 5 таблицы предшественников (таблица PRED), которая перечисляет базовые блоки и перечисляет для каждого базового блока каждый из базовых блоков, который может быть его непосредственным предшественником в потоке, вместе с абсолютной частотой каждой такой связи базового блока. Эта таблица получается путем однократного запуска программы в режиме Монте-Карло, в котором результат условных переходов, возникающих из операторов типа IF и вычисленных GO TO, определяется генератором случайных чисел, соответствующим образом взвешенным в соответствии с любыми предоставленными операторами FREQUENCY. [16]
Первый компилятор FORTRAN сообщал диагностическую информацию, останавливая программу при обнаружении ошибки и выводя код ошибки на консоль. Этот код мог быть найден программистом в таблице сообщений об ошибках в руководстве оператора, предоставляя ему краткое описание проблемы. [10] : стр. 19–20 [25] Позже была включена подпрограмма обработки ошибок для обработки пользовательских ошибок, таких как деление на ноль, разработанная NASA, [26] , информирующая пользователей о том, какая строка кода содержала ошибку.
До развития дисковых файлов, текстовых редакторов и терминалов программы чаще всего вводились с клавиатуры перфоратора на 80-колоночные перфокарты , по одной строке на карту. Полученная колода карт подавалась в считыватель карт для компиляции. Коды перфокарт не включали строчные буквы или множество специальных символов, и предлагались специальные версии перфоратора IBM 026 , которые правильно печатали переназначенные специальные символы, используемые в FORTRAN.
Исходя из практики ввода данных с помощью перфокарт, программы на языке Fortran изначально писались в формате с фиксированным количеством столбцов, при этом первые 72 столбца считывались в двенадцать 36-битных слов.
Буква "C" в столбце 1 приводила к тому, что вся карточка рассматривалась как комментарий и игнорировалась составителем. В противном случае столбцы карточки делились на четыре поля:
Столбцы с 73 по 80 могли, таким образом, использоваться для идентификационной информации, такой как перфорация порядкового номера или текста, который мог использоваться для повторного упорядочивания карт, если стопка карт была потеряна; хотя на практике это было зарезервировано для стабильных, производственных программ. IBM 519 мог использоваться для копирования колоды программ и добавления порядковых номеров. Некоторые ранние компиляторы, например, IBM 650, имели дополнительные ограничения из-за ограничений их считывателей карт. [28] Клавиатурные перфораторы могли быть запрограммированы на табуляцию до столбца 7 и пропуск после столбца 72. Более поздние компиляторы смягчили большинство ограничений фиксированного формата, и это требование было устранено в стандарте Fortran 90.
В поле оператора пробельные символы (пробелы) игнорировались вне текстового литерала. Это позволяло опускать пробелы между токенами для краткости или включать пробелы в идентификаторы для ясности. Например, AVG OF X
был допустимым идентификатором, эквивалентным AVGOFX
, и был допустимым оператором, эквивалентным , поскольку ноль в столбце 6 обрабатывается так, как если бы он был пробелом (!), тогда как вместо этого был , присвоение 1.101 переменной с именем . Обратите внимание на небольшое визуальное различие между запятой и точкой.101010DO101I=1,101
10101 DO 101 I = 1, 101
101010DO101I=1.101
10101 DO101I = 1.101
DO101I
Строки Холлерита , изначально разрешенные только в операторах FORMAT и DATA, имели префикс в виде количества символов и буквы H (например, 26HTHIS IS ALPHANUMERIC DATA.
), что позволяло сохранять пробелы в строке символов. Ошибки в подсчетах были проблемой.
FORTRAN II от IBM появился в 1958 году. Главным усовершенствованием стала поддержка процедурного программирования путем разрешения написанных пользователем подпрограмм и функций, которые возвращали значения с параметрами, переданными по ссылке . Оператор COMMON предоставлял подпрограммам способ доступа к общим (или глобальным ) переменным. Было введено шесть новых операторов: [29]
SUBROUTINE
, FUNCTION
, иEND
CALL
иRETURN
COMMON
В течение следующих нескольких лет в FORTRAN II была добавлена поддержка типов данных DOUBLE PRECISION
и COMPLEX
.
Ранние компиляторы FORTRAN не поддерживали рекурсию в подпрограммах. Ранние компьютерные архитектуры не поддерживали концепцию стека, и когда они напрямую поддерживали вызовы подпрограмм, место возврата часто сохранялось в одном фиксированном месте рядом с кодом подпрограммы (например, IBM 1130 ) или в определенном машинном регистре ( IBM 360 и далее ), что допускает рекурсию только в том случае, если стек поддерживается программным обеспечением, а адрес возврата сохраняется в стеке до выполнения вызова и восстанавливается после возврата вызова. Хотя это и не указано в FORTRAN 77, многие компиляторы F77 поддерживали рекурсию как опцию, а мэйнфреймы Burroughs , разработанные со встроенной рекурсией, делали это по умолчанию. Это стало стандартом в Fortran 90 через новое ключевое слово RECURSIVE. [30]
Эта программа для формулы Герона считывает данные с катушки ленты, содержащей три 5-значных целых числа A, B и C в качестве входных данных. Нет доступных объявлений "типа": переменные, имена которых начинаются с I, J, K, L, M или N, являются "фиксированными" (т. е. целыми), в противном случае - с плавающей точкой. Поскольку в этом примере должны обрабатываться целые числа, имена переменных начинаются с буквы "I". Имя переменной должно начинаться с буквы и может продолжаться как буквами, так и цифрами, до предела в шесть символов в FORTRAN II. Если A, B и C не могут представлять стороны треугольника в плоской геометрии, то выполнение программы завершится с кодом ошибки "STOP 1". В противном случае будет напечатана строка вывода, отображающая входные значения для A, B и C, за которыми следует вычисленная ПЛОЩАДЬ треугольника в виде числа с плавающей точкой, занимающего десять позиций вдоль строки вывода и отображающего 2 цифры после десятичной точки, .2 в F10.2 оператора FORMAT с меткой 601.
C ПЛОЩАДЬ ТРЕУГОЛЬНИКА СО СТАНДАРТНОЙ ФУНКЦИЕЙ КВАДРАТНОГО КОРНЯ C ВХОД - УСТРОЙСТВО ЧТЕНИЯ ЛЕНТ 5, ЦЕЛЫЙ ВХОД C ВЫХОД - УСТРОЙСТВО СТРОЧНОГО ПРИНТЕРА 6, ДЕЙСТВИТЕЛЬНЫЙ ВЫХОД C ВХОД ОШИБКИ ОТОБРАЖЕНИЯ ОШИБКИ ВЫХОДА КОД 1 В СПИСКЕ УПРАВЛЕНИЯ ЗАДАНИЯМИ ЧТЕНИЕ ВХОДА ЛЕНТЫ 5 , 501 , IA , IB , IC 501 ФОРМАТ ( 3 I5 ) C IA, IB и IC НЕ МОГУТ БЫТЬ ОТРИЦАТЕЛЬНЫМИ ИЛИ НУЛЕМ C КРОМЕ ТОГО, СУММА ДВУХ СТОРОН ТРЕУГОЛЬНИКА C ДОЛЖНА БЫТЬ БОЛЬШЕ ТРЕТЬЕЙ СТОРОНЫ , ПОЭТОМУ МЫ ПРОВЕРЯЕМ ЭТО ТАКЖЕ ЕСЛИ ( IA ) 777 , 777 , 701 701 ЕСЛИ ( IB ) 777 , 777 , 702 702 ЕСЛИ ( IC ) 777 , 777 , 703 703 ЕСЛИ ( IA + IB - IC ) 777 , 777 , 704 704 ЕСЛИ ( IA + IC - IB ) 777 , 777 , 705 705 ЕСЛИ ( IB + IC - IA ) 777 , 777 , 799 777 СТОП 1 C ИСПОЛЬЗУЯ ФОРМУЛУ ГЕРОНА ВЫЧИСЛЯЕМ ПЛОЩАДЬ ТРЕУГОЛЬНИКА 799 S = FLOATF ( IA + IB + IC ) / 2.0 ПЛОЩАДЬ = SQRTF ( S * ( S - FLOATF ( IA )) * ( S - FLOATF ( IB )) * + ( S - FLOATF ( IC ))) ЗАПИСЬ ВЫХОДНОЙ ЛЕНТЫ 6 , 601 , IA , IB , IC , ОБЛАСТЬ 601 ФОРМАТ ( 4 H A = , I5 , 5 H B = , I5 , 5 H C = , I5 , 8 H ПЛОЩАДЬ = , F10 . 2 , + 13 H КВАДРАТНЫЕ ЕДИНИЦЫ ) СТОП КОНЕЦ
IBM также разработала FORTRAN III в 1958 году, который позволял использовать встроенный ассемблерный код среди других функций; однако эта версия так и не была выпущена как продукт. Как и 704 FORTRAN и FORTRAN II, FORTRAN III включал машинно-зависимые функции, которые делали написанный на нем код непереносимым с машины на машину. [11] : 76 Ранние версии FORTRAN, предоставленные другими поставщиками, страдали от того же недостатка.
IBM начала разработку FORTRAN IV в 1961 году в ответ на требования клиентов. FORTRAN IV удалил машинно-зависимые функции FORTRAN II (такие как READ INPUT TAPE
), добавив новые функции, такие как LOGICAL
тип данных , логические булевы выражения и логический оператор IF в качестве альтернативы арифметическому оператору IF. В конечном итоге FORTRAN IV был выпущен в 1962 году, сначала для компьютера IBM 7030 («Stretch»), затем последовали версии для IBM 7090 , IBM 7094 , а затем для IBM 1401 в 1966 году. [31]
К 1965 году FORTRAN IV должен был соответствовать стандарту, разрабатываемому рабочей группой Американской ассоциации стандартов X3.4.3 FORTRAN. [32]
В период с 1966 по 1968 год IBM предложила несколько компиляторов FORTRAN IV для своей System/360 , каждый из которых был назван буквами, указывающими минимальный объем памяти, необходимый компилятору для работы. [33] Буквы (F, G, H) соответствовали кодам, используемым в номерах моделей System/360 для указания объема памяти, причем каждое увеличение буквы было в два раза больше: [34] : стр. 5
Корпорация Digital Equipment Corporation поддерживала DECSYSTEM-10 Fortran IV (F40) для PDP-10 с 1967 по 1975 год. [35] Компиляторы также были доступны для серии UNIVAC 1100 и систем серий Control Data 6000 и 7000. [36]
Примерно в это же время FORTRAN IV начал становиться важным образовательным инструментом, и были созданы такие реализации, как WATFOR и WATFIV Университета Ватерлоо, чтобы упростить сложные процессы компиляции и компоновки более ранних компиляторов.
В среде программирования FORTRAN IV той эпохи, за исключением той, что использовалась в системах Control Data Corporation (CDC), на строку помещалась только одна инструкция. Версия CDC допускала несколько инструкций на строку, если они были разделены символом $ (доллар). Лист FORTRAN был разделен на четыре поля, как описано выше.
Два компилятора того времени, IBM "G" и UNIVAC, позволяли писать комментарии на той же строке, что и инструкции, разделяя их специальным символом: "главным пробелом": V (перфорации 7 и 8) для UNIVAC и перфорации 12/11/0/7/8/9 (шестнадцатеричный FF) для IBM. Эти комментарии не должны были вставляться в середину карт продолжения. [35] [36]
Возможно, самым значительным событием в ранней истории FORTRAN стало решение Американской ассоциации стандартов (ныне Американский национальный институт стандартов (ANSI)) сформировать комитет, спонсируемый Ассоциацией производителей коммерческого оборудования (BEMA), для разработки американского стандарта FORTRAN . Полученные два стандарта, утвержденные в марте 1966 года, определили два языка: FORTRAN (основанный на FORTRAN IV, который служил фактическим стандартом) и Basic FORTRAN (основанный на FORTRAN II, но лишенный его машинно-зависимых функций). FORTRAN, определенный первым стандартом, официально обозначенным как X3.9-1966, стал известен как FORTRAN 66 (хотя многие продолжали называть его FORTRAN IV, языком, на котором в значительной степени базировался стандарт). FORTRAN 66 фактически стал первой версией FORTRAN, принятой в качестве отраслевого стандарта. FORTRAN 66 включал:
SUBROUTINE
, FUNCTION
, и BLOCK DATA
программные блокиINTEGER
, REAL
, DOUBLE PRECISION
, COMPLEX
, и LOGICAL
типы данныхCOMMON
, DIMENSION
, и EQUIVALENCE
заявленияDATA
заявление для указания начальных значенийEXTERNAL
(например, библиотечные) функцииGO TO
, вычисленные GO TO
, назначенные GO TO
и ASSIGN
операторыIF
и арифметические (трехходовые) IF
утвержденияDO
оператор циклаREAD
, WRITE
, BACKSPACE
, REWIND
, и ENDFILE
операторы для последовательного ввода-выводаFORMAT
заявление и назначенный форматCALL
, RETURN
, PAUSE
, и STOP
заявленияDATA
операторах FORMAT
и в качестве аргументов процедурEND
линияВышеуказанная версия Fortran II программы Heron требует нескольких модификаций для компиляции в качестве программы Fortran 66. Модификации включают использование более машинно-независимых версий операторов READ
и WRITE
удаление ненужных FLOATF
функций преобразования типов. Хотя это и не обязательно, арифметические IF
операторы можно переписать для использования логических IF
операторов и выражений в более структурированной форме.
C ПЛОЩАДЬ ТРЕУГОЛЬНИКА СО СТАНДАРТНОЙ ФУНКЦИЕЙ КВАДРАТНОГО КОРНЯ C ВХОД - УСТРОЙСТВО ЧТЕНИЯ ЛЕНТ 5, ЦЕЛЫЙ ВХОД C ВЫХОД - СТРОЕЧНЫЙ ПРИНТЕР УСТРОЙСТВО 6, ДЕЙСТВИТЕЛЬНЫЙ ВЫХОД C ВХОД ОШИБКА ОТОБРАЖЕНИЯ ОШИБКА ВЫХОДА КОД 1 В СПИСКЕ УПРАВЛЕНИЯ ЗАДАНИЯМИ ЧТЕНИЕ ( 5 , 501 ) IA , IB , IC 501 ФОРМАТ ( 3 I5 ) C C IA, IB и IC НЕ МОГУТ БЫТЬ ОТРИЦАТЕЛЬНЫМИ ИЛИ НУЛЕМ C КРОМЕ ТОГО, СУММА ДВУХ СТОРОН ТРЕУГОЛЬНИКА C ДОЛЖНА БЫТЬ БОЛЬШЕ ТРЕТЬЕЙ СТОРОНЫ , ПОЭТОМУ МЫ ПРОВЕРЯЕМ ЭТО ТАКЖЕ ЕСЛИ ( IA . GT . 0 . И . IB . GT . 0 . И . IC . GT . 0 ) ПЕРЕЙТИ К 10 ЗАПИСЬ ( 6 , 602 ) 602 ФОРМАТ ( 42 H IA , IB , И IC ДОЛЖНЫ БЫТЬ БОЛЬШЕ НУЛЯ . ) СТОП 1 10 ПРОДОЛЖИТЬ C ЕСЛИ ( IA + IB - IC . GT . 0 + . И . IA + IC - IB . GT . 0 + . И . IB + IC - IA . GT . 0 ) ПЕРЕЙТИ К 20 ЗАПИСЬ ( 6 , 603 ) 603 ФОРМАТ ( 50 H СУММА ДВУХ СТОРОН ДОЛЖНА БЫТЬ БОЛЬШЕ ТРЕТЬЕЙ СТОРОНЫ .) СТОП 1 20 ПРОДОЛЖИТЬ C C ИСПОЛЬЗУЯ ФОРМУЛУ ГЕРОНА, ВЫЧИСЛЯЕМ ПЛОЩАДЬ ТРЕУГОЛЬНИКА S = ( IA + IB + IC ) / 2.0 ПЛОЩАДЬ = КОРЕНЬ ( S * ( S - IA ) * ( S - IB ) * ( S - IC )) ЗАПИСЬ ( 6 , 601 ) IA , IB , IC , ОБЛАСТЬ 601 ФОРМАТ ( 4 H A = , I5 , 5 H B = , I5 , 5 H C = , I5 , 8 H ОБЛАСТЬ = , F10 . 2 , + 13 H КВАДРАТНЫЕ ЕДИНИЦЫ ) СТОП КОНЕЦ
После выпуска стандарта FORTRAN 66 поставщики компиляторов представили несколько расширений к стандартному Fortran , что побудило комитет ANSI X3J3 в 1969 году начать работу по пересмотру стандарта 1966 года под спонсорством CBEMA , Ассоциации производителей компьютерного делового оборудования (ранее BEMA). Окончательные проекты этого пересмотренного стандарта были распространены в 1977 году, что привело к формальному утверждению нового стандарта FORTRAN в апреле 1978 года. Новый стандарт, названный FORTRAN 77 и официально обозначенный X3.9-1978, добавил ряд существенных особенностей для устранения многих недостатков FORTRAN 66:
IF
и END IF
операторы с необязательными ELSE IF
предложениями ELSE
и обеспечивают улучшенную языковую поддержку структурного программированияDO
расширения цикла, включая выражения параметров, отрицательные приращения и нулевые счетчики срабатыванийOPEN
, CLOSE
, и INQUIRE
операторы для улучшения возможностей ввода-выводаIMPLICIT
оператор, чтобы переопределить неявные соглашения, которыми являются необъявленные переменные, INTEGER
если их имя начинается с I
, J
, K
, L
, M
или N
(и REAL
в противном случае)CHARACTER
тип данных, заменяющий строки Холлерита с существенно расширенными возможностями для ввода и вывода символов и обработки символьных данныхPARAMETER
оператор для указания константSAVE
оператор для постоянных локальных переменныхSQRT
также принимает аргументы других типов, таких как COMPLEX
или REAL*16
).LGE, LGT, LLE, LLT
) для лексического сравнения строк, основанный на последовательности сопоставления ASCII . (Эти функции ASCII были затребованы Министерством обороны США в ходе голосования по условному одобрению. [ необходима ссылка ] )В этой редакции стандарта ряд функций были удалены или изменены таким образом, что могли сделать недействительными ранее соответствующие стандарту программы. (Удаление было единственной допустимой альтернативой X3J3 в то время, поскольку концепция « устаревания » еще не была доступна для стандартов ANSI.) Хотя большинство из 24 пунктов в списке конфликтов (см. Приложение A2 к X3.9-1978) касались лазеек или патологических случаев, разрешенных предыдущим стандартом, но редко используемых, небольшое количество конкретных возможностей было намеренно удалено, например:
GREET = 12HHELLO THERE!
РАЗМЕР A ( 10 , 5 ) Y = A ( 11 , 1 )
Версия Fortran 77 программы Heron не требует никаких изменений в версии Fortran 66. Однако этот пример демонстрирует дополнительную очистку операторов ввода-вывода, включая использование ввода-вывода, управляемого списком, и замену дескрипторов редактирования Холлерита в FORMAT
операторах на строки в кавычках. Он также использует структурированные операторы IF
и END IF
вместо GOTO
/ CONTINUE
.
ПРОГРАММА HERON C ПЛОЩАДЬ ТРЕУГОЛЬНИКА СО СТАНДАРТНОЙ ФУНКЦИЕЙ КВАДРАТНОГО КОРНЯ C ВХОД - СТАНДАРТНАЯ ЕДИНИЦА ВВОДА ПО УМОЛЧАНИЮ, ЦЕЛОЕ ЧИСЛО ВХОД C ВЫХОД - СТАНДАРТНАЯ ЕДИНИЦА ВЫВОДА ПО УМОЛЧАНИЮ, ДЕЙСТВИТЕЛЬНОЕ ЧИСЛО ВЫХОД C ОТОБРАЖЕНИЕ ОШИБКИ ВХОДА КОД ВЫВОДА ОШИБКИ 1 В СПИСКЕ УПРАВЛЕНИЯ ЗАДАНИЯМИ ЧИТАТЬ ( * , * ) IA , IB , IC C C IA, IB и IC НЕ МОГУТ БЫТЬ ОТРИЦАТЕЛЬНЫМИ ИЛИ НУЛЕМ C КРОМЕ ТОГО, СУММА ДВУХ СТОРОН ТРЕУГОЛЬНИКА C ДОЛЖНА БЫТЬ БОЛЬШЕ ТРЕТЬЕЙ СТОРОНЫ, ПОЭТОМУ МЫ ПРОВЕРЯЕМ ЭТО ТАКЖЕ ЕСЛИ ( IA . LE . 0 . ИЛИ . IB . LE . 0 . ИЛИ . IC . LE . 0 ) ТОГДА НАПИШИТЕ ( * , * ) 'IA, IB и IC должны быть больше нуля.' СТОП 1 КОНЕЦ IF C IF ( IA + IB - IC . LE . 0 + . ИЛИ . IA + IC - IB . LE . 0 + . ИЛИ . IB + IC - IA . LE . 0 ) ТОГДА НАПИШИТЕ ( * , * ) 'Сумма двух сторон должна быть больше третьей стороны.' СТОП 1 КОНЕЦ ЕСЛИ C C ИСПОЛЬЗУЯ ФОРМУЛУ ГЕРОНА ВЫЧИСЛЯЕМ C ПЛОЩАДЬ ТРЕУГОЛЬНИКА S = ( IA + IB + IC ) / 2.0 ПЛОЩАДЬ = КОРЕНЬ ( S * ( S - IA ) * ( S - IB ) * ( S - IC )) ЗАПИСАТЬ ( * , 601 ) IA , IB , IC , ПЛОЩАДЬ 601 ФОРМАТ ( 'A= ' , I5 , ' B= ' , I5 , ' C= ' , I5 , ' AREA= ' , F10 . 2 , + ' квадратные единицы' ) СТОП КОНЕЦ
Разработка пересмотренного стандарта для замены FORTRAN 77 будет неоднократно откладываться, поскольку процесс стандартизации будет бороться за то, чтобы успевать за быстрыми изменениями в практике вычислений и программирования. В то же время, будучи "Стандартным FORTRAN" в течение почти пятнадцати лет, FORTRAN 77 станет исторически самым важным диалектом.
Важным практическим расширением FORTRAN 77 стал выпуск MIL-STD-1753 в 1978 году. [37] Эта спецификация, разработанная Министерством обороны США , стандартизировала ряд функций, реализованных большинством компиляторов FORTRAN 77, но не включенных в стандарт ANSI FORTRAN 77. Эти функции в конечном итоге были включены в стандарт Fortran 90.
DO WHILE
и END DO
заявленияINCLUDE
заявлениеIMPLICIT NONE
вариант IMPLICIT
заявленияСтандарт IEEE 1003.9 POSIX , выпущенный в 1991 году, предоставил программистам FORTRAN 77 простые средства для выполнения системных вызовов POSIX. [38] В документе было определено более 100 вызовов, что позволило получить доступ к совместимому с POSIX управлению процессами, обработке сигналов, управлению файловой системой, управлению устройствами, указанию процедур и потоковому вводу-выводу в переносимой форме.
Долгожданный преемник FORTRAN 77, неофициально известный как Fortran 90 (а до этого Fortran 8X ), был наконец выпущен как стандарт ISO/IEC 1539:1991 в 1991 году и стандарт ANSI в 1992 году. Помимо изменения официального написания с FORTRAN на Fortran, эта крупная редакция добавила много новых функций, отражающих значительные изменения в практике программирования, произошедшие со времени стандарта 1978 года:
X(1:N)=R(1:N)*COS(A(1:N))
WHERE
оператор для выборочного назначения массиваRECURSIVE
процедурыALLOCATABLE
атрибута и операторов ALLOCATE
andDEALLOCATE
POINTER
атрибут, назначение указателя и NULLIFY
оператор для облегчения создания и манипулирования динамическими структурами данныхEND DO
оператором завершения цикла и EXIT
операторами CYCLE
завершения обычных DO
итераций цикла упорядоченным образом.SELECT CASE
, CASE
, . . . CASE DEFAULT
, END SELECT
конструкция для многофакторного выбораВ отличие от предыдущей версии, Fortran 90 не удалил ни одной функции. [39] Любая программа на FORTRAN 77, соответствующая стандарту, также соответствовала стандарту Fortran 90, и любой из этих стандартов должен был быть пригоден для определения ее поведения.
Небольшой набор функций был определен как «устаревший» и, как ожидалось, будет удален в будущем стандарте. Все функции этих функций ранней версии могут быть реализованы более новыми функциями Fortran. Некоторые из них сохранены для упрощения переноса старых программ, но многие были удалены в Fortran 95.
программа helloworld print * , "Привет, мир!" конец программы helloworld
Fortran 95 , официально опубликованный как ISO/IEC 1539-1:1997, был незначительной переработкой, в основном для решения некоторых нерешенных проблем стандарта Fortran 90. Тем не менее, Fortran 95 также добавил ряд расширений, в частности из спецификации High Performance Fortran :
FORALL
и вложенные WHERE
конструкции для облегчения векторизацииPURE
и ELEMENTAL
процедурыNULL()
ALLOCATABLE
массивы автоматически освобождаются, когда выходят из области видимости.Ряд встроенных функций был расширен (например, dim
к встроенной функции был добавлен аргумент maxloc
).
Несколько функций, отмеченных в Fortran 90 как «устаревшие», были удалены из Fortran 95:
DO
операторы с использованием REAL
и DOUBLE PRECISION
индексных переменныхEND IF
оператору из-за пределов его блокаPAUSE
заявлениеASSIGN
и назначенный GO TO
оператор, и назначенные спецификаторы форматаH
Дескриптор редактирования Холлерита.Важным дополнением к Fortran 95 стал технический отчет ISO TR-15581: Enhanced Data Type Facilities , неформально известный как Allocatable TR. Эта спецификация определила расширенное использование ALLOCATABLE
массивов до появления полностью совместимых с Fortran 2003 компиляторов Fortran. Такое использование включает ALLOCATABLE
массивы как компоненты производного типа, в списках фиктивных аргументов процедур и в качестве возвращаемых значений функций. ( ALLOCATABLE
массивы предпочтительнее POINTER
массивов на основе , поскольку ALLOCATABLE
Fortran 95 гарантирует, что массивы будут автоматически освобождены, когда они выходят из области видимости, что исключает возможность утечки памяти . Кроме того, элементы выделяемых массивов являются смежными, и псевдонимы не являются проблемой для оптимизации ссылок на массивы, что позволяет компиляторам генерировать более быстрый код, чем в случае указателей. [40] )
Другим важным дополнением к Fortran 95 был технический отчет ISO TR-15580: Обработка исключений с плавающей точкой , неофициально известный как IEEE TR. Эта спецификация определяла поддержку арифметики с плавающей точкой IEEE и обработку исключений с плавающей точкой .
Помимо обязательного «Базового языка» (определенного в ISO/IEC 1539-1: 1997), язык Fortran 95 также включал два дополнительных модуля:
которые вместе составляют многочастный международный стандарт (ISO/IEC 1539).
По словам разработчиков стандартов, «необязательные части описывают автономные функции, которые были запрошены значительной частью пользователей и/или разработчиков, но которые не считаются достаточно общими для того, чтобы требовать их во всех соответствующих стандарту компиляторах Fortran». Тем не менее, если соответствующий стандарту Fortran предоставляет такие возможности, то они «должны предоставляться в соответствии с описанием этих возможностей в соответствующей части стандарта».
Язык, определенный стандартами двадцать первого века, в частности из-за включения в него поддержки объектно-ориентированного программирования и впоследствии Coarray Fortran , часто называют «современным Fortran», и этот термин все чаще используется в литературе. [41]
Fortran 2003, официально опубликованный как ISO/IEC 1539-1:2004, был крупной переработкой, вносящей множество новых функций. [42] Полный обзор новых функций Fortran 2003 доступен на официальном веб-сайте Fortran Working Group ( ISO/IEC JTC1/SC22 /WG5). [43]
Из этой статьи следует, что основные усовершенствования данной редакции включают в себя:
VOLATILE
атрибут , явная спецификация типа в конструкторах массивов и операторах выделения памяти, улучшения указателей, расширенные выражения инициализации и улучшенные внутренние процедурыFLUSH
оператор, регуляризация ключевых слов и доступ к сообщениям об ошибкахВажным дополнением к Fortran 2003 стал технический отчет ISO TR-19767: Enhanced module facilities in Fortran. В этом отчете были представлены подмодули, которые делают модули Fortran более похожими на модули Modula-2 . Они похожи на частные дочерние подмодули Ada . Это позволяет выразить спецификацию и реализацию модуля в отдельных программных модулях, что улучшает упаковку больших библиотек, позволяет сохранять коммерческие секреты при публикации окончательных интерфейсов и предотвращает каскадную компиляцию.
ISO/IEC 1539-1:2010, неофициально известный как Fortran 2008, был утвержден в сентябре 2010 года. [44] [45] Как и Fortran 95, это небольшое обновление, включающее разъяснения и исправления Fortran 2003, а также вводящее некоторые новые возможности. Новые возможности включают:
Окончательный проект международного стандарта (FDIS) доступен как документ N1830. [46]
Дополнением к Fortran 2008 является Техническая спецификация (TS) 29113 Международной организации по стандартизации (ISO) по дальнейшему взаимодействию Fortran с C [47] [48] , которая была представлена в ISO в мае 2012 года для утверждения. Спецификация добавляет поддержку доступа к дескриптору массива из C и позволяет игнорировать тип и ранг аргументов.
Версия языка Fortran 2018 ранее называлась Fortran 2015. [49] Это была значительная версия, выпущенная 28 ноября 2018 года. [50]
Fortran 2018 включает в себя две ранее опубликованные технические спецификации:
Дополнительные изменения и новые функции включают поддержку ISO/IEC/IEEE 60559:2011 (версия стандарта IEEE для чисел с плавающей точкой до последней незначительной редакции IEEE 754–2019), шестнадцатеричный ввод/вывод, улучшения IMPLICIT NONE и другие изменения. [53] [54] [55] [56]
Fortran 2018 удалил арифметический оператор IF. Он также удалил неблочные конструкции DO — циклы, которые не заканчиваются оператором END DO или CONTINUE. Они были устаревшей частью языка со времен Fortran 90.
Новые устаревшие элементы: операторы COMMON и EQUIVALENCE, программный блок BLOCK DATA, обозначенные циклы DO, специальные имена для встроенных функций, а также оператор и конструкция FORALL.
Fortran 2023 (ISO/IEC 1539-1:2023) был опубликован в ноябре 2023 года и может быть приобретен в ISO. [57] Fortran 2023 — это небольшое расширение Fortran 2018, которое фокусируется на исправлении ошибок и упущений в Fortran 2018. Он также добавляет некоторые небольшие функции, включая возможность перечисляемого типа .
Полное описание возможностей языка Fortran, привнесенных Fortran 95, приведено в соответствующей статье Возможности языка Fortran 95. Версии языка, определенные более поздними стандартами, часто именуются в совокупности «Современный Fortran» и описываются в литературе.
Хотя в журнальной статье 1968 года авторы BASIC уже описали FORTRAN как «старомодный», [58] программы писались на Fortran в течение многих десятилетий, и существует огромное количество программного обеспечения Fortran, которое ежедневно используется в научных и инженерных сообществах. [59] Джей Пасачофф писал в 1984 году, что «студенты-физики и астрономы просто обязаны изучать FORTRAN. В FORTRAN так много всего, что кажется маловероятным, что ученые перейдут на Pascal , Modula-2 или что-то еще». [60] В 1993 году Сесил Э. Лейт назвал FORTRAN «родным языком научных вычислений», добавив, что его замена любым другим возможным языком «может остаться безнадежной надеждой». [61]
Это основной язык для некоторых наиболее интенсивных суперкомпьютерных задач, таких как астрономия , моделирование климата , вычислительная химия , вычислительная экономика , вычислительная гидродинамика , вычислительная физика , анализ данных, [62] гидрологическое моделирование , численная линейная алгебра и числовые библиотеки ( LAPACK , IMSL и NAG ), оптимизация , спутниковое моделирование, структурная инженерия и прогнозирование погоды . [63] Многие из тестов с плавающей точкой для оценки производительности новых компьютерных процессоров, такие как компоненты тестов с плавающей точкой SPEC (например, CFP2006, CFP2017) написаны на Фортране. Математические алгоритмы хорошо документированы в Numerical Recipes .
Помимо этого, более современные коды в вычислительной науке обычно используют большие библиотеки программ, такие как METIS для разбиения графов, PETSc или Trilinos для возможностей линейной алгебры, deal.II или FEniCS для поддержки сеток и конечных элементов и другие общие библиотеки. С начала 2000-х годов многие из широко используемых библиотек поддержки также были реализованы на языке C , а в последнее время — на языке C++ . С другой стороны, высокоуровневые языки, такие как Wolfram Language , MATLAB , Python и R, стали популярными в определенных областях вычислительной науки. Следовательно, все большая часть научных программ также пишется на таких высокоуровневых языках сценариев. По этой причине возможности взаимодействия с C были добавлены в Fortran 2003 и улучшены технической спецификацией ISO/IEC 29113, которая была включена в Fortran 2018 для обеспечения более гибкого взаимодействия с другими языками программирования.
Переносимость была проблемой в первые дни, потому что не было согласованного стандарта — даже справочного руководства IBM — и компьютерные компании соперничали, чтобы отличить свои предложения от других, предоставляя несовместимые функции. Стандарты улучшили переносимость. Стандарт 1966 года предоставил справочный синтаксис и семантику, но поставщики продолжали предоставлять несовместимые расширения. Хотя осторожные программисты начинали понимать, что использование несовместимых расширений вызывало дорогостоящие проблемы переносимости, и поэтому использовали такие программы, как The PFORT Verifier, [64] [65] только после стандарта 1977 года, когда Национальное бюро стандартов (теперь NIST ) опубликовало FIPS PUB 69 , процессоры, закупаемые правительством США, должны были диагностировать расширения стандарта. Вместо того, чтобы предлагать два процессора, по сути, каждый компилятор в конечном итоге имел по крайней мере возможность диагностировать расширения. [66] [67]
Несовместимые расширения были не единственной проблемой переносимости. Для числовых вычислений важно учитывать характеристики арифметики. Это было рассмотрено Фоксом и др. в контексте стандарта 1966 года с помощью библиотеки PORT . [65] Идеи, изложенные там, стали широко использоваться и в конечном итоге были включены в стандарт 1990 года посредством внутренних функций запроса. Широкое (теперь почти универсальное) принятие стандарта IEEE 754 для двоичной арифметики с плавающей точкой по существу устранило эту проблему.
Доступ к вычислительной среде (например, командной строке программы, переменным среды, текстовому объяснению состояний ошибок) оставался проблемой до тех пор, пока она не была решена стандартом 2003 года.
Большие коллекции библиотечного программного обеспечения, которые можно было бы описать как слабо связанные с инженерными и научными расчетами, такие как графические библиотеки, были написаны на языке C, и поэтому доступ к ним представлял проблему переносимости. Это было решено путем включения взаимодействия с C в стандарт 2003 года.
Теперь стало возможным (и относительно легко) написать полностью переносимую программу на Фортране, даже не прибегая к помощи препроцессора .
До разработки стандарта Fortran 66 каждый компилятор поддерживал свой вариант Fortran. Некоторые из них больше отличались от мейнстрима, чем другие.
Первый компилятор Fortran установил высокий стандарт эффективности для скомпилированного кода. Эта цель затрудняла создание компилятора, поэтому это обычно делали производители компьютеров для поддержки продаж оборудования. Это оставило важную нишу: компиляторы, которые были быстрыми и обеспечивали хорошую диагностику для программиста (часто студента). Примерами являются Watfor, Watfiv, PUFFT и в меньшем масштабе FORGO, Wits Fortran и Kingston Fortran 2.
Fortran 5 продавался компанией Data General Corp с начала 1970-х до начала 1980-х годов для линеек компьютеров Nova , Eclipse и MV . Он имел оптимизирующий компилятор, который был довольно хорош для мини-компьютеров того времени. Язык больше всего напоминает FORTRAN 66.
FORTRAN V был распространен Control Data Corporation в 1968 году для серии CDC 6600. Язык был основан на FORTRAN IV. [68]
Univac также предлагал компилятор для серии 1100, известный как FORTRAN V. Отделением Univac Fortran V стала Athena FORTRAN.
Конкретные варианты, производимые поставщиками высокопроизводительных научных компьютеров (например, Burroughs , Control Data Corporation (CDC), Cray , Honeywell , IBM , Texas Instruments и UNIVAC ), добавляли расширения к Fortran, чтобы использовать преимущества специальных аппаратных функций, таких как кэш инструкций , конвейеры ЦП и векторные массивы. Например, один из компиляторов FORTRAN от IBM ( H Extended IUP ) имел уровень оптимизации, который переупорядочивал инструкции машинного кода , чтобы одновременно загружать несколько внутренних арифметических устройств. Другим примером является CFD , специальный вариант FORTRAN, разработанный специально для суперкомпьютера ILLIAC IV , работающего в исследовательском центре Эймса NASA . Исследовательские лаборатории IBM также разработали расширенный язык на основе FORTRAN под названием VECTRAN для обработки векторов и матриц.
Объектно-ориентированный Fortran был объектно-ориентированным расширением Fortran, в котором элементы данных могут быть сгруппированы в объекты, которые могут быть созданы и выполнены параллельно. Он был доступен для Sun, Iris, iPSC и nCUBE, но больше не поддерживается.
Такие машинно-специфичные расширения либо исчезли со временем, либо имели элементы, включенные в основные стандарты. Основное оставшееся расширение — OpenMP , которое является кроссплатформенным расширением для программирования общей памяти. Одно новое расширение, Coarray Fortran, предназначено для поддержки параллельного программирования.
FOR TRANSIT — название сокращенной версии языка IBM 704 FORTRAN, которая была реализована для IBM 650 с использованием программы-транслятора, разработанной в Карнеги в конце 1950-х годов. [69] Следующий комментарий появляется в справочном руководстве IBM ( система автоматического кодирования FOR TRANSIT C28-4038, авторские права 1957, 1959 принадлежат IBM):
Система FORTRAN была разработана для более сложной машины, чем 650, и, следовательно, некоторые из 32 операторов, найденных в FORTRAN Programmer's Reference Manual, не приемлемы для системы FOR TRANSIT. Кроме того, были добавлены определенные ограничения к языку FORTRAN. Однако ни одно из этих ограничений не делает исходную программу, написанную для FOR TRANSIT, несовместимой с системой FORTRAN для 704.
Допустимыми утверждениями были:
a = b
GO to n
GO TO (n1, n2, ..., nm), i
IF (a) n1, n2, n3
PAUSE
STOP
DO n i = m1, m2
CONTINUE
END
READ n, list
PUNCH n, list
DIMENSION V, V, V, ...
EQUIVALENCE (a,b,c), (d,c), ...
В одной программе можно использовать до десяти подпрограмм.
Операторы FOR TRANSIT были ограничены только столбцами с 7 по 56. Для ввода и вывода на IBM 650 использовались перфокарты. Требовалось три прохода для перевода исходного кода на язык «IT», затем для компиляции операторов IT в язык ассемблера SOAP и, наконец, для создания объектной программы, которую затем можно было загрузить в машину для запуска программы (используя перфокарты для ввода данных и вывода результатов на перфокарты).
Существовало две версии для 650-х с барабаном памяти на 2000 слов: FOR TRANSIT I (S) и FOR TRANSIT II, последняя для машин, оснащенных индексными регистрами и автоматической арифметикой с плавающей точкой ( би-квинарной ). Приложение A к руководству включало схемы электропроводки для панели управления считывателем карт/перфоратором IBM 533 .
До FORTRAN 77 многие препроцессоры обычно использовались для предоставления более дружественного языка, с тем преимуществом, что предварительно обработанный код мог быть скомпилирован на любой машине со стандартным компилятором FORTRAN. [70] Эти препроцессоры обычно поддерживали структурное программирование , имена переменных длиннее шести символов, дополнительные типы данных, условную компиляцию и даже возможности макросов . Популярные препроцессоры включали EFL , FLECS, iftran , MORTRAN , SFtran, S-Fortran, Ratfor и Ratfiv . Например, EFL, Ratfor и Ratfiv реализовали языки, подобные C , выводя предварительно обработанный код в стандартном FORTRAN 66. Препроцессор PFORT часто использовался для проверки того, что код соответствует переносимому подмножеству языка. Несмотря на достижения в языке Fortran, препроцессоры продолжают использоваться для условной компиляции и подстановки макросов.
Одна из самых ранних версий FORTRAN, представленная в 60-х годах, широко использовалась в колледжах и университетах. Разработанный, поддерживаемый и распространяемый Университетом Ватерлоо , WATFOR был основан в основном на FORTRAN IV. Студент, использующий WATFOR, мог отправить свое пакетное задание FORTRAN, и, если не было синтаксических ошибок, программа сразу переходила к выполнению. Это упрощение позволяло студентам сосредоточиться на синтаксисе и семантике своей программы или логике выполнения, а не на языке управления заданиями отправки (JCL), последовательных процессах компиляции/компоновки-редактирования/выполнения или других сложностях среды мэйнфрейма/мини-компьютера. Недостатком этой упрощенной среды было то, что WATFOR не был хорошим выбором для программистов, которым требовались расширенные возможности их главного процессора(ов), например, WATFOR обычно имел очень ограниченный доступ к устройствам ввода-вывода. WATFOR был заменен WATFIV и его более поздними версиями.
программа ; s = 0 i = 1 , n ; s = s + 1 ; стоп i ; s = 's' Стоп
(линейное программирование)
LRLTRAN был разработан в Lawrence Radiation Laboratory для поддержки векторной арифметики и динамического хранения, среди других расширений для поддержки системного программирования. Дистрибутив включал операционную систему Livermore Time Sharing System (LTSS).
Стандарт Fortran-95 включает в себя необязательную Часть 3 , которая определяет необязательную возможность условной компиляции . Эта возможность часто называется «CoCo».
Многие компиляторы Fortran интегрировали в свои системы подмножества препроцессора C.
SIMSCRIPT — специализированный препроцессор Fortran для моделирования и имитации больших дискретных систем.
Язык программирования F был разработан как чистое подмножество Fortran 95, которое пыталось удалить избыточные, неструктурированные и устаревшие функции Fortran, такие как EQUIVALENCE
оператор. F сохраняет возможности массивов, добавленные в Fortran 90, и удаляет управляющие операторы, которые стали устаревшими из-за структурированных программных конструкций, добавленных как в FORTRAN 77, так и в Fortran 90. F описывается его создателями как «компилированный, структурированный язык программирования массивов, особенно хорошо подходящий для образования и научных вычислений». [71] Essential Lahey Fortran 90 (ELF90) был похожим подмножеством.
Lahey и Fujitsu объединились для создания Fortran для Microsoft .NET Framework . [72] Silverfrost FTN95 также способен создавать код .NET. [73]
Следующая программа иллюстрирует динамическое распределение памяти и операции с массивами, две функции, введенные в Fortran 90. Особого внимания заслуживает отсутствие циклов DO
и операторов IF
/ THEN
при работе с массивом; математические операции применяются к массиву в целом. Также очевидно использование описательных имен переменных и общего форматирования кода, которые соответствуют современному стилю программирования. Этот пример вычисляет среднее значение по данным, введенным интерактивно.
программа средняя ! Введите несколько чисел и возьмите среднее значение ! Как написано, если нет точек данных, возвращается среднее значение ноль ! Хотя это может быть нежелательным поведением, оно делает этот пример простым неявный нет real , allocatable :: points (:) integer :: number_of_points real :: average_points , positive_average , negative_average average_points = 0. positive_average = 0. negative_average = 0. write ( * , * ) "Введите количество баллов для усреднения:" read ( * , * ) number_of_points выделить ( очки ( количество_очков )) написать ( * , * ) "Введите баллы для усреднения:" прочитать ( * , * ) баллы ! Возьмите среднее значение, суммируя баллы и разделив на количество_баллов, если ( количество_баллов > 0 ) среднее_баллы = сумма ( баллов ) / количество_баллов ! Теперь сформируем среднее значение только по положительным и отрицательным точкам if ( count ( points > 0. ) > 0 ) positive_average = sum ( points , points > 0. ) / count ( points > 0. ) if ( count ( points < 0. ) > 0 ) negative_average = sum ( points , points < 0. ) / count ( points < 0. ) ! Вывести результат на терминал stdout unit 6 write ( * , '(a,g12.4)' ) 'Среднее = ' , average_points write ( * , '(a,g12.4)' ) 'Среднее положительных баллов = ' , positive_average write ( * , '(a,g12.4)' ) 'Среднее отрицательных баллов = ' , negative_average deallocate ( points ) ! освободить память средний балл программы окончания
Во время того же заседания комитета по стандартам FORTRAN, на котором было выбрано название «FORTRAN 77», в официальный дистрибутив было включено сатирическое техническое предложение под названием «Буква O считается вредной ». Это предложение подразумевало устранение путаницы, которая иногда возникает между буквой «O» и цифрой ноль, путем исключения буквы из допустимых имен переменных. Однако предложенный метод заключался в полном исключении буквы из набора символов (тем самым сохраняя 48 в качестве числа лексических символов, которое двоеточие увеличило до 49). Это считалось полезным, поскольку способствовало бы структурному программированию, делая невозможным использование пресловутого GO TO
утверждения, как раньше. (Проблемные FORMAT
утверждения также будут исключены.) Было отмечено, что это «может сделать некоторые существующие программы недействительными», но что большинство из них «вероятно, были неконформными, в любом случае». [74] [ ненадежный источник? ] [75]
Когда X3J3 обсуждал, должно ли минимальное количество проходов для цикла DO быть равно нулю или единице в Fortran 77, Лорен Мейсснер предложил минимальное количество проходов, равное двум, рассуждая (в шутку) , что если бы оно было меньше двух, то не было бы смысла в цикле.
Когда добавлялись массивы предполагаемой длины, возник спор о том, какой символ следует использовать для разделения верхней и нижней границ. В комментарии, рассматривающем эти аргументы, Уолт Брейнерд написал статью под названием «Астрономия против гастроэнтерологии», поскольку некоторые сторонники предлагали использовать звездочку или звездочку («*»), в то время как другие отдавали предпочтение двоеточию («:»). [ необходима цитата ]
Имена переменных, начинающиеся с букв I–N, имеют тип по умолчанию «целое число», в то время как переменные, начинающиеся с любых других букв, по умолчанию имеют действительный тип, хотя программисты могут переопределить значения по умолчанию с помощью явного объявления. [76] Это привело к шутке: «В FORTRAN, GOD — это REAL (если не объявлено INTEGER)».
Руководство по Fortran I было выпущено в 1956 году, но только в 1958 году успешные компиляторы начали правильно запускать программы.
Другая проблема заключалась в том, что для Fortran не существовало стандарта, и поэтому немного отличающиеся версии ... скорее всего, давали сбой при использовании с другим компилятором.
Компилятор Fortran I был первым крупным проектом в области оптимизации кода. Он решал проблемы решающей важности, общее решение которых было важным направлением исследований в области технологии компиляторов в течение нескольких десятилетий. Многие классические методы анализа и оптимизации компиляторов могут проследить свое происхождение и вдохновение до компилятора Fortran I.
PFORT ... Библиотека ...
PORT ... написан на (PFORT) .. ANS Fortran
.. обсуждает .. переносимость .. Fortran