Fortran в 2026 году: зачем смотреть на язык из 1957 года
Когда я впервые услышал про Fortran, первая мысль была простой: это же язык из 1957 года, зачем его вообще трогать? Есть Python, JavaScript, Go, Rust — зачем смотреть в такую древность?
Но потом стало интересно: почему Fortran вообще выжил? Почему на нём до сих пор считают физики, климатологи и инженеры? Что в нём такого, что он не исчез окончательно?
Когда начинаешь разбираться, выясняется неожиданная вещь. Fortran — это не исторический артефакт. Это язык, который очень честно показывает, как устроена программа: типы, память, вычисления, дисциплина в коде. В нём меньше «магии», чем в современных высокоуровневых языках, и именно поэтому он хорошо подходит для обучения.
Это не просто обзор — это небольшой вводный туториал по Fortran 90/95. Мы разберём базовые вещи: переменные, типы, простые вычисления и одну очень важную особенность языка, которая сразу меняет отношение к коду.
Если вы школьник, студент или просто хотите лучше понять, что происходит под капотом программы — читайте дальше.
Почему Fortran вообще до сих пор жив
Fortran не нужен большинству разработчиков. Если ваша цель — веб, автоматизация или продуктовая разработка, логичнее взять Python или что-то из современного набора.
Но у Fortran другая ниша. Десятилетиями он использовался в научных и инженерных вычислениях: моделирование физических процессов, климат, численные методы, большие расчётные пакеты. В таких областях важны не модные фичи языка, а предсказуемость, производительность и огромный пласт уже существующего кода. Поэтому он не исчез — просто остался там, где компьютер нужен для тяжёлых вычислений, а не для интерфейсов.
Но даже если вы не собираетесь считать гидродинамику, у него есть учебная ценность. Fortran заставляет думать точнее. Он не даёт спрятаться за удобства языка и требует понимать, что именно вы храните, что именно считаете и как программа устроена изнутри.
Переменные и типы данных
Любая программа начинается с данных. Где-то нужно хранить возраст, имя, длину окружности, результат вычисления.
В Fortran переменная — это именованная область памяти, и перед использованием её нужно объявить. Язык хочет заранее знать, что именно будет лежать в этой ячейке.
Четыре базовых типа, которые нужны в самом начале:
INTEGER— целые числа:10,-3,0REAL— числа с дробной частью:3.14,-0.5,1.0CHARACTER— текстовые данныеLOGICAL— логические значения:.TRUE.и.FALSE.
PROGRAM variables_example IMPLICIT NONE INTEGER :: user_age REAL :: pi_approx CHARACTER(LEN=20) :: user_name user_age = 30 pi_approx = 3.14159 user_name = "John Doe" WRITE(*,*) "Имя:", TRIM(user_name) WRITE(*,*) "Возраст:", user_age WRITE(*,*) "Пи:", pi_approx END PROGRAM variables_example
Вывод программы:
Имя:John Doe Возраст: 30 Пи: 3.14159012
Здесь хорошо видно главное: каждая переменная объявлена заранее, и у каждой есть свой тип. Также обратите внимание: вместо PRINT * используется WRITE(*,*) — это стандартный способ вывода в современном Fortran.
Небольшая особенность строк. Если вы пишете CHARACTER(LEN=20), переменная получает фиксированную длину — 20 символов. Если записали туда "John", оставшиеся позиции заполнятся пробелами. Чтобы убрать хвостовые пробелы при выводе, используют функцию TRIM() — она и стоит в примере выше.
В Fortran строка — это не «гибкий объект», а конкретный участок памяти с заданной длиной. Это непривычно после Python, но зато честно.
IMPLICIT NONE — одна строка, которая экономит часы
Есть одно правило, которое стоит усвоить сразу: каждая программа должна начинаться с IMPLICIT NONE.
В старых версиях Fortran действовало неявное правило: если переменная не объявлена явно, компилятор сам назначает ей тип по первой букве имени. Имена на I, J, K, L, M, N считались INTEGER, остальные — REAL. Когда-то это считалось удобством. На практике — источник очень неприятных ошибок.
Разработчик хотел использовать velocity, но случайно написал velacity:
PROGRAM bad_practice ! Нет IMPLICIT NONE — это опасно REAL :: distance, velocity, time velocity = 100.0 time = 9.5 distance = velacity * time ! Опечатка: velocity → velacity WRITE(*,*) "Расстояние:", distance, "метров" END PROGRAM bad_practice
Без IMPLICIT NONE компилятор не ругается. Он считает, что velacity — новая переменная типа REAL, тихо присваивает ей 0.0 и продолжает сборку. Программа запускается и выводит:
Расстояние: 0.00000000 метров
Никаких ошибок. Это логическая ошибка — самая неприятная: код работает, но считает не то. Искать такое без подсказки можно очень долго.
Теперь та же программа с одной добавленной строкой:
PROGRAM good_practice IMPLICIT NONE REAL :: distance, velocity, time velocity = 100.0 time = 9.5 distance = velacity * time ! Та же опечатка WRITE(*,*) "Расстояние:", distance, "метров" END PROGRAM good_practice
Компилятор немедленно останавливает сборку:
Error: Symbol 'velacity' at (1) has no IMPLICIT type; did you mean 'velocity'?
Одна строка превращает тихую логическую ошибку в явную ошибку компиляции. Компьютер не «понимает, что вы имели в виду». Он работает только с тем, что вы реально написали.
Арифметика и встроенные функции
Когда переменные объявлены и типы понятны, можно переходить к вычислениям.
Оператор |
Действие |
Пример |
Результат |
|---|---|---|---|
|
Сложение |
|
8 |
|
Вычитание |
|
2 |
|
Умножение |
|
15 |
|
Деление |
|
2.5 |
|
Возведение в степень |
|
25 |
На этом месте почти все новички сталкиваются с одной деталью: целочисленное деление.
Если оба операнда — целые числа, результат тоже будет целым. Дробная часть просто отбрасывается. Вот полная программа, которая это демонстрирует:
PROGRAM division_example IMPLICIT NONE REAL :: result result = 5 / 2 ! Оба числа целые — результат тоже целый WRITE(*,*) "5 / 2 =", result result = 5.0 / 2 ! Одно вещественное — результат вещественный WRITE(*,*) "5.0 / 2 =", result result = 5 / 2.0 WRITE(*,*) "5 / 2.0 =", result result = 5.0 / 2.0 WRITE(*,*) "5.0 / 2.0 =", result END PROGRAM division_example
Вывод:
5 / 2 = 2.00000000 5.0 / 2 = 2.50000000 5 / 2.0 = 2.50000000 5.0 / 2.0 = 2.50000000
Чтобы получить дробный результат, хотя бы одно число должно быть вещественным. Это простое правило, но оно хорошо показывает разницу между математикой на бумаге и вычислениями в программе: компьютеру важен не только результат, но и тип данных с которым он работает.
У Fortran есть встроенный набор математических функций, которого вполне хватает для учебных задач:
SQRT(x)— квадратный кореньABS(x)— модуль числаSIN(x),COS(x)— тригонометрия (угол в радианах)EXP(x)— экспонентаLOG(x)— натуральный логарифм
Небольшая рабочая программа — считаем площадь круга и длину окружности:
PROGRAM circle_calculator IMPLICIT NONE REAL :: radius, area, circumference REAL, PARAMETER :: pi = 3.14159265 radius = 10.0 area = pi * radius**2 circumference = 2.0 * pi * radius WRITE(*,*) "Радиус:", radius WRITE(*,*) "Площадь:", area WRITE(*,*) "Длина окружности:", circumference END PROGRAM circle_calculator
Вывод:
Радиус: 10.0000000 Площадь: 314.159271 Длина окружности: 62.8318558
Обратите внимание на REAL, PARAMETER :: pi. Атрибут PARAMETER превращает переменную в константу — её значение задаётся один раз и изменить его потом нельзя. Если значение не должно меняться, лучше сразу сказать об этом компилятору.
Что дальше
Мы разобрали три базовые вещи: переменные и типы, защиту через IMPLICIT NONE и арифметику. Этого уже достаточно для первых осмысленных программ — калькуляторов, физических формул, учебных расчётов.
Следующий шаг — ввод данных от пользователя, условия и циклы. После этого Fortran перестаёт быть просто «языком для формул» и становится полноценным инструментом для небольших расчётных программ.
Если тема зашла и хочется двигаться дальше системно — все эти темы с заданиями и практикой разобраны в моём курсе на Stepik. Ссылка в профиле.
Комментарии (25)

Dotarev
09.04.2026 07:34Это язык, который очень честно показывает, как устроена программа: типы, память, вычисления, дисциплина в коде
Раз уж начали рассказывать про это, так расскажите полностью: какова точность INTEGER и REAL, сколько занимает LOGICAL, есть ли разделение памяти на стек и кучу и как вообще происходит выделение памяти, как происходит передача параметров в функцию, почему в конце концов вычисления более эффективны чем на любом другом языке со статической типизацией (а может, это и не так??) и т.д. Тогда статья может оказаться кому-то полезной.

kuz1 Автор
09.04.2026 07:34Справедливое замечание. Это вводный туториал для тех, кто только знакомится с языком, поэтому точность типов, модель памяти и передача параметров сознательно остались за кадром. Планирую разобрать эти темы отдельно — они заслуживают полноценной статьи, а не пары абзацев в конце вводной.

Octagon77
09.04.2026 07:34Это вводный туториал для тех, кто только знакомится с языком
Это плохой вводный туториал. Вводный может петь за типы, память и вычисления (кстати, про память ничего не сказано) только после того, как рассказано, пусть кратко, главное
на каких платформах есть (а тут вроде как есть что сказать про WebAssembly)
какие есть базовые функции (сборщик мусора, подсчёт ссылок, ООП, дженерики, hot reload...) и каких нет
как выполняются параллельные вычисления
что можно сделать с и без FFI (на вскидку - много и писать одни файлы исходя из других)
насколько быстро и прожорливо будет работать
сколько выживших диалектов
Тут сразу многие отсеятся и можно переходить к второму и тоже главному - где брать библиотеки, те, что без малвари.
И вот теперь останутся те немногие, кому интеесно то, что в статье. Если же Ваша цель в том, чтобы отвадить от смотреть в сторону Fortran, то туториал отличный.
каждая программа должна начинаться с
IMPLICIT NONEПрограмма, особенно каждая, ни у кого не занимала и (поэтому) ничего не должна. Такая ошибка, как приведённая в качестве доказательства, не возникает на практике поскольку IDE автодополняет, а линтер обнаруживает неиспользуемые значения. Если они у кого этого не делают... ответ на стоит ли смотреть почти очевиден.
И ещё замечание - конкуренты Fortran не Go и Rust, и уж точно не Python да JavaScript, а Julia.

kbtsiberkin
09.04.2026 07:34Так для этого придется книгу Бартенева переписать, припорошив интеловскими руководствами по языку.

parakhod_1
09.04.2026 07:34Последний раз писал на фортране в 92м году, как сейчас помню – лаба по численным методам. Обычный старый добрый процедурный язык. Издали (и подзабыв детали) и не отличишь от прочих коболов, алголов и не к ночи будет помянуто бейсиков, которых были тыщи.
Это если не вдаваться в дебри, но мы ж и не вдаёмся в дебри.

koreychenko
09.04.2026 07:34Тема научности не раскрыта.
Все, что описано в статье про типы переменных существует в любом компилируемом языке - хоть в паскале, хоть в go.
На приведенных примерах любой современный язык будет не менее выразительным. Целочисленное деление в том же go тоже присутствует.func variablesExample() { var userAge int var piApprox float64 var userName string userAge = 30 piApprox = 3.14159 userName = "John Doe" fmt.Printf("Имя: %s", strings.TrimSpace(userName)) fmt.Printf("Возраст: %d", userAge) fmt.Printf("Пи: %v", piApprox) }

lz961
09.04.2026 07:34Странно в статье про современный Фортран не встретить упоминаний про его ключевые особенности, такие как векторизация, pure и elemental функции, in, out аргументы, allocatable и target объекты, (почти)нативную параллелизацию с помощью OpenMP.

belch84
09.04.2026 07:34Когда-то уже высказывал эту мысли в комментариях к какой-то статье о ФОРТРАНе здесь - если можно было бы измерить революционность языков программирования в каких-либо числовых единицах, то расстояние от программирования на Фортране до программирования в кодах (или на вариантах ассемблера для машин с разными системами команд) намного больше, чем расстояние от ФОРТРАНа до языков (или вообще способов программирования), которые появились после него, будь то ООП или наисовременнейшие
парадигмы(тьфу, не люблю это слово) очень удобные языки. Я программировал на Фортране в середине 80-х (тогда это был FORTRAN-IV) и часто сталкивался со многими из недостатков, которые упомянуты в статье. Но было в ФОРТРАНе нечто, соврешившее революцию в программировании и позволившее на порядки увеличить продуктивность программистов, сделать программирование массовой профессией и создать библиотека программ для числовых алгоритмов, которыми пользуются и сейчас и которые пока не удалось переписать на что-то более современное. Поэтому он и жив, не являясь ни современным, ни слишком удобным
vadimr
09.04.2026 07:34Ну расстояние от Фортрана-2026 до Фортрана IV вполне сопоставимо с расстоянием от первого Фортрана до макроассемблера, если не больше.
На самом деле такого уж невероятно огромного скачка в программировании между макроассемблером и Фортраном I, с моей точки зрения, не было. Разве что Фортран стал машиннонезависимым.

kaichou
09.04.2026 07:34В статье нет ответа на вопрос, вынесенный в заголовок.
Автор знает ответ на него? Я да

VT100
09.04.2026 07:34Что больше всего вымораживало 35 лет назад, так это форматирование вывода.
… того, как рассказано, пусть кратко, главное …
Рассказываю. Установка нейронки - требует Intel Fortran.

astenix
09.04.2026 07:34Прям просится:
INTEGER :: user_age = 30REAL :: pi_approx = 3.14159CHARACTER(LEN=20) :: user_name = "John Doe"
vadimr
09.04.2026 07:34Кстати, хороший вопрос на понимание языка: чем это отличается по семантике от написанного в посте.

astenix
09.04.2026 07:34Конкатенированием отдельных операций объявления переменных и присваивания им значений в одну строку. На большее понимание не претендую.

vadimr
09.04.2026 07:34В вашем случае значения будут изначально находиться в памяти переменных в объектном коде, а у автора – присваиваться переменным по ходу выполнения программы (или, по крайней мере, вести себя операционно эквивалентно). Для главной программы это обычно неважно (разве что большие массивы могут не умещаться в объектном модуле при обычных настройках), но для повторно вызываемых подпрограмм и функций в вашем случае не будет выполняться повторная инициализация, так как переменные в Фортране по умолчанию статические.
program stat call s call s contains subroutine s integer :: a = 1 print *, a a = 2 end subroutine s end program statЭто довольно тонкий момент, поэтому я его всегда объясняю студентам.

aamonster
09.04.2026 07:34Фортран отвратительно подходит для обучения. Я несколько лет писал на нём (Fortran 77, фиксированный формат) по работе, а потом узнал, что делаю это вообще неправильно. На нём внезапно надо писать скорей в духе R, чем в духе C.

kbtsiberkin
09.04.2026 07:3477 и правда трудно воспринимать и учиться ему. 90й ещё куда ни шло, но с нуля учить на нём тоже так себе. По своим однокурсникам помню, у кого информатика в школе сводилась к офисным пакетам. У кого был хотя бы один класс обучения программированию на паскале, были в сильном выигрыше.
Рабочий инструмент без большого учебно-методического сопровождения.

aamonster
09.04.2026 07:34Когда пользовался – мешал именно диалект, возврат к Паскалю и Си был за счастье. Но потом понял, что основная проблема была совсем в другом, я именно что не понимал заложенную в язык идею, писал на нём так же, как на Си, обрабатывая элементы по одному.

grammidin4eg
09.04.2026 07:34У меня в институте был Fortran 77. Кафедра активно им пользовалась в расчётах. Но они как раз переходили на MATLAB. Тема использования динозавра Fortran вообще не раскрыта. Да hello world этот мало говорит о языке и его возможностях. А поговорить там есть о чем.
vadimr
Примеры-то на Фортране 90, и то не вполне корректные.