Чому фізики все ще використовують Fortran

Не знаю, як виглядатиме мова програмування у 2000-му році, але я знаю, що називатиметься вона буде FORTRAN. - Чарльз Ентоні Річард Хоар, бл. 1982 В індустрії Fortran сьогодні використовується рідко - в одному зі списків популярних мов він опинився на 28 місці. Але Fortran все ще є головною мовою для великомасштабних симуляцій фізичних систем – тобто для таких речей, як астрофізичне моделювання зірок і галактик (напр. Flash), великомасштабної молекулярної динаміки, коди підрахунку електронних структур (SIESTA), кліматичні моделі тощо. У галузі високопродуктивних обчислень, підмножиною яких є великомасштабні числові симуляції, сьогодні використовуються лише дві мови – C/C++ та «сучасний Fortran» (Fortran 90/95/03/08). Популярні бібліотеки Open MPI для розпаралелювання коду були розроблені для цих двох мов. Загалом, якщо вам потрібен швидкий код, який працює на кількох процесорах, у вас є лише два варіанти. У сучасному Fortran є така особливість, як coarray, що дозволяє прямо в мові працювати з паралельним програмуванням. Coarray з'явилися у розширенні Fortran 95, а потім були включені до Fortran 2008.

Активне використання Fortran фізиками часто бентежить фахівців з інформатики та інших не пов'язаних з цією областю людей, яким здається, що Fortran – історичний анахронізм. Я хотів би пояснити, чому Fortran досі залишається корисним. Я не закликаю студентів, які вивчають фізику, вчити Fortran – оскільки більшість із них займатимуться дослідженнями, їм краще зайнятися вивченням C/C++ (або зупинитися на Matlab/Octave/Python). Я хотів би пояснити, чому Fortran все ще використовується, і довести, що це не тільки через те, що фізики відстають від моди (хоча інодіце так і є – торік я бачив студента-фізика, який працював із кодом Fortran 77, при цьому ні він, ні його керівник нічого не чули про Fortran 90). Фахівці з інформатики повинні розглядати перевагу Fortran у числових обчисленнях як виклик.

Перед тим, як заглибитись у тему, я хочу обговорити історію, оскільки, коли люди чують слово «Fortran», вони одразу уявляють собі перфокарти та код із пронумерованими рядками. Перша специфікація Fortran була написана 1954 року. Ранній Fortran (тоді його назва писалася великими літерами, FORTRAN), був, за сучасними мірками, пекельною мовою, але це був неймовірний крок вперед від попереднього програмування на асемблері. На FORTRAN часто програмували за допомогою перфокарт, як це без задоволення згадує професор Міріам Форман з університету Стоні Брук. Fortran мав багато версій, найвідоміші з яких – стандарти 66, 77, 90, 95, 03 і 08.

Часто кажуть, що Fortran досі використовують через його швидкість. Але чи найшвидший він? На сайті benchmarksgame.alioth.debian.org є порівняння C та Fortran у кількох тестах серед багатьох мов. Найчастіше Fortran і C/C++ виявляються найшвидшими. Улюблений програмістами Python часто відстає у швидкості в 100 разів, але це в порядку речей для коду, що інтерпретується. Python не підходить для складних числових обчислень, але добре підходить для іншого. Що цікаво, C/C++ виграє у Fortran у всіх тестах, крім двох, хоча загалом за результатами вони мало відрізняються. Тести, де Fortran виграє, найбільш «фізичні» – це симуляція системи з n тіл та розрахунок спектра. Результати залежить від кількості ядер процесора, наприклад, Fortran трохи відстає від C/C++ на четырехъядерном. Тести, в яких Fortran сильно відстає відC/C++, більшу частину часу займаються читанням і записом даних, і щодо цього повільність Fortran відома.

Так що C/C++ настільки ж швидкий, наскільки Fortran, а іноді і трохи швидше. Нас цікавить, чому професори фізики продовжують радити своїм студентам використовувати Fortran замість C/C++?

Fortran має успадкований код

Завдяки довгій історії Fortran не дивно, що на ньому написані гори коду з фізики. Фізики намагаються мінімізувати час на програмування, тому, якщо вони знайдуть раніше код, вони будуть його використовувати. Навіть якщо старий код незручний, погано документований і не найефективніший, частіше використовувати старий перевірений, ніж писати новий. Завдання фізиків – не писати код, намагаються зрозуміти природу реальності. У професорів успадкований код завжди під рукою (часто цей код вони й писали десятиліття тому), і вони передають його своїм студентам. Це зберігає їх час і видаляє невизначеності з усунення помилок.

Студентам-фізикам вивчати Fortran легше, ніж C/C++

Я думаю, що вивчати Fortran легше, ніж C/C++. Fortran 90 і C дуже схожі, але Fortran писати простіше. C – мова порівняно примітивна, тому фізики, які обирають C/C++, займаються об'єктно-орієнтованим програмуванням. ООП може бути корисним, особливо у великих програмних проектах, але вивчати його набагато довше. Потрібно вивчати такі абстракції, як класи та успадкування. Парадигма ООП дуже відрізняється від процедурної, що використовується у Fortran. Fortran заснований на найпростішій процедурній парадигмі, наближеній до того, що відбувається у комп'ютера «під капотом». Коли ви оптимізуєте/векторизуєте код збільшення швидкості, з процедурною парадигмою легше працювати. Фізики зазвичайрозуміють, як працюють комп'ютери, і мислять у термінах фізичних процесів, наприклад передачі даних з диска в RAM, а з RAM в кеш процесора. Вони відрізняються від математиків, які вважають за краще розмірковувати в термінах абстрактних функцій та логіки. Також це мислення відрізняється від об'єктно-орієнтованого. Оптимізація ООП-коду складніша з моєї точки зору, ніж процедурного. Об'єкти – дуже громіздкі структури порівняно зі структурами даних, які віддають перевагу фізикам: масивам.

Вакансія Fortran с массивами, компанія Легкость первая |

Масиви, чи, як звати фізики, матриці, перебувають у серці всіх фізичних обчислень. У Fortran 90+ можна знайти багато можливостей для роботи з ними, схожих на APL і Matlab/Octave. Масиви можна копіювати, множити на скаляр, перемножувати між собою дуже інтуїтивним чином:

У Fortran доступом до елементів масиву працює через простий синтаксис A[x,y,z], як у C/C++ потрібно писати A[x][y][z]. Елементи масивів починаються з 1, що відповідає уявленням фізиків про матриці, а масивах C/C++ нумерація починається з нуля. Ось ще кілька функцій для роботи з масивами Fortran.

Негативний індекс спочатку виглядає безглуздо, але я чув про їхню корисність – наприклад, уявіть, що це додаткова область для розміщення якихось пояснень. Fortran також підтримує векторні індекси. Наприклад, можна передати елементи 1,5 і 7 з масиву A розмірністю N x 1 масив B розмірністю 3 x 1:

Fortran підтримує маски масивів у всіх внутрішніх функціях. Наприклад, якщо нам потрібно порахувати логарифм всіх елементів матриці, більших за нуль, ми використовуємо:

Або ми можемо в один рядок обнулити всі негативні елементи масиву:

У Fortran легко динамічно розміщувати та звільнятимасиви. Наприклад, розміщення двовимірного масиву:

Для звільнення масиву в Fortran

Легкість друга: не потрібно турбуватися про покажчики та виділення пам'яті

У мовах на кшталт C/C++ всі змінні передаються за значенням, крім масивів, що передаються за посиланням. Але у багатьох випадках передача масиву за значенням має більше сенсу. Наприклад, нехай дані складаються з позицій 100 молекул у різні періоди часу. Нам необхідно аналізувати рух однієї молекули. Ми беремо зріз масиву (підмасив), що відповідає координатам атомів у цій молекулі і передаємо його в функцію. У ній ми займатимемося складним аналізом переданого підмасиву. Якби ми передавали його за посиланням, передані дані не були б у пам'яті поспіль. Через особливості доступу до пам'яті робота з таким масивом була б повільною. Якщо ми передамо його за значенням, ми створимо в пам'яті новий масив, розташований поспіль. На радість фізиків, компілятор бере на себе всю брудну роботу з оптимізації пам'яті.

У Fortran змінні зазвичай передаються за посиланням, а чи не за значенням. Під капотом компілятор Fortran автоматично оптимізує їх передачу підвищення ефективності. З точки зору професора в області оптимізації використання пам'яті компілятор варто довіряти більше, ніж студенту! У результаті фізики рідко використовують покажчики, хоча Fortran-90+ вони є.

Ще кілька прикладів відмінностей Fortran та C

У Fortran є кілька можливостей для керування компілятором при пошуку помилок та оптимізації. Помилки коду можна відловити на етапі компіляції, а не при виконанні. Наприклад, будь-яку змінну можна оголосити як параметр, тобто константу.

Якщо параметр коду змінюється, компілятор повертає помилку. У це називаєтьсяconst

Проблема в тому, що const real відрізняється від простого real. Якщо функція, що приймає real, отримає const real, вона поверне помилку. Легко уявити, як це може призвести до проблем функціональної сумісності коду.

У Fortran також є специфікація intent, повідомляє компілятору, чи є аргумент, що передається в функцію, вхідним, вихідним, або одночасно вхідним і вихідним параметром. Це допомагає компілятору оптимізувати код і збільшує його читання та надійність.

У Fortran є й інші особливості, що використовуються з різною частотою. Наприклад, у Fortran 95 можна оголошувати функції з модифікатором pure [чистий]. Така функція не має побічних ефектів – вона змінює лише свої аргументи, і не змінює глобальні змінні. Особливим випадком такої функції служить функція elemental, яка приймає та повертає скаляри. Вона використовується для обробки елементів масиву. Інформація про те, що функція pure або elemental, дозволяє компілятор проводити додаткову оптимізацію, особливо при розпаралелювання коду.

Чого чекати у майбутньому?

У наукових підрахунках Fortran залишається основною мовою і найближчим часом зникати не збирається. На опитуванні серед відвідувачів конференції «2014 Supercomputing Convention», які використовують цю мову, 100% з них сказали, що збираються використовувати її в найближчі 5 років. З опитування також випливає, що 90% використовували суміш з Fortran і C. Передбачаючи збільшення змішування цих мов, творці специфікації Fortran 2015 включають більше можливостей для функціональної сумісності коду. Код Fortran все частіше викликається з коду Python. Фахівці з інформатики, що критикують використання Fortran, не розуміють, що ця мова залишається унікально пристосованою для того, щоб на честьчого він був названий - FOrmula TRANslation, переведення формул, тобто перетворення фізичних формул на код. Багато хто з них не здогадується, що мова розвивається і постійно включає нові можливості.

Називати сучасний Fortran 90+ старим, це все одно, що називати старим C++ через те, що C розробили в 1973. З іншого боку, навіть у найновішому стандарті Fortran 2008 існує зворотна сумісність з Fortran 77 і здебільшого Fortran 66. Тому технологія мови пов'язана з певними труднощами. Нещодавно дослідники з MIT вирішили подолати ці труднощі, розробивши з нуля мову для HPC на ім'я Julia, яка вперше вийшла в 2012 році. Чи займе Julia місце Fortran, ще побачити. У будь-якому разі, підозрюю, що це відбуватиметься дуже довго.

Ви можете допомогти і перевести небагато коштів на розвиток сайту