Экосистема: fpm, stdlib и современный Fortran
Современный Fortran — это не только язык, но и живая экосистема: пакетный менеджер fpm, стандартная библиотека stdlib и активное сообщество, меняющие то, как пишут научный код.
fpm (Fortran Package Manager) — официальный инструмент сборки и управления зависимостями Fortran-проектов; stdlib — community-библиотека «недостающих» процедур общего назначения, дополняющая встроенные средства языка.
Болезнь, которую лечит экосистема
Десятилетиями у Fortran не было того, что в других языках считается само собой разумеющимся: единого способа собрать проект, подключить чужую библиотеку, прогнать тесты. Каждая лаборатория изобретала свои Makefile, копировала исходники зависимостей вручную, и переносимость страдала. Питон имеет pip, Rust — cargo, а Fortran жил с «зоопарком» самописных сборок. Это отпугивало новичков и тормозило обмен кодом. С 2020 года ситуация изменилась: появились fpm (по образцу cargo) и stdlib (общая стандартная библиотека), а вокруг них — активное сообщество (сайт fortran-lang.org, форумы, регулярные релизы). Современный Fortran — это уже не «язык с суперкомпьютеров 80-х», а развивающаяся платформа с человеческим тулингом.
fpm: сборка без боли
fpm устраняет ручные Makefile. Он соблюдает соглашение о структуре проекта: исходники в src/, программы в app/, тесты в test/, а метаданные — в файле fpm.toml. Одной командой fpm build он сам находит файлы, разбирает зависимости по операторам use, выстраивает правильный порядок компиляции модулей и собирает проект. fpm run запускает программу, fpm test — тесты.
# Структура fpm-проекта:
myproject/
fpm.toml # манифест: имя, версия, зависимости
src/
mymodule.f90 # библиотечные модули
app/
main.f90 # точка входа (program)
test/
test_mymodule.f90
# Команды:
fpm build # собрать
fpm run # запустить программу из app/
fpm test # прогнать тесты из test/
Манифест fpm.toml — это сердце проекта. В нём задают имя, версию и, главное, зависимости: можно указать чужую библиотеку прямо ссылкой на её git-репозиторий, и fpm сам её скачает, соберёт и слинкует. Это та самая «магия cargo/pip», которой Fortran так долго не хватало.
# fpm.toml
name = "myproject"
version = "0.1.0"
[dependencies]
stdlib = { git = "https://github.com/fortran-lang/stdlib" }
# любая зависимость — просто ссылка на git-репозиторий
Сравните это с прошлым, где подключение библиотеки означало вручную скачать исходники, разобраться в их Makefile, выставить пути к .mod и объектным файлам. fpm превращает это в одну строку манифеста — революция для воспроизводимости и обмена научным кодом.
stdlib: то, чего не хватало в языке
Встроенные средства Fortran покрывают математику и массивы, но многих «бытовых» вещей в стандарте нет: разбор строк, продвинутая статистика, специальные функции, структуры данных (хеш-таблицы, списки), удобный ввод-вывод. Раньше каждый писал их сам. stdlib — это community-библиотека, собирающая такие процедуры в одном проверенном месте, по сути «расширенная стандартная библиотека». Модули stdlib организованы по темам: stdlib_stats (статистика), stdlib_string_type (строки), stdlib_linalg (линейная алгебра-обёртки над LAPACK), stdlib_sorting (сортировки), stdlib_io и другие.
program use_stdlib
use stdlib_stats, only: mean, var, median
use stdlib_sorting, only: sort
implicit none
real :: data(6) = [3.0, 1.0, 4.0, 1.0, 5.0, 9.0]
print *, "Среднее: ", mean(data)
print *, "Дисперсия:", var(data)
print *, "Медиана: ", median(data)
call sort(data) ! сортировка на месте
print *, "Отсортировано:", data
end program use_stdlib
Эти процедуры написаны и оттестированы сообществом, переносимы и подключаются через fpm одной зависимостью. stdlib избавляет от велосипедов: вместо собственной (вероятно, с багами) сортировки или статистики берут проверенную из общей библиотеки. Постепенно лучшие части stdlib попадают и в сам стандарт языка — так экосистема влияет на эволюцию Fortran.
Тестирование как часть культуры
Историческая беда научного кода — почти полное отсутствие автоматических тестов: проверяли «на глаз» по нескольким прогонам. Современная экосистема меняет это. fpm имеет встроенную команду fpm test, а сообщество выработало фреймворки модульного тестирования (testdrive и другие). Тест — это обычная программа, которая проверяет условия и сообщает об ошибке через ненулевой код возврата или error stop.
program test_mean
use stdlib_stats, only: mean
implicit none
real :: x(3) = [2.0, 4.0, 6.0]
real :: expected = 4.0
if (abs(mean(x) - expected) > 1.0e-6) then
print *, "FAIL: mean неверно"
error stop 1 ! провал теста — ненулевой код
end if
print *, "PASS: mean корректно"
end program test_mean
Оператор error stop завершает программу с диагностикой и ненулевым кодом, что системы CI (continuous integration) трактуют как провал теста. Покрытие численного кода тестами — признак зрелого проекта: оно ловит регрессии при изменении алгоритмов и даёт уверенность при рефакторинге, особенно важную, когда от корректности расчёта зависят научные выводы.
Куда движется язык
Fortran продолжает развиваться. Стандарт Fortran 2018 усилил параллелизм (коллективные подпрограммы, события, команды teams для coarrays) и улучшил интеропfamilyс C. Fortran 2023 добавил удобства: более гибкие условные выражения, улучшения для do concurrent (редукции, локальность), новые intrinsic-функции, типизированные перечисления. Общий вектор ясен: язык догоняет современные нужды (параллелизм, удобство, безопасность типов), сохраняя обратную совместимость и фокус на производительности. Параллельно растёт тулинг: language server для редакторов (fortls), форматтеры (fprettify), линтеры. Всё это делает Fortran 2020-х живым выбором для новых научных проектов, а не только наследием.
| Инструмент | Роль | Аналог |
| fpm | сборка и зависимости | cargo, pip |
| stdlib | расширенная стандартная библиотека | стандартная библиотека Python |
| testdrive | модульное тестирование | pytest, JUnit |
| fortls | language server для IDE | pylance, rust-analyzer |
| fprettify | форматирование кода | black, rustfmt |
Как работает под капотом
fpm под капотом — это сам по себе Fortran-программа, которая разбирает дерево исходников, строит граф зависимостей модулей (анализируя операторы use и определения модулей), вычисляет корректный топологический порядок компиляции и вызывает компилятор (gfortran, ifort и др.) с нужными флагами и путями к .mod. Зависимости из git он клонирует в кеш и собирает так же, рекурсивно. По сути fpm автоматизирует ровно ту работу, что раньше вручную прописывали в Makefile: «сначала собери модуль A, потом B, который его использует». Поскольку граф строится из самого кода, рассинхрон порядка сборки (классический источник ошибок .mod) исключён. stdlib технически — обычная fpm-совместимая библиотека модулей; «магии» в ней нет, её ценность в том, что код написан, оттестирован и поддерживается сообществом централизованно. Эта связка (стандартный сборщик + общая библиотека + тесты) и есть то, что превращает разрозненные Fortran-исходники в современную инженерную экосистему.
Структура реального проекта и разделение ответственности
Соглашения fpm — не произвольная бюрократия, а кодификация здравой структуры проекта, выработанной всей индустрией. Разделение на src/, app/ и test/ отражает три разные роли кода. В src/ живёт библиотечная часть — модули с типами и процедурами, которые и составляют ценность проекта; они не запускаются сами по себе, а предоставляют функциональность. В app/ — исполняемые программы (program), точки входа, которые собирают библиотечные модули в работающее приложение; их может быть несколько (разные утилиты на одном ядре). В test/ — тесты, проверяющие библиотеку. Это разделение заставляет думать о коде правильно: основную логику оформлять как переиспользуемую библиотеку модулей, а не запихивать всё в одну гигантскую программу. Библиотечный код легче тестировать, переиспользовать в разных приложениях и подключать как зависимость в другие проекты.
Дополнительная сила fpm — в том, что ваш проект сам может стать чужой зависимостью одной строкой. Опубликовав его на git, вы позволяете другим написать в своём fpm.toml ссылку на ваш репозиторий — и fpm подтянет, соберёт и слинкует ваш код автоматически. Это запускает сетевой эффект, которого Fortran-сообществу так долго не хватало: библиотеки становятся легко делимыми, и вокруг fpm растёт реестр пакетов (от обёрток над научными библиотеками до утилит общего назначения). Эффект тот же, что дали pip питону и cargo Rust: чем проще делиться кодом, тем больше переиспользования, тем быстрее развивается экосистема. Для научного Fortran, где десятилетиями каждый писал свой велосипед, это качественный сдвиг к культуре общих, проверенных, переиспользуемых компонентов.
Образ современного Fortran: итог курса
Этот заключительный урок подводит черту под всем курсом, и стоит сформулировать целостный образ Fortran 2020-х, потому что он сильно отличается от стереотипов. Fortran — не «мёртвый язык перфокарт», а живая, развивающаяся платформа с тремя опорами. Первая — сам язык: современный, с модулями, ООП, параллелизмом, встроенным в стандарт, продуманной интероперабельностью, регулярно обновляемый (2008, 2018, 2023) и сохраняющий обратную совместимость на десятилетия. Вторая — несравненная производительность: Fortran остаётся эталоном скорости численных вычислений, его компиляторы выжимают из железа максимум, а эталонные библиотеки (BLAS, LAPACK) лежат в основе всей вычислительной науки. Третья — современная экосистема: fpm, stdlib, тестовые фреймворки, language server, форматтеры — человеческий тулинг, которого язык так долго был лишён.
Сложив всё, что вы прошли — от модулей и интерфейсов через объектную модель, продвинутый ввод-вывод и численные методы до параллелизма и интеграции, — получаем язык, идеально заточенный под одну великую задачу: высокопроизводительные научные и инженерные вычисления. Климатические модели, прогноз погоды, аэродинамика, квантовая химия, астрофизические симуляции, расчёты прочности, вычислительная гидродинамика — всё это и сегодня в значительной мере пишется и считается на Fortran, потому что ни один язык не сочетает так удачно вычислительную мощь, выразительность для работы с массивами и многоуровневыми математическими моделями, встроенный параллелизм и зрелую численную экосистему. Изучив современный Fortran, вы получили инструмент, на котором человечество в буквальном смысле моделирует климат планеты, проектирует самолёты и заглядывает в недра звёзд. Это не наследие прошлого, а действующий рабочий инструмент переднего края науки — и теперь он в вашем распоряжении. Дальнейший путь — практика: возьмите реальную расчётную задачу, оформите её модульно, протестируйте, при необходимости распараллельте и оптимизируйте по данным профилирования, опираясь на готовые библиотеки. Именно так, на настоящих задачах, знание превращается в мастерство, а Fortran раскрывает то, ради чего создавался, — способность считать быстро, точно и в масштабах, недоступных другим языкам.
Частые ошибки
- Писать Makefile вручную для нового проекта. fpm разбирает зависимости автоматически и переносим; ручной Makefile хрупок и часто ошибается с порядком модулей.
- Изобретать велосипеды вместо stdlib. Своя сортировка/статистика, вероятно, с багами; берите проверенные процедуры stdlib.
- Игнорировать тесты в численном коде. Без
fpm testи проверок регрессии незаметно ломают расчёт;error stopв тестах интегрируется с CI. - Считать Fortran «мёртвым» языком из 80-х. Стандарты 2018/2023 и тулинг (fpm, stdlib, fortls) делают его актуальным для новых проектов.
- Класть исходники вне соглашений fpm. fpm ожидает
src/,app/,test/; нарушение структуры мешает автоматической сборке.
Итоги
- fpm — официальный сборщик и менеджер зависимостей: структура
src/app/test, манифестfpm.toml, зависимости ссылкой на git. - stdlib — community «расширенная стандартная библиотека»: статистика, строки, сортировки, линейная алгебра поверх LAPACK.
- Тестирование вошло в культуру:
fpm test, фреймворки,error stopдля интеграции с CI. - Язык развивается: Fortran 2018/2023 усиливают параллелизм, удобство и интероп; растёт тулинг (fortls, fprettify).
- Современный Fortran — живая инженерная экосистема, а не только наследие суперкомпьютеров прошлого.