Языки программирования

Учебник Fortran для начинающих

40 уроков · 10 разделов · бесплатно, без регистрации

Fortran — старейший из живых языков программирования и одновременно главный рабочий инструмент вычислительной науки: на нём считают погоду, моделируют ядерные реакторы, рассчитывают аэродинамику и крутят суперкомпьютеры из списка TOP500. Этот курс — не музейная экскурсия, а введение в современный Fortran (стандарты 2008 и 2018): вы научитесь думать массивами, понимать модель точности через параметр KIND, писать чистые процедуры и использовать конструкции, ради которых физики и инженеры выбирают именно этот язык.

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

Курс «Fortran: научные и инженерные вычисления» состоит из 10 разделов и 40 уроков: Что такое Fortran и почему он жив, Основы: программа, переменные, типы, Управление потоком, Массивы — сердце Fortran, Процедуры, Модули и интерфейсы, Производные типы и ООП, Ввод-вывод и файлы, Численные вычисления и производительность и Параллелизм и современный Fortran. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.

Программа курса

  1. 1 Что такое Fortran и почему он жив

    1. Что такое Fortran и почему он жив

      История Fortran от 1957 до стандарта 2018, его ниши в HPC и науке, и почему старейший язык до сих пор актуален.

    2. Синтаксис: формат, комментарии, структура программы

      Свободный формат Fortran, комментарии, продолжение строк амперсандом и каркас программной единицы.

    3. Компиляторы, флаги и сборка проекта

      Компиляторы gfortran и ifx, важные флаги, многофайловая сборка через модули и инструменты make, CMake, fpm.

    4. Fortran среди других языков и связь с C

      Честное сравнение Fortran с C++, Python и Julia, его сильные и слабые стороны и связывание с C через iso_c_binding.

  2. 2 Основы: программа, переменные, типы

    1. Переменные и пять встроенных типов

      Пять встроенных типов Fortran (integer, real, complex, logical, character), объявление переменных и обязательный implicit none.

    2. Параметр KIND и точность вычислений

      Как KIND управляет точностью и диапазоном чисел, переносимый запрос двойной точности и почему нельзя сравнивать real на равенство.

    3. Константы и литералы

      Именованные константы через parameter, целые/вещественные/комплексные/логические и символьные литералы в Fortran.

    4. Выражения, преобразование типов и операторы

      Арифметика Fortran: приоритет операторов, ловушка целочисленного деления, преобразование типов и логические выражения.

  3. 3 Управление потоком

    1. Условный оператор if/else if/else

      Блочный и однострочный if, цепочки else if, именованные конструкции и почему в Fortran нет гарантии короткого замыкания.

    2. Множественный выбор: select case

      Конструкция select case со списками и диапазонами значений, отличие от switch в C и таблица переходов под капотом.

    3. Счётный цикл do

      Счётный цикл do: шаг, обратный отсчёт, вложенность, тонкости управляющей переменной и числа итераций.

    4. do while, exit, cycle и do concurrent

      Условный цикл do while, бесконечный do, управление потоком через exit/cycle с именами и параллельный do concurrent.

  4. 4 Массивы — сердце Fortran

    1. Объявление массивов, ранг и форма

      Объявление массивов в Fortran, произвольные границы индексов, ранг, форма и размер, запросные функции и конструкторы.

    2. Операции над массивами целиком

      Поэлементная арифметика, broadcasting скаляров, элементные функции и редукции (sum, dot_product, matmul) без явных циклов.

    3. Секции, шаги и условный where

      Секции массивов через триплет low:high:stride, вырезание строк и столбцов матриц, условное присваивание where/elsewhere.

    4. Динамическая память и хранение по столбцам

      Allocatable-массивы, безопасное выделение, автоперевыделение и критичное для скорости хранение по столбцам (column-major).

  5. 5 Процедуры

    1. subroutine и function

      Два вида процедур Fortran: subroutine для действий и function для вычислений, раздел contains и явный интерфейс.

    2. Аргументы и intent

      Передача аргументов по ссылке и атрибут intent (in/out/inout) как контракт, защищающий данные и помогающий компилятору.

    3. Рекурсия, optional-аргументы и save

      Рекурсивные процедуры, необязательные и именованные аргументы с present, атрибут save и его ловушка неявной инициализации.

    4. Чистые и элементные процедуры

      Атрибуты pure и elemental: процедуры без побочных эффектов, поэлементное применение к массивам и безопасный параллелизм.

  6. 6 Модули и интерфейсы

    1. Модули: module, use и контроль доступа

      Что такое модуль в Fortran, зачем он нужен, как работают use, only, rename, public и private, и почему модули вытеснили COMMON-блоки и include-файлы.

    2. Явные интерфейсы: почему компилятор должен видеть сигнатуру

      Явный и неявный интерфейс процедуры в Fortran, блок interface для внешних процедур, и почему ассумированные массивы и intent требуют явного интерфейса.

    3. Generic-интерфейсы и перегрузка операторов

      Generic-интерфейсы Fortran: одно имя для процедур с разными типами, перегрузка операторов через interface operator и присваивания через interface assignment.

    4. Submodules: разделение спецификации и реализации

      Submodules в Fortran 2008: разделение интерфейса (module) и реализации (submodule) для ускорения сборки, разрыва циклов и сокрытия деталей.

  7. 7 Производные типы и ООП

    1. Производные типы и связанные процедуры

      Производные типы Fortran: объявление type, компоненты, конструкторы, и type-bound procedures с передаваемым аргументом pass для методов объекта.

    2. Наследование через extends

      Наследование в Fortran: расширение типа через extends, добавление компонентов и методов, доступ к родителю и переопределение связанных процедур.

    3. Полиморфизм: class, select type и динамическая диспетчеризация

      Полиморфизм в Fortran: переменные class, динамический выбор метода, конструкция select type, allocate с полиморфными объектами и контейнеры разнородных типов.

    4. Абстрактные типы, deferred и финализация

      Абстрактные производные типы в Fortran: abstract, deferred-процедуры и abstract interface, паттерн интерфейс плюс реализации, и финализаторы final.

  8. 8 Ввод-вывод и файлы

    1. Форматный ввод-вывод и дескрипторы формата

      Форматный вывод в Fortran: оператор format и строки формата, дескрипторы I, F, E, ES, A, X, и управление шириной, точностью и выравниванием чисел.

    2. Списочный ввод-вывод и namelist

      Списочный ввод-вывод Fortran (print star) и namelist: удобный вывод без формата, чтение свободных данных и группы namelist для конфигурационных файлов.

    3. Неформатный и потоковый (stream) доступ

      Неформатный (binary) и потоковый stream-ввод-вывод в Fortran: запись чисел без потери точности, record-маркеры sequential против stream access и совместимость с C.

    4. open, close и обработка ошибок через iostat

      Управление файлами в Fortran: open с newunit, спецификаторы status и action, close, и надёжная обработка ошибок ввода-вывода через iostat, iomsg и end/err.

  9. 9 Численные вычисления и производительность

    1. Intrinsic-функции и управление точностью

      Встроенные функции Fortran для массивов (sum, maxval, pack) и точность вычислений: параметр kind, selected_real_kind, одинарная и двойная точность, epsilon.

    2. Матрицы, matmul, dot_product и BLAS/LAPACK

      Линейная алгебра в Fortran: операции с массивами, matmul и dot_product, транспонирование, и когда переходить на библиотеки BLAS и LAPACK для больших систем.

    3. Кэш и порядок по столбцам: как устроена скорость

      Производительность Fortran и память: column-major порядок хранения массивов, локальность данных, иерархия кэша и правильный порядок вложенных циклов.

    4. Векторизация и оптимизация

      Векторизация в Fortran: SIMD-инструкции, как помочь компилятору векторизовать циклы, чистые процедуры, флаги оптимизации и измерение производительности.

  10. 10 Параллелизм и современный Fortran

    1. Coarrays: параллелизм, встроенный в язык

      Coarrays в Fortran 2008: модель образов (images), синтаксис codimension и квадратных скобок, доступ к данным других образов и синхронизация sync all.

    2. do concurrent, OpenMP и MPI

      Три модели параллелизма Fortran: do concurrent для независимых циклов, OpenMP-директивы для многоядерности с общей памятью и MPI для кластеров с распределённой памятью.

    3. Интероперабельность с C: iso_c_binding и bind(c)

      Связь Fortran и C: модуль iso_c_binding, атрибут bind(c), совместимые типы c_int и c_double, передача массивов и строк, вызов C-функций и c_ptr.

    4. Экосистема: fpm, stdlib и современный Fortran

      Современная экосистема Fortran: пакетный менеджер fpm, стандартная библиотека stdlib, как организован проект, тесты и куда движется язык Fortran 2018/2023.