Fortran в 2026 году: зачем смотреть на язык из 1957 года

Когда я впервые услышал про Fortran, первая мысль была простой: это же язык из 1957 года, зачем его вообще трогать? Есть Python, JavaScript, Go, Rust — зачем смотреть в такую древность?

Но потом стало интересно: почему Fortran вообще выжил? Почему на нём до сих пор считают физики, климатологи и инженеры? Что в нём такого, что он не исчез окончательно?

Когда начинаешь разбираться, выясняется неожиданная вещь. Fortran — это не исторический артефакт. Это язык, который очень честно показывает, как устроена программа: типы, память, вычисления, дисциплина в коде. В нём меньше «магии», чем в современных высокоуровневых языках, и именно поэтому он хорошо подходит для обучения.

Это не просто обзор — это небольшой вводный туториал по Fortran 90/95. Мы разберём базовые вещи: переменные, типы, простые вычисления и одну очень важную особенность языка, которая сразу меняет отношение к коду.

Если вы школьник, студент или просто хотите лучше понять, что происходит под капотом программы — читайте дальше.


Почему Fortran вообще до сих пор жив

Fortran не нужен большинству разработчиков. Если ваша цель — веб, автоматизация или продуктовая разработка, логичнее взять Python или что-то из современного набора.

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

Но даже если вы не собираетесь считать гидродинамику, у него есть учебная ценность. Fortran заставляет думать точнее. Он не даёт спрятаться за удобства языка и требует понимать, что именно вы храните, что именно считаете и как программа устроена изнутри.


Переменные и типы данных

Любая программа начинается с данных. Где-то нужно хранить возраст, имя, длину окружности, результат вычисления.

В Fortran переменная — это именованная область памяти, и перед использованием её нужно объявить. Язык хочет заранее знать, что именно будет лежать в этой ячейке.

Четыре базовых типа, которые нужны в самом начале:

  • INTEGER — целые числа: 10, -3, 0

  • REAL — числа с дробной частью: 3.14, -0.5, 1.0

  • CHARACTER — текстовые данные

  • 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'?

Одна строка превращает тихую логическую ошибку в явную ошибку компиляции. Компьютер не «понимает, что вы имели в виду». Он работает только с тем, что вы реально написали.


Арифметика и встроенные функции

Когда переменные объявлены и типы понятны, можно переходить к вычислениям.

Оператор

Действие

Пример

Результат

+

Сложение

5 + 3

8

-

Вычитание

5 - 3

2

*

Умножение

5 * 3

15

/

Деление

5.0 / 2.0

2.5

**

Возведение в степень

5 ** 2

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)


  1. vadimr
    09.04.2026 07:34

    Примеры-то на Фортране 90, и то не вполне корректные.


  1. Dotarev
    09.04.2026 07:34

    Это язык, который очень честно показывает, как устроена программа: типы, память, вычисления, дисциплина в коде

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


    1. kuz1 Автор
      09.04.2026 07:34

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


      1. Octagon77
        09.04.2026 07:34

        Это вводный туториал для тех, кто только знакомится с языком

        Это плохой вводный туториал. Вводный может петь за типы, память и вычисления (кстати, про память ничего не сказано) только после того, как рассказано, пусть кратко, главное

        • на каких платформах есть (а тут вроде как есть что сказать про WebAssembly)

        • какие есть базовые функции (сборщик мусора, подсчёт ссылок, ООП, дженерики, hot reload...) и каких нет

        • как выполняются параллельные вычисления

        • что можно сделать с и без FFI (на вскидку - много и писать одни файлы исходя из других)

        • насколько быстро и прожорливо будет работать

        • сколько выживших диалектов

        Тут сразу многие отсеятся и можно переходить к второму и тоже главному - где брать библиотеки, те, что без малвари.

        И вот теперь останутся те немногие, кому интеесно то, что в статье. Если же Ваша цель в том, чтобы отвадить от смотреть в сторону Fortran, то туториал отличный.

        каждая программа должна начинаться с IMPLICIT NONE

        Программа, особенно каждая, ни у кого не занимала и (поэтому) ничего не должна. Такая ошибка, как приведённая в качестве доказательства, не возникает на практике поскольку IDE автодополняет, а линтер обнаруживает неиспользуемые значения. Если они у кого этого не делают... ответ на стоит ли смотреть почти очевиден.

        И ещё замечание - конкуренты Fortran не Go и Rust, и уж точно не Python да JavaScript, а Julia.


    1. kbtsiberkin
      09.04.2026 07:34

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


  1. Konrad25
    09.04.2026 07:34

    В первом примере вывод числа ПИ слабоват в точности, особенно для науки - как так получилось? 3,1415926535...


    1. lz961
      09.04.2026 07:34

      правильно ... pi = 2*acos(0d0)


  1. parakhod_1
    09.04.2026 07:34

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


  1. 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)
    }


  1. lz961
    09.04.2026 07:34

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


  1. belch84
    09.04.2026 07:34

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


    1. vadimr
      09.04.2026 07:34

      Ну расстояние от Фортрана-2026 до Фортрана IV вполне сопоставимо с расстоянием от первого Фортрана до макроассемблера, если не больше.

      На самом деле такого уж невероятно огромного скачка в программировании между макроассемблером и Фортраном I, с моей точки зрения, не было. Разве что Фортран стал машиннонезависимым.


  1. kaichou
    09.04.2026 07:34

    В статье нет ответа на вопрос, вынесенный в заголовок.

    Автор знает ответ на него? Я да


  1. VT100
    09.04.2026 07:34

    Что больше всего вымораживало 35 лет назад, так это форматирование вывода.

    … того, как рассказано, пусть кратко, главное …

    Рассказываю. Установка нейронки - требует Intel Fortran.


  1. astenix
    09.04.2026 07:34

    Прям просится:

    INTEGER :: user_age = 30

    REAL :: pi_approx = 3.14159

    CHARACTER(LEN=20) :: user_name = "John Doe"


    1. vadimr
      09.04.2026 07:34

      Кстати, хороший вопрос на понимание языка: чем это отличается по семантике от написанного в посте.


      1. astenix
        09.04.2026 07:34

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


        1. 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

          Это довольно тонкий момент, поэтому я его всегда объясняю студентам.


          1. astenix
            09.04.2026 07:34

            Да, действительно.


  1. aamonster
    09.04.2026 07:34

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


    1. kbtsiberkin
      09.04.2026 07:34

      77 и правда трудно воспринимать и учиться ему. 90й ещё куда ни шло, но с нуля учить на нём тоже так себе. По своим однокурсникам помню, у кого информатика в школе сводилась к офисным пакетам. У кого был хотя бы один класс обучения программированию на паскале, были в сильном выигрыше.

      Рабочий инструмент без большого учебно-методического сопровождения.


      1. aamonster
        09.04.2026 07:34

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


  1. Aggle
    09.04.2026 07:34

    Институт, ЕС-1841, Фортран-77.


    1. WindShear
      09.04.2026 07:34

      То же самое, 2й курс (или 1й - не помню). Я тогда активно писал на бейсике, паскакале и потихоньку уходил на си. Так до сих пор и не понял, в чем сакральность языка.


  1. grammidin4eg
    09.04.2026 07:34

    У меня в институте был Fortran 77. Кафедра активно им пользовалась в расчётах. Но они как раз переходили на MATLAB. Тема использования динозавра Fortran вообще не раскрыта. Да hello world этот мало говорит о языке и его возможностях. А поговорить там есть о чем.