Язык Fortran. Язык программирования Fortran - описание, основные команды и функции

21.07.2019

Введение

Еще лет десять назад, до массового появления персональных компьютеров в бывшем СССР, в представлении большинства наших сограждан основными (чаще всего, единственными) пользователями ЭВМ были программисты. Вернее, термин "пользователь" вообще не существовал, а его синонимом был "программист". При этом самих программистов довольно часто называли "математиками", потому что в большинстве своем вычислительные машины (EC, СМ) использовались для решения научно-технических задач, связанных с интенсивными математическими расчетами.

Надо признать, что на протяжении всей своей жизни Fortran не отличался изысками в области технологии программирования. Жесткая структура кода программы, довольно примитивный набор операторов управления структурой программы (без оператора GOTO написать программу было практически невозможно), слабые средства описания данных - все это было общеизвестно.

Отличительной особенностью математических расчетных задач является высокая степень консерватизма используемых в них алгоритмов. Например, математические модели для расчета траекторий космических кораблей остаются, по большому счету, примерно такими же, как и тридцать лет назад. Разумеется, они постоянно уточняются и расширяются, но, как правило, ранее созданные расчетные модули входят в новые модели в качестве готовых частных блоков. Короче говоря, жизненный цикл математических программ существенно превышает время существования конкретных компьютерных платформ.

Сильной стороной языка, обеспечивающей долговечность разработанных на нем программ, всегда была высокая степень переносимости исходного кода между различными платформами (как существующими в данный момент, так и будущими). В основе такой совместимости лежит наличие достаточно жесткого стандарта, которого стараются придерживаться все разработчики компиляторов. Ранее стандарты языков программирования являлись формально чисто американскими и утверждались Американским Национальным Институтом Стандартов (American National Standard Institute - ANSI), позднее они стали фиксироваться также Международной Организацией Стандартов (International Standard Organization - ISO). Поэтому современные стандарты имеют обозначение ANSI/ISO.

Целью курсовой работы является изучение программы Fortran, его версии, отличия от других программ и составление программ на языке программирования Fortran.

Глава 1. История

Фортран (Fortran) - первый язык программирования высокого уровня <#"justify">Современный Фортран (Fortran 95 и Fortran 2003) приобрёл черты, необходимые для эффективного программирования для новых вычислительных архитектур, позволяет применять современные технологии программирования. Фортран имеет достаточно большой набор встроенных математических функций, поддерживает работу с целыми, вещественными и комплексными числами высокой точности. Выразительные средства языка изначально были весьма бедны, поскольку Фортран был одним из первых языков высокого уровня. В дальнейшем в Фортран были добавлены многие лексические конструкции, характерные для структурного, функционального и даже объектно-ориентированного программирования.

Глава 2. Fortran

Первоначальный выпуск FORTRAN для IBM 704, содержащиеся 32 отчетность <#"justify">1.измерение и эквивалентность отчетность

.Операторы присваивания

3.три пути арифметики <#"justify">Подпрограммы, функция, конец

Вызов и возврвщение

В течение следующих нескольких лет, FORTRAN II бы также добавить поддержку ДВОЙНОЙ ТОЧНОСТИ и КОМПЛЕКС типы данных.

Простой FORTRAN II

Эту программу, для Герона формула <#"justify">§Основная программа, ПОДПРОГРАММЫ, ФУНКЦИЯ, и БЛОК ДАННЫХ, программа единиц

§ЦЕЛОЕ ЧИСЛО, РЕАЛЬНЫЕ, ДВОЙНОЙ ТОЧНОСТИ, КОМПЛЕКС, и ЛОГИЧЕСКИЕ типы данных <#"justify">FORTRAN 77

После выхода FORTRAN 66 стандартных, компилятор поставщиков представил ряд расширений для "Стандарт Fortran", предлагая ANSI в 1969 году, чтобы начать работу по пересмотру 1966 стандарта. Окончательный этот пересмотренный стандарт распространен в 1977 году, ведущих к официального утверждения нового FORTRAN стандарт в апреле 1978 года. Новый стандарт, известный какFORTRAN 77, добавлен ряд существенных особенностей, для решения многих недостатков FORTRAN 66:

§Блок ЕСЛИ и КОНЕЦ ЕСЛИ заявления, с дополнительными ЕЩЕ и ОСТАЛЬНОЕ, ЕСЛИ положения, чтобы обеспечить улучшенная поддержка языков структурное программирование <#"justify">В этом пересмотра стандарта, ряд функций, были удалены или изменены таким образом, что может аннулировать ранее в соответствии со стандартом программ. (Удаление была единственной допустимой альтернативой X3J3 в то время, поскольку концепция "осуждения" еще не был доступен для стандарты ANSI.) В то время как большинство из 24 пунктов в ходе конфликта списка (см. Приложение A2 X3.9-1978) обратился лазейки или патологических случаев, разрешенных предыдущего стандарта, но редко используется, небольшое число конкретных возможностей были умышленно удалены, таких как:

§Чтение в Д edit (Hollerith поле) дескриптор в ФОРМАТЕ, спецификация.

§Overindexing из границ массива с индексами.

ИЗМЕРЕНИЕ(10,5)= A(11,1)

§Передача управления в диапазоне цикл DO (также известный как "Extended Range").

В значительной задержкой во преемника на FORTRAN 77, неофициально известной как Fortran 90 (а до этого, Fortran 8X), был, наконец, выпущен в качестве стандарта ISO, в 1991 г, и ANSI Стандарт в 1992 году. Этот крупный пересмотр добавлено много новых функций, чтобы отразить значительные изменения в практике программирования, который сложился с 1978 года стандарт:

§Свободной форме входного источника <#"justify">§всего, частичной и масках массива операторы присваивания и массив выражений, таких как X(1:N)=R(1:N)*COS(A(1:N))

§ГДЕ заявление для селективного массива назначения

§массив-значной константы и выражения,

§определяемые пользователем массив-значных функций и массивов конструкторов.

§РЕКУРСИВНАЯ <#"justify">Fortran 95

Fortran 95 был несовершеннолетним пересмотра, в основном, для решения некоторых нерешенных вопросов от стандарта Fortran 90. Тем не менее, Fortran 95 также добавлен ряд расширений, в частности, от High Performance Fortran <#"justify">§FORALL и вложенные ГДЕ конструкции для помощи векторизация

§Определяемые пользователем ЧИСТЫЙ и ЭЛЕМЕНТАЛЬ процедуры

§По умолчанию инициализации производного типа компонентов, включая указатель инициализации

§Расширена возможность использовать выражения инициализации для объектов данных

§Четко определено, что ALLOCATABLE массивы автоматически уничтожается, когда они выходят из области видимости.

Ряд intrinsic-функции были расширены (например, dim аргумент был добавлен в maxloc intrinsic).

Несколько функций, отметил в Fortran 90 к устаревшим были сняты с Fortran 95:

§СДЕЛАТЬ отчетность с использованием РЕАЛЬНЫЕ и ДВОЙНОЙ ТОЧНОСТИ переменные

§Ветвление в КОНЕЦ ЕСЛИ заявление из-за ее блок

§НАЗНАЧЕНИЕ и назначен ГОТО заявление, и назначен спецификаторов формата

§H изменить дескриптор.

Важным дополнением к Fortran 95 был Технический отчет ИСО <#"center">fortran язык программирование платформа

Глава 3. Примеры программ

1.Программа приветствияhellon*,"Hello World!"*, nprogram hello

2.Программа решения квадратного уравненияkvadrat_yravnNONE: : A, B, C, A2: : SQD, X1, X2= 4.0; B = 2.0; C = 1.0= A + A; SQR = SQRT (CMPLX(B * * 2 - 4 * A * C))

X1 = (- B + SQD) / A2; X2 = (- B - SQD) / A2* , КОРНИ УРАВНЕНИЯ:* , X1 = , X1* , X2 = , X2

END PROGRAM kvadrat_yravn

.Вывод таблицы соответствия температур по Цельсию и ФаренгейтуTABLNONE(2) : : I, CELSIUS, FAHRENHEIT*, таблица соответствия между Ц и Ф*, Ц и ФI = 0, 20= 5 * I= 32 + CELSIUS * 9/5*, C = , CELSIUS, F = , FAHRENHEITDO

Заключение

Фортран занимает почетное место среди современных языков программирования. Это один из самых первых языков программирования высокого уровня и с самого своего рождения он предназначался для решения сложных вычислительных задач.

Не смотря на свой «почтенный» возраст, Фортран постоянно обновляется. В среднем один раз в 10 лет выходит новый стандарт языка, учитывающий современное состояние программирования с одной стороны и пожелания программистов-прикладников с другой.

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

Алфавит - в программировании – система неразложимых, уверенно отличимых друг от друга символов (букв, цифр, знаков препинания и др. символов), используемых для построения языков программирования.

Синтаксис - сторона языка программирования, которая описывает структуру программ как наборов символов. Синтаксису языка противопоставляется его семантика. Синтаксис языка описывает «чистый» язык, в то же время семантика приписывает значения различным синтаксическим конструкциям.

Сема́нтика - в программировании - система правил определения поведения отдельных языковых конструкций. Семантика определяет смысловое значение предложений алгоритмического языка.

Языки программирования низкого уровня – Автокод, Ассемблер,

Языки программирования высокого уровня -Фортран, Алгол, Кобол, Паскаль, Бейсик, Си++, Пролог

Языки программирования сверхвысокого уровня – APL, Алгол-68

Вычислительные Языки программирования - Фортран, Паскаль, Алгол, Бейсик, Си

Языки символьной обработки – Лисп, Пролог, Снобол и др.

Языки первого поколения:

Машинные коды были языком программирования первого поколения

Языки второго поколения:

Ассемблер

Языки третьего поколения:

эти языки часто обозначаются как языки «высокого» уровня.

Языки четвертого поколения:

Бейсик, Кобол, Си и Паскаль

Языки программирования пятого поколения:

Пролог, ЛИСП, Си++, Visual Basic, Delphi.

Язык программирования Фортра́н (Fortran)

Первый язык программирования высокого уровня, имеющий транслятор. Создан в период с 1954 по 1957 год группой программистов под руководством Джона Бэкуса в корпорации IBM. Название Fortran является акронимом от FORmula TRANslator (переводчик формул). Фортран широко используется в первую очередь для научных и инженерных вычислений. Одно из преимуществ современного Фортрана - большое количество написанных на нём программ и библиотек подпрограмм. Большинство таких библиотек является фактически достоянием человечества: они доступны в исходных кодах, хорошо документированы, отлажены и весьма эффективны. Поэтому изменять, а тем более переписывать их на других языках программирования накладно, несмотря на то, что регулярно производятся попытки автоматического конвертирования FORTRAN-кода на современные языки программирования.

Современный Фортран (Fortran 95 и Fortran 2003) приобрёл черты, необходимые для эффективного программирования для новых вычислительных архитектур, позволяет применять современные технологии программирования, в частности, ООП.

Эволюция стандартов языка

Фортран - жёстко стандартизированный язык, именно поэтому он легко переносится на различные платформы. Новые стандарты языка в значительной мере сохраняют преемственность с более старыми, что позволяет использовать коды ранее написанных программ и их модифицировать.

FORTRAN 77 (1980)

Введено множество улучшений:

Введены операторы открытия и закрытия файла (OPEN, CLOSE) и вывода на стандартное устройство - PRINT.

Добавлены строковый тип данных и функции для его обработки.

Введён блочный оператор IF и конструкция IF THEN - ELSE IF THEN - END IF, а также оператор включения фрагмента программы INCLUDE.

Введена возможность работы с файлами прямого доступа.

Увеличена максимальная размерность массива с 3 до 7. Сняты ограничения на индексы массива.

Усовершенствованы и расширены возможности работы с процедурами.

Введено понятие внутреннего файла (каковыми являются массивы, числовые и строковые переменные). Внутренние файлы позволяют, в частности, осуществлять преобразование число-строка и строка-число стандартным операторами чтения и записи READ и WRITЕ.

Fortran 90 (1991)

Значительно переработан стандарт языка.

Введён свободный формат написания кода. Появились дополнительные описания IMPLICIT NONE, TYPE, ALLOCATABLE, POINTER, TARGET, NAMELIST.

Введены управляющие операторы и конструкции. Добавлены DO … END DO (вместо завершения цикла меткой), DO WHILE, оператор передачи управления на начало цикла CYCLE, конструкция выбора SELECT CASE (для замены громоздких конструкций IF и операторов GOTO), а также заключительный оператор программной единицы, модульной или внутренней процедуры END.

Введён инструментарий указателей и функции для работы с оперативной памятью (по аналогии с языком С).

Введены операторы работы с динамической памятью (ALLOCATE, DEALLOCATE, NULLIFY).

Добавлены программные компоненты MODULE, PRIVATE, PUBLIC, CONTAINS, INTERFACE, USE, INTENT.

Введено маскирование присваивания массивов (присваивание при выполнении наложенного на элементы массива логического условия без использования операторов условия), а также работа с сечениями массивов. Введён оператор и конструкция WHERE для частичной замены циклов (правая часть оператора присваивания не изменяется). Маскирование присваивания распространяется практически на все операторы, конструкции и функции, оперирующие с массивами.

Стандартные операции присваивания, сложения, вычитания, а также деления и умножения на число распространены на массивы и их секции, определяемые сечениями. В этом случае осуществляется поэлементное присваивание.

Появились новые встроенные функции, в первую очередь для работы с массивами. Функции для вычислений в массивах: ALL(лог. произведение) и MASK(логическое сложение), COUNT(число истинных элементов), PRODUCТ(произведение элементов массива), SUM(сложение элементов массива), DOT_PRODUCT (скалярное произведение), MATMUL (умножение матриц). Добавились справочные функции, а также функции переформирования и свёртки массивов.

В языке появились элементы ООП. Введены производные типы данных. Отдельно объявлен список устаревших черт языка, предназначенных для удаления в будущем.

Добавлены дополнительные функции для работы со строковыми данными, в частности, функции TRIM (удаление завершающих пробелов) и REPEAT(кратное копирование строки) и функции выравнивания по левой и правой границам.

Fortran 95 (1997)

Коррекция предыдущего стандарта. Введён оператор и конструкция FORALL, позволяющие более гибко, чем оператор и конструкция WHERE, присваивать массивы и заменять громоздкие циклы. FORALL позволяет заменить любое присваивание сечений или оператор и конструкцию WHERE, в частности, обеспечивает доступ к диагонали матрицы. Данный оператор считается перспективным в параллельных вычислениях, способствуя более эффективному, чем циклы, осуществлению распараллеливания.

Fortran 2003 (2004)

Дальнейшее развитие поддержки ООП в языке. Взаимодействие с операционной системой. Добавлены также следующие возможности:

Асинхронный ввод-вывод данных.

Средства взаимодействия с языком C

Усовершенствование динамического размещения данных

Стандартом предполагается поддержка средствами языка параллельных вычислений (Co-Arrays Fortran). Также предполагается увеличить максимальную размерность массивов до 15, добавить встроенные специальные математические функции и др.

Fortran (также FORTRAN) это язык программирования , разработанный в начале 1950-х годов и используемый до сих пор. Название является сокращением от "FORmula TRANslator". Ранние версии языка были известны как FORTRAN, но буквы перестали быть заглавными начиная с версии Fortran 90. Официальные стандарты языка теперь именуют язык как "FORTRAN".

>Fortran в основном используется для научных расчетов и численного анализа. Хотя первоначально это был процедурный язык, но в последние версии Fortran включили некоторые функции для поддержки объектно-ориентированного программирования для начинающих.

Первый компилятор FORTRAN был разработан для IBM 704 в 1954-57 в команде IBM под руководством Джона Бэкуса (John W. Backus). Это было оптимизирующий компилятор, потому что авторы рассудили, что никто не будет использовать язык, даже при изучении программирования для чайников, если его производительность не будет сравнима с ассемблером.

Язык получил широкое распространение в среде ученых и использовался для написания программ с интенсивными численными операциями, которые вынуждали создателей компиляторов Фортрана усердно переписывать код компиляторов, чтобы те генерировали более быстрый код. Сегодня существует сножество поставщиков высокопроизводительных компиляторов для Fortran. Многие достижения в области теории и конструирования компиляторов были мотивированы необходимостью генерировать хороший код для Fortran программ как полагается для основ программирования.

Известно несколько версий языка, в том числе известные FORTRAN IV (также известный как FORTRAN 66), Fortran 77 и Fortran 90. Последний формальный стандарт для языка, опубликованный в 1997 году, известен как Fortran 95. Версии языка от IBM никогда не были так популярны, как, разработанные другими компаниями, и это особенно касается FORTRAN IV - WATFOR, версия FORTRAN IV, разработанная в Университете Ватерлоо в Канаде, была наиболее востребованной, поскольку выводила лучше остальных выводила сообщения об ошибках компиляции. Точно также, программное обеспечение для автоматической генерации блок-схем из FORTRAN программ было разработано за пределами IBM

Первоначально, язык опирался на точность форматирования исходного кода и интенсивное использования числовые состояния и оператор GOTO. Эти причуды были удалены из новых версий языка. Последующие версии также представили "современные" концепции программирования, такие как комментарии в исходном коде и вывод текста, операторы IF-THEN-ELSE (в FORTRAN 77), рекурсия (в Fortran 90), и параллельные вычисления, в то же время пытаясь сохранить в Fortran "постный" профиль и высокую производительность. Среди самых популярных основанных на Fortran языках, можно выделить SAS, предназначенного для получения статистических отчетов, и SIMSCRIPT, для моделирования процессов массового обслуживания.

Продавцы высокопроизводительных научных компьютеров (Burroughs, CDC, Cray, IBM, Texas Instruments) добавили расширения для Fortran, чтобы включить использование специальных аппаратных особенностей, таких как: кэш инструкций, процессор pipe-соединений, векторных массивов и т. д. Например, один из Fortran компиляторов IBM (H Extended IUP) содержал уровень оптимизации, которая заставляла инструкции машинного кода держать несколько внутренних блоков арифметической занятыми все время. Другим примером является CFD, особый "вариант" Фортран, разработанный специально для суперкомпьютера ILLIAC IV, работающий в исследовательском центре NASA Ames. Эти расширения, либо исчезли с течением времени или же эти элементы были включенны в основной стандарт; основным расширением является OpenMP, которое является кросс-платформенной расширением для доступа к общей памяти. Еще одно из новых расширений, CoArray Fortran, призван способствовать развитию параллельного программирования и .

Первая попытка разработки на Erlang новичка может сильно расстроить потому, что синтаксис этого языка считается тайнописью многими программистами, которые начинали изучение с современных языков. Трудно писать лексический анализатор, когда всего один ошибочный символ может привести к ошибке времени выполнения, а не ошибки компиляции, если указанные конструкции не используются. В некоторых самых ранних версиях, не было объектов (ООП), которые рассматриваются в качестве полезных атрибутов программирования в современных условиях, или, например, отсутствовало динамическое распределение памяти. В то же время, синтаксис языка Фортран был применим к научным работам и вычислениям, связанным операциями над числами, а многие из его недостатков были учтены в более поздних версиях. Например, Fortran 95 имеет очень короткие команды для выполнения математических операций с матрицами и массивами, которые не только значительно улучшает читаемость программы, но также дает полезную информацию для компилятора чтобы она могла векторизовать операции. По этим причинам, 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. Массивы можно копировать, умножать на скаляр, перемножать между собой очень интуитивным образом:

A = B A = 3.24*B C = A*B B = exp(A) norm = sqrt(sum(A**2))
Здесь, A, B, C – массивы некоторой размерности (допустим, 10x10x10). C = A*B даёт нам поэлементное перемножение матриц, если A и B одного размера. Для матричного умножения используется C = matmul(A,B). Почти все внутренние функции Fortran (Sin(), Exp(), Abs(), Floor(), и т.д.) принимают массивы в качестве аргументов, что приводит к простому и чистому коду. Похожего кода в C/C++ просто нет. В базовой реализации C/C++ простое копирование массива требует прогона for циклов по всем элементам или вызова библиотечной функции. Если скормить массив не той библиотечной функции в С, произойдёт ошибка. Необходимость использования библиотек вместо внутренних функций означает, что итоговый код не будет чистым и переносимым, или лёгким в изучении.

В Fortran доступ к элементам массива работает через простой синтаксис A, когда в C/C++ нужно писать A[x][y][z]. Элементы массивов начинаются с 1, что соответствует представлениям физиков о матрицах, а в массивах C/C++ нумерация начинается с нуля. Вот ещё несколько функций для работы с массивами в Fortran.

A = (/ i , i = 1,100 /) B = A(1:100:10) C(10:) = B
Сначала создаётся вектор A через подразумеваемый цикл do, также известный, как конструктор массивов. Затем создаётся вектор B, состоящий из каждого 10-го элемента А, при помощи шага в 10. И, наконец, массив B копируется в массив С, начиная с 10-го элемента. Fortran поддерживает объявления массивов с нулевыми или отрицательными индексами:

Double precision, dimension(-1:10) :: myArray
Отрицательный индекс сначала выглядит глупо, но я слышал об их полезности – например, представьте, что это дополнительная область для размещения каких-либо пояснений. Fortran также поддерживает векторные индексы . Например, можно передать элементы 1,5 и 7 из массива A размерностью N x 1 в массив B размерностью 3 x 1:

Subscripts = (/ 1, 5, 7 /) B = A(subscripts)
Fortran поддерживает маски массивов во всех внутренних функциях. К примеру, если нам нужно посчитать логарифм всех элементов матрицы, больших нуля, мы используем:

Log_of_A = log(A, mask= A .gt. 0)
Или мы можем в одну строку обнулить все отрицательные элементы массива:

Where(my_array .lt. 0.0) my_array = 0.0
В Fortran легко динамически размещать и освобождать массивы. К примеру, для размещения двумерного массива:

Real, dimension(:,:), allocatable:: name_of_array allocate(name_of_array(xdim, ydim))
В C/C++ для этого требуется следующая запись :

Int **array; array = malloc(nrows * sizeof(double *)); for(i = 0; i < nrows; i++){ array[i] = malloc(ncolumns * sizeof(double)); }
Для освобождения массива в Fortran

Deallocate(name_of_array)
В C/C++ для этого

For(i = 0; i < nrows; i++){ free(array[i]); } free(array);

Лёгкость вторая: не нужно беспокоиться об указателях и выделении памяти

В языках вроде C/C++ все переменные передаются по значению, за исключением массивов, передающихся по ссылке. Но во многих случаях передача массива по значению имеет больше смысла. Например, пусть данные состоят из позиций 100 молекул в разные периоды времени. Нам необходимо анализировать движение одной молекулы. Мы берём срез массива (подмассив) соответствующий координатам атомов в этой молекуле и передаём его в функцию. В ней мы будем заниматься сложным анализом переданного подмассива. Если бы мы передавали его по ссылке, переданные данные не располагались бы в памяти подряд. Из-за особенностей доступа к памяти работа с таким массивом была бы медленной. Если же мы передадим его по значению, мы создадим в памяти новый массив, расположенный подряд. К радости физиков, компилятор берёт на себя всю грязную работу по оптимизации памяти.

В Fortran переменные обычно передаются по ссылке, а не по значению. Под капотом компилятор Fortran автоматически оптимизирует их передачу для повышения эффективности. С точки зрения профессора в области оптимизации использования памяти компилятору стоит доверять больше, чем студенту! В результате физики редко используют указатели, хотя в Fortran-90+ они есть .

Ещё несколько примеров отличий Fortran и C

В Fortran есть несколько возможностей для управления компилятором при поиске ошибок и оптимизации. Ошибки в коде можно отловить на этапе компиляции, а не при выполнении. К примеру, любую переменную можно объявить как параметр, то есть константу.

Double precision, parameter:: hbar = 6.63e-34
Если параметр в коде меняется, компилятор возвращает ошибку. В С это называется const

Double const hbar = 6.63e-34
Проблема в том, что 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, ещё предстоит увидеть. В любом случае, подозреваю, что это будет происходить очень долго.

Теги:

  • fortran
  • научное программирование
Добавить метки

Года.) Название Fortran является аббревиатурой от FOR mula TRAN slator, то есть, переводчик формул. Фортран широко используется в первую очередь для научных и инженерных вычислений. Одно из преимуществ современного Фортрана - большое количество написанных на нём программ и библиотек подпрограмм (см., например, Netlib Repository). Среди учёных, например, ходит такая присказка, что любая математическая задача уже имеет решение на Фортране, и, действительно, можно найти среди тысяч фортрановских пакетов и пакет для перемножения , и пакет для решения сложных интегральных уравнений и многие, многие другие. Ряд таких пакетов создавались на протяжении десятилетий и популярны (главным образом в научной среде) по сей день.

Большинство таких библиотек является фактически достоянием человечества: они доступны в исходных кодах, хорошо документированы, отлажены и весьма эффективны. Поэтому изменять, а тем более переписывать их на других языках программирования накладно, несмотря на то, что регулярно производятся попытки автоматического конвертирования FORTRAN-кода на современные языки программирования.

Современный Фортран (Fortran 95 и Fortran 2003) приобрёл черты, необходимые для эффективного программирования для новых вычислительных архитектур; позволяет применять современные технологии программирования, в частности, .

Стандарты

Фортран - жёстко стандартизированный язык, именно поэтому он легко переносится на различные платформы. Существует несколько международных стандартов языка:

  • FORTRAN IV (он же - FORTRAN 66 ) (1966)
  • FORTRAN 77 (1978)
    Множество улучшений: текстовый тип данных и функции для его обработки, блочные операторы IF, ELSE IF, ELSE, END IF, оператор включения фрагмента программы INCLUDE и т. д.
  • Fortran 90 (1991)
    Значительно переработан стандарт языка. Введён свободный формат написания кода. Появились дополнтельные описания IMPLICIT NONE, TYPE, ALLOCATABLE, POINTER, TARGET, NAMELIST; управляющие конструкции DO … END DO, DO WHILE, CYCLE, SELECT CASE, WHERE; работа с динамической памятью (ALLOCATE, DEALLOCATE, NULLIFY); программные компоненты MODULE, PRIVATE, PUBLIC, CONTAINS, INTERFACE, USE, INTENT. Появились новые встроенные функции, в первую очередь, для работы с массивами.
    В языке появились элементы .
    Отдельно объявлен список устаревших черт языка, предназначенных для удаления в будущем.
  • Fortran 95 (1997)
    Коррекция предыдущего стандарта.
  • Fortran 2003 (2004)
    Дальнейшее развитие поддержки в языке. Взаимодействие с операционной системой.

Компиляторы

Возможности и структура программы

Фортран имеет достаточно большой набор встроенных математических функций, поддерживает работу с целыми, вещественными и комплексными числами высокой точности. Выразительные средства языка изначально были весьма бедны, поскольку Фортран был одним из первых языков высокого уровня. В дальнейшем в Фортран были добавлены многие лексические конструкции, характерные для структурного, функционального и даже объектно-ориентированного программирования.

Структура программ изначально была ориентирована на ввод с

и имела ряд удобных именно для этого случая свойств. Так, 1-я колонка служила для маркировки текста как комментария (символом C ), со 1-й по 5-ю располагалась область меток, а с 7-й по 72-ю располагался собственно текст оператора или комментария. Колонки с 73-й по 80-ю могли служить для нумерации карт (чтобы восстановить случайно рассыпавшуюся колоду) или для краткого комментария, транслятором они игнорировались. Если текст оператора не вписывался в отведённое пространство (с 7-й по 72-ю колонку), в 6-ой колонке следующей карты ставился признак продолжения, и затем оператор продолжался на ней. Расположить два или более в одной строке (карте) было нельзя. Когда перфокарты ушли в историю, эти достоинства превратились в серьёзные неудобства.

Именно поэтому в стандарт Фортрана, начиная с Fortran 90, в добавление к фиксированному формату исходного текста появился свободный формат, который не регламентирует позиции строки, а также позволяет записывать более одного оператора на строку. Введение свободного формата позволило создавать код, и ясность которого не уступает коду, созданному при помощи других современных языков программирования, таких как или .

Своего рода «визитной карточкой» старого Фортрана является огромное количество меток, которые использовались как в операторах безусловного перехода , так и в операторах циклов, и в операторах описания форматного ввода/вывода FORMAT. Большое количества меток и операторов GOTO часто делало программы на Фортране трудными для понимания.

Именно этот негативный опыт стал причиной, по которой в ряде современных языков программирования (например, ) метки и связанные с ними операторы безусловного перехода вообще отсутствуют.

Однако современный Фортран избавлен от избытка меток за счет введения таких операторов, как DO … END DO, DO WHILE, SELECT CASE

Также к положительным чертам современного Фортрана стоит отнести большое количество встроенных операций с массивами и гибкую поддержку массивов с необычной индексацией. Пример:

Real,dimension(:,:) :: V ... allocate(V(-2:2,0:10)) ! Выделить память под массив, индексы которого могут! меняться в пределах от -2 до 2 (первый индекс) ! и от 0 до 10 - второй... V(2,2:3)=V(-1:0,1) ! Повернуть кусочек массива write(*,*)V(1,:) ! Напечатать все элементы массива V, первый индекс которых равен 1. deallocate(V)

Пример программы

Программа «Hello, World!»

Фиксированный формат (символами «ˆ» выделены пробелы в позициях строки с 1 по 6):

^^^^^^PROGRAM hello ^^^^^^PRINT*, "Hello, World!" ^^^^^^END

Свободный формат:

Program hello print *, "Hello, World!" end

Замечания.