Название FORTRAN — это сокращение от FORmula TRANslator («переводчик формул»). Созданный в эпоху громоздких мейнфреймов, он был призван освободить инженеров и учёных от необходимости программировать в машинных кодах или на ассемблере. Если BASIC открыл компьютеры для студентов, то FORTRAN — для серьёзной науки и инженерии.
Примерная хронология развития стандартов:
1954 — начало работ; 1957 — FORTRAN I;
1958 — FORTRAN II; 1962 — FORTRAN IV;
1966 — FORTRAN 66 (первый стандарт ANSI);
1978 — FORTRAN 77;
1991 — Fortran 90;
1996 — Fortran 95;
2004 — Fortran 2003;
2010 — Fortran 2008;
2018 — Fortran 2018 (последний на сегодня стандарт).
История создания: революция IBM
В начале 1950-х годов программирование было уделом избранных. Код писался на машинном языке или ассемблере, был медленным, сложным и крайне подверженным ошибкам. В 1953 году Джон Бэкус, математик, работавший в IBM, выступил с революционной идеей: создать язык, позволяющий записывать вычисления в привычном алгебраическом виде, и компилятор, который бы транслировал эти записи в эффективный машинный код для компьютера IBM 704.
В 1954 году группа Бэкуса приступила к работе. Их проект назывался FORTRAN. Первый компилятор появился в 1957 году. Это был инженерный подвиг: компилятор состоял из 25 000 строк кода на ассемблере и выдавал настолько оптимизированный машинный код, что программисты, писавшие вручную, с трудом могли его превзойти. К концу 1957 года было продано около 30 машин IBM 704, и более половины их владельцев использовали FORTRAN.
Интересный факт: Компилятор FORTRAN I был настолько хорош, что его рекорд по оптимизации кода продержался почти 20 лет. А написание программы для расчёта параметров ядерного реактора, которая раньше занимала недели, сократилось до нескольких часов.
Эволюция версий: от FORTRAN I до современного Fortran
FORTRAN развивался вместе с компьютерами. Можно выделить несколько эпох:
- FORTRAN I (1957): Первая реализация для IBM 704. Умел работать с числами, содержал операторы
IF,GOTO,DOи базовый ввод-вывод. - FORTRAN II (1958): Добавлены независимые подпрограммы и функции, что стало огромным шагом к модульности.
- FORTRAN IV (1962): Самая популярная версия на протяжении 1960-х годов. Появился логический тип данных (
LOGICAL), улучшен ввод-вывод. Реализован для IBM 7030, 7090, 7094. - FORTRAN 66 (ANSI X3.9-1966): Первый официальный стандарт, унифицировавший диалекты. Закрепил фиксированный формат (колонки 1-5 — метки, 6 — символ продолжения, 7-72 — код).
- FORTRAN 77 (1978): Добавлен символьный тип
CHARACTER, блокиIF-THEN-ELSE, улучшен циклDO. - Fortran 90 (1991): Революционное обновление. Появились свободный формат, модули (
MODULE), массивы как объекты, операции над секциями массивов, указатели, рекурсия, производные типы (аналогstructв C). - Fortran 95 (1996): Добавлены конструкция
FORALLи чисто процедурные элементы. - Fortran 2003 (2004): Объектно-ориентированное программирование (классы, наследование, полиморфизм), взаимодействие с C.
- Fortran 2008 (2010) и Fortran 2018 (2018): Добавлены средства для параллельных вычислений (блоки
DO CONCURRENT,COARRAY), улучшена работа с массивами.
Уровень языка: от научного инструмента до современного монстра
FORTRAN изначально проектировался как язык для численных расчётов. Его главная сила — скорость. В отличие от BASIC, компилятор FORTRAN создаёт очень быстрый машинный код, оптимизированный под конкретную архитектуру.
- Статическая память: Все переменные размещаются в памяти на этапе компиляции.
- Массивы: Понимание работы с многомерными массивами и их размещением в памяти (по столбцам) критически важно для производительности.
Структура программы (на примере FORTRAN 77)
Программа в FORTRAN состоит из последовательности операторов, каждый из которых пишется на новой строке.
PROGRAM TRIAG
C -------------------------------------------------------------
C Вычисление площади треугольника по трем сторонам и его углов
C -------------------------------------------------------------
LOGICAL FLAG
C
READ (*, *) A, B, C
WRITE (*, *) A, B, C
C
FLAG = ((A+B) .GT. C) .AND. ((B+C) .GT. A) .AND. ((C+A) .GT. B)
C
IF (FLAG) THEN
P = 0.5 * (A + B + C)
AREA = SQRT(P * (P-A) * (P-B) * (P-C))
ANGA = ANGLE(B, C, A)
ANGB = ANGLE(C, A, B)
ANGC = 180.0 - (ANGA + ANGB)
WRITE (*, *) AREA, ANGA, ANGB, ANGC
ELSE
WRITE (*, *) 'error'
END IF
C
END
Пояснения к коду:
- Символ
Cв первой колонке обозначает комментарий. PROGRAM TRIAG— заголовок программы.LOGICAL FLAG— объявление логической переменной.READ (*, *) A, B, C— чтение трёх чисел с клавиатуры.WRITE (*, *) A, B, C— вывод введённых значений.IF (FLAG) THEN— условный оператор.P = 0.5 * (A + B + C)— вычисление полупериметра.AREA = SQRT(...)— вычисление площади по формуле Герона.CALL ANGLE(...)— вызов функции-подпрограммы.END— конец программы.
Подпрограммы и функции: модульность по-фортрановски
C Вычисление величины угла
REAL FUNCTION ANGLE(X, Y, Z)
REAL X, Y, Z
PARAMETER (PI = 3.1415926535)
C
TEMP = (X*X + Y*Y - Z*Z) / (2.0 * X * Y)
IF (TEMP .GT. 1.0) TEMP = 1.0
IF (TEMP .LT. -1.0) TEMP = -1.0
ANGLE = (180.0 / PI) * ACOS(TEMP)
C
RETURN
END
Что здесь важно:
REAL FUNCTION ANGLE(X, Y, Z)— объявление функции, возвращающей вещественное значение.PARAMETER (PI = 3.1415926535)— объявление константы.ANGLE = ...— присвоение возвращаемого значения.- В FORTRAN аргументы в функции передаются по ссылке.
Ключевые особенности и синтаксис (на примере FORTRAN 77)
- Типы данных:
INTEGER— целые числа.REAL— вещественные числа (одинарная точность).DOUBLE PRECISION— двойная точность.COMPLEX— комплексные числа.LOGICAL— логические значения (.TRUE./.FALSE.).CHARACTER— строки.
- Переменные: По умолчанию переменные, начинающиеся с
I,J,K,L,M,N, считаются целыми (INTEGER), остальные — вещественными (REAL). Это называется правило неявной типизации (IMPLICIT NONE отключает его). - Арифметические операторы:
+,-,*,/,**(возведение в степень). - Операторы сравнения:
.GT.(>, greater than),.LT.(<, less than),.EQ.(==, equal),.NE.(/=, not equal),.GE.(>=, greater or equal),.LE.(<=, less or equal). - Логические операторы:
.AND.,.OR.,.NOT.. - Операторы цикла:
fortran DO I = 1, 10, 2 PRINT *, I END DO - Ввод-вывод:
READ (*, *)— чтение с клавиатуры.WRITE (*, *)— вывод на экран.- Форматный ввод-вывод:
READ (5, 100),WRITE (6, 200).
Применение: Царство науки и инженерии
FORTRAN — это рабочий язык огромного количества научных и инженерных расчётов. Почему он до сих пор востребован?
- Наследие: Огромное количество критически важного кода написано на FORTRAN и продолжает работать.
- Производительность: Компиляторы Fortran создают самый быстрый код для численных расчётов на процессорах x86-64.
- Современные стандарты: Fortran 2003, 2008, 2018 вобрали в себя лучшие практики параллельного программирования и ООП.
- Удобство для распараллеливания: Благодаря статической памяти и отсутствию «диких» указателей, программы на Fortran проще распараллеливать.
Области применения:
- Климатическое моделирование: Код, предсказывающий погоду и изменение климата.
- Физика высоких энергий: Обработка данных с БАК в ЦЕРН.
- Вычислительная гидродинамика (CFD): Моделирование течений жидкостей и газов.
- Авиа- и ракетостроение: Расчёт аэродинамики и траекторий.
- Финансовое моделирование: Оценка сложных рисков.
Реализации: Кто сделал FORTRAN
- IBM (FORTRAN I, II, IV): Первые компиляторы.
- Waterloo (WATFOR, WATFIV): Образовательные компиляторы для студентов, обеспечивавшие быструю компиляцию и подробную диагностику ошибок.
- Советские компиляторы:
- АЛМО — компилятор для БЭСМ-6.
- Фортран-ЕС — вариант, широко использовавшийся в социалистических странах на компьютерах серии ЕС ЭВМ.
- Современные компиляторы:
- GNU Fortran (gfortran) — свободный компилятор.
- Intel Fortran (ifort) — высокопроизводительный компилятор от Intel.
Интересные факты
- «Самый ненавидимый компилятор»? В своей ранней версии FORTRAN I был неудобен: он занимал много памяти, медленно компилировался и не оптимизировал ввод-вывод. Но программисты всё равно его любили за то, что он экономил недели ручного кодирования.
- Образование: WATFIV и его предшественник WATFOR были разработаны для массового обучения. Они могли компилировать простую студенческую программу за доли секунды, давая подробные отчёты об ошибках, что позволяло студентам быстро учиться и исправлять код.
- Скорость: Компилятор WATFOR переводил программы со скоростью до 100 строк в секунду.