Язык программирования Fortran - описание, основные команды и функции. Почему физики всё ещё используют Fortran

Лекция 3. Структура программы. Реализация алгоритма линейной структуры на Фортране.

Структура программы на Фортране

Программа в общем случае состоит из головной (MAIN) программы и подпрограмм (SUBROUTINE и (или) FUNCTION).

    В головной программе запрограммирован весь алгоритм решения задачи.

    Программа всегда начинает и завершает выполнение в головной программе .

    В подпрограмме запрограммирована логически законченная часть алгоритма.

    Подгрограмма выполняется только при ее вызове и после исполнения управление передается назад.

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

    Подпрограммы позволяют создать заготовки наиболее часто решаемых типовых задач.

    Библиотеки стандартных программ состоят из подпрограмм, написанных профессионалами.

СТРУКТУРА ФОРТРАН - ПРОГРАММЫ

Общая структура основной (головной) Фортран - программы (MAIN PROGRAM ):

[ PROGRAM имя программы ]

[ ! КОММЕНТАРИИ ]

[ неисполняемые операторы - объявления ]

[ исполняемые операторы ]

END [ PROGRAM [имя программы ] ]

    – НЕОБЯЗАТЕЛЬНАЯ ЧАСТЬ КОНСТРУКЦИИ

    ТЕКСТ, ИЗОБРАЖЕННЫЙ ЗДЕСЬ КРАСНЫМ КУРСИВОМ ИМЕЕТ ВПОЛНЕ ОПРЕДЕЛЕННЫЙ СМЫСЛ И ЗАПИСЫВАЕТСЯ В СООТВЕТСТВИИ С ТРЕБОВАНИЯМИ ЯЗЫКА

    END ОПЕРАТОР ОБЯЗАТЕЛЬНО ЗАВЕРШАЕТ ПРОГРАММУ

Определение. Операторы – последовательность символов, которая задает определенные действия. Операторы делятся на: исполняемые и неисполняемые.

Исполняемые операторы задают действия над данными. Различают следующие типы таких операторов:

1. Операторы обработки информации.

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

    Операторы чтения (ввода)

    Операторы записи (вывода)

2. Операторы, управляющие работой программы во времени.

Неисполняемые операторы служат для описания типа данных или некоторых элементов программы, поэтому их часто называют операторами описания или просто описаниями или объявлениями.

Комментарии предназначены человеку для документирования программы и для улучшения понимания алгоритма и операторов.

Алгоритм линейной структуры

Алгоритм является линейным , если все шаги алгоритма выполняются последовательно в их естественном порядке для любых исходных данных , возможных в данной задаче. Запись шагов алгоритма в этом случае осуществляется последовательно.

Рассмотрим возможныев таких алгоритмах действия (шаги алгоритма и соответствующие им операторы Фортрана).

Операторы начала и конца программы

Первая строка программы рассматривается как начало программы. В современных версиях Фортрана принято оформлять программу оператором начала программы, за которым указывается имя программы:

PROGRAM {имя программы}

Обычно имя программы выбирают так, чтобы оно отражало назначение (содержание) программы. Например, PRIMER, SUMMA и т.д.:

PROGRAM PRIMER_1 ! имя программы PRIMER_1

PROGRAM POISK ! имя программы указывает на ее содержание

Оператор начала программы не обязателен, а вот заканчиваться программа должна обязательно оператором конца программы – END (см. раздел «Структура Фортран-программы). В Фортране-90 каждый оператор обычно занимает отдельную строку. Если в строке записывается несколько операторов, они разделяются точкой с запятой «; ».

Операторы ввода/вывода

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

Рассмотрим простой ввод данных с клавиатуры, для которого используется оператор READ, для вывода результатов на экран – оператор PRINT.

Общий вид операторов и правила работы с ними приведены ниже. Например, требуется ввести значения четырех переменных t, y, k и f:

READ* , t, y, k, f ! В списке ввода имена переменных отделяются запятыми

Такой оператор означает ввод четырех значений переменных последовательно с клавиатуры. На этапе выполнения программы, значения вводятся с клавиатуры, они должны быть разделены друг от друга либо запятыми, либо пробелами, либо нажатием ENTER. Пока не будут введены все значения из списка, выполнение программы будет блокировано. Примеры ввода значений:

0.56 -2.756 100 0.003 ! Числа отделяются пробелом или

0.56, -2.756, 100, 0.003 ! Числа отделяются запятой или

0.56 ! Числа отделяются клавишей ENTER

В результате выполнения оператора ввода, переменная t получит значение 0.56, y получит значение -2.756, k будет равно 100, а f – 0.003. В списке ввода можно использовать только имена переменных, констант, и вводятся они в той же последовательности с клавиатуры, как было задано в операторе.

Для вывода результатов в алгоритме предусматривается специальный шаг – вывод:

ВЫВОД список вывода

Здесь список вывода представляет в простейшем случае список имен переменных, значения которых должны быть выведены. Например,

Список вывода также может содержать поясняющие результат текстовые строки, например, вывод ′q=′, q, ′ масса m=′, m

В фортран – программе этот шаг алгоритма в простейшем случае заменяется оператором

PRINT* , список вывода

В списке вывода можно использовать, кроме переменных и констант, поясняющий текст, который заключается в апострофы или кавычки. Например, задан оператор вывода на экран

PRINT *,’x=’,x,’ y=’,y

Пусть в результате выполнения некоторых вычислений программы, x стало равным 3.09, а y = 5.01. Тогда на экране компьютера появится следующая строка:

Таким образом, текст, взятый в апострофы в операторе вывода, будет напечатан без изменения, а на месте имен переменных будут отображены их значения.

Наличие звездочки и запятой после слова READ/PRINT обязательны! Звездочка * означает, что значения переменных вводятся/выводятся на экран «по умолчанию», в том стандартном виде, который закодирован в Фортране.

Список вывода оператора PRINT может содержать:

    имена переменных,

    строковые константы (записываются в одиночных или двойных кавычках) для пояснения результатов и вывода текста,

    арифметические выражения. В этом случае сначала вычисляется значение арифметического выражения, а затем вычисленное значение выводится на экран.

Примеры:

PRINT*, ″WWOD M,N ″ ! вывод на экран текстовой подсказки для ввода

PRINT*, z, y ! Вывод только значений переменных z и y

PRINT*, ″ Z= ″, z, ″ Y= ″, y ! Вывод значений переменных z и y с пояснением

Вывод значения корня квадратного из числа 2 с пояснением:

PRINT*, " SQRT(2.0) =" , SQRT(2.0)

    Каждый оператор вывода формирует одну запись.

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

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

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

Для записи операции присваивания будем в дальнейшем использовать символ = (не следует путать его с обычным знаком равенства).

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

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

Арифметический оператор присваивания

Это выполняемый оператор, с помощью которого проводятся вычисления по формулам, задаются начальные значения, осуществляется «пересылка» значений из одной ячейки памяти в другую (переприсваивание значений).

Общий вид этого оператора: x = АВ,

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

Для компьютера этот оператор - указание о выполнении следующих действий:

1) вычислить значение арифметического выражения (АВ) в правой части оператора при текущих значениях входящих в него переменных;

2) привести значение полученного результата к типу переменной, находящейся в правой части оператора;

3) присвоить переменой, находящейся в правой части оператора, вычисленное и приведенное к типу переменной значение результата.

Примеры

REAL:: A=3.4, F=5.25, B=9.7

A=F ! значение переменной F присваивается переменной A

J=B ! значение переменной B присваивается переменной J

PRINT*, “A=”,A,” F=”,F,” J=”,J ! вывод результатов на экран

A=5.25 F=5.25 J=9

INTEGER:: J=2, I

REAL:: A=3.3, F=5.25, B

Переменной B присваивается результат вычисления! выражения J*A+F , преобразованного к вещественному типу

PRINT*, “B=”, B ! вывод результата на экран

Переменной I присваивается результат вычисления! выражения J*A+F , преобразованного к целому типу

PRINT*, “ I=”, I ! вывод результата на экран

В результате выполнения программы, на экране увидим следующий результат:

Рассмотрим примеры программ, составленных на основе линейного алгоритма.

Для значений x=0.2, , , d = x + b .

Блок-схема алгоритма:

Программа примера 3 :

T=(B*Z-SIN(Z)) / (Y+C*D*(Y*Z)**(1./7.))

PRINT*,” T=”,T

Обратите внимание, что в этой программе дополнительно введены переменные Z и Y, чтобы несколько раз не вычислять повторяющиеся в формуле для t выражения. Плюс операция возведения в степень здесь заменена операцией умножения, на которую компьютер тратит меньше времени, чем на возведение в степень. В принципе, вы можете использовать операцию возведения в степень, и на небольших программах это не является существенным. Однако, если программа сложная и содержит несколько тысяч операторов со сложными вычислениями, то рекомендуется, где это возможно, заменить операцию возведения в степень операцией умножения, что уменьшит затраты компьютера и увеличит скорость выполнения программы.

Пример 4. Составить программу вычисления площади вписанной в треугольник окружности , радиус , где –периметр треугольника.

Исходными данными задачи являются стороны треугольника a, b, c. Составьте блок-схему алгоритма самостоятельно.

Программа примера 4 :

program primer_4

parameter (pi=3.14159) !оператор задания констант

print*, “ Vvedite a, b, c” ! вывод поясняющего текста на экран

read*, a,b,c ! ввод длин сторон треугольника

p=a+b+c ! вычисление периметра треугольника

r=sqrt((p – a)*(p – b)*(p – c))/p) ! вычисление радиуса, вписанной окружности

s=pi*r**2 ! определение площади окружности

print*,” s=”,s ! вывод результата

В указанном примере число π имеет имя pi , поскольку в Фортране можно использовать только латинские буквы.

Вопросы к Лекции 3:

    Какова структура программы на Фортране?

    Для чего используются подпрограммы?

    Что содержит основная Фортран-программа (MAIN)?

    Изобразите схематично общую структуру программы на Фортране.

    Что такое подпрограмма?

    Что хранится в библиотеках стандартных программ?

    Дайте определение оператора.

    Что называется исполняемыми операторами?

    Какие операторы называют неисполняемыми?

    Какие операторы относятся к операторам обработки информации?

    Для чего нужны комментарии в программе?

    Что называют алгоритмом линейной структуры?

    Какая последовательность действий характерна для программы, реализующей линейный алгоритм?

    Как записывается оператор начала программы? Обязателен ли он?

    Запишите оператор конца программы в общем виде. Обязателен ли этот оператор при написании программы?

    Для чего используется оператор ввода? Как правильно он записывается?

    Как выглядит общий вид оператора вывода на экран?

    Для чего в записи операторов ввода/вывода используется символ звездочка *?

    Как можно разделять переменные при вводе их значений с клавиатуры?

    Какой порядок ввода переменных должен соблюдаться?

    Какие данные можно выводить с помощью оператора ввода?

    Для каких целей предназначен оператор вывода?

    Как можно вывести текст на экран компьютера?

    Запишите оператор вывода двух переменных a=4.5, k=3.

    Как оформить оператор вывода двух переменных a=4.5, k=3 с пояснительным текстом?

    Что называется оператором присваивания?

    Что представляет собой арифметический оператор присваивания?

    Запишите общий вид оператора присваивания.

    Какие действия должен выполнить компьютер в результате выполнения оператора присваивания?

    К какому типу приводится результирующее значение переменной, полученное в результате вычисления арифметического выражения?

    Почему в программе часто заменяют, где возможно, операцию возведения в степень операцией умножения?

  • Перевод
Не знаю, как будет выглядеть язык программирования в 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
  • научное программирование
Добавить метки

История создания языка программирования Фортран. Существующие стандарты. Версия языка программирования Фортран.

Программы для первых ЭВМ программисты писали на языках машинных команд. Это очень трудоемкий и длительный процесс. Проходило значительное время между началом составления программы и началом ее использования. Решить эту проблему можно было лишь путем создания средств автоматизации программирования.
Первыми "инструментами", которые экономили труд программистов, стали подпрограммы. В августе 1944 года для релейной машины "Марк-I" под руководством Грейс Хоппер (женщина-программист, морской офицер ВМФ США) была написана первая подпрограмма для вычисления sinx.
Не одну Грейс Хоппер волновала проблема облегчения труда программистов. В 1949 году Джон Моучли (один из создателей ЭВМ ENIAC) разработал систему SHORT Code, которую можно считать предшественницей языков программирования высокого уровня. Программист записывал решаемую задачу в виде математических формул, преобразовывал формулы в двухбуквенные коды. В дальнейшем специальная программа переводила эти коды в двоичный машинный код. Таким образом, Дж. Моучли разработал один из первых примитивных интерпретаторов. А в 1951 году Г. Хоппер создала первый компилятор А-0. Ею же впервые был введен этот термин.

Первые языки высокого уровня: Кобол и Фортран
В 50-е годы прошлого века группа под руководством Г. Хоппер приступила к разработке нового языка и компилятора В-0. Новый язык позволил бы программировать на языке, близком к обычному английскому. Разработчики языка выбрали около 30 английских слов, для распознавания которых Г. Хоппер придумала способ, сохранившийся в операторах будущих языков программирования: каждое слово содержит неповторимую комбинацию из первой и третьей букв. Благодаря этому компилятор при создании машинного кода программы может игнорировать все остальные буквы в слове.
Необходимость появления такой системы, язык которой приближен к разговорному, Г. Хоппер связывала с тем, что область применения ЭВМ будут расширяться, в связи с чем будет расти и круг пользователей. По словам Г. Хоппер, следует оставить попытки "превратить их всех в математиков ".
В 1958 году система В-0 получила название FLOW-MATIC и была ориентирована на обработку коммерческих данных. В 1959 году был разработан язык COBOL (Common Business Oriented Language) (Кобол) машинно независимый язык программирования высокого уровня для соответствующим транслятором с этого языка. Консультантом при создании языка COBOL вновь выступила Г. Хоппер.
В 1954 году публикуется сообщение о создании языка FORTRAN (FORmula TRANslation) (Фортран). Местом рождения языка стала штаб-квартира фирмы IBM в Нью-Йорке. Одним из главных разработчиков является

Джон Бэкус. Он же стал автором НФБ (нормальная форма Бэкуса), которая используется для описания синтаксиса многих языков программирования. В тот же период в европейских странах и в СССР популярным становится язык ALGOL. Как и FORTRAN, он ориентировался на математические задачи. В нем была реализована передовая для того времени технология программирования структурное программирование.

Фортран в СССР.

Фортран в СССР появился позже, чем на Западе, поскольку поначалу у нас более перспективным языком считался Алгол. Во внедрении Фортрана большую роль сыграло общение советских физиков со своими коллегами из CERN, где в 1960-х годах почти все расчёты велись с использованием программ на Фортране.

Первый советский компилятор с Фортрана был создан в 1967 г. для машины «Минск-2», однако он не получил большой известности. Широкое внедрение Фортрана началось после создания в 1968 г. компилятора ФОРТРАН-ДУБНА для машины БЭСМ-6. Машины ЕС ЭВМ, появившиеся в 1972 г., уже изначально имели транслятор Фортрана («позаимствованный» с IBM/360 вместе с другим программным обеспечением).

Стандарты

Язык подвергался стандартизации в рамках ANSI и ISO

Были разработаны стандарты - Фортран 66, Фортран 77, Фортран 90, Фортран 95, Фортран 2003 и Фортран 2008.

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

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

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)дальнейшее развитие поддержки ООП в языке. Взаимодействие с операционной системой Введён оператор и конструкция FORALL, позволяющие более гибко, чем оператор и конструкция WHERE, присваивать массивы и заменять громоздкие циклы. FORALL позволяет заменить любое присваивание сечений или оператор и конструкцию WHERE, в частности, обеспечивает доступ к диагонали матрицы. Данный оператор считается перспективным в параллельных вычислениях, способствуя более эффективному, чем циклы, осуществлению распараллеливания.

Fortran 2003 (2004) Дальнейшее развитие поддержки ООП в языке. Взаимодействие с операционной системой. Добавлены также следующие возможности: 1. Асинхронный ввод-вывод данных 2. Средства взаимодействия с языком. 3. Усовершенствование динамического размещения данных. Fortran 2008 (2010) Стандартом предполагается поддержка средствами языка параллельных вычислений (Co-Arrays Fortran). Также предполагается увеличить максимальную размерность массивов до 15, добавить встроенные специальные математические функции и др.

Версия языка программирования Фортран

Программисты, разрабатывавшие программы исключительно на ассемблере, выражали серьезное сомнение в возможности появления высокопроизводительного языка высокого уровня, поэтому основным критерием при разработке компиляторов Фортрана являлась эффективность исполняемого кода. Для этого языка было создано огромное количество библиотек, начиная от статистических комплексов и кончая пакетами управления спутниками, поэтому Фортран продолжает активно использоваться. Имеется стандартная версия Фортрана WF(High Performance Fortran) для параллельных суперкомпьютеров с множеством процессоров.

Cobol (Кобол). Это компилируемый язык для применения в экономической области и решения бизнес задач, разработанный в начале 60-х годов. Он отличается большой «многословностью» - его операторы иногда выглядят как обычные английские фразы. В Коболе были реализованы очень мощные средства работы с большими объемами данных, хранящимися на различных внешних носителях. На этом языке создано очень много приложений, которые активно эксплуатируются и сегодня.

Algol (Алгол). Компилируемый язык, созданный в 1960 году. Он был призван заменить Фортран, но из-за более сложной структуры не получил широкого распространения. В 1968 году была создана версия Алгол 68, по своим возможностям и сегодня опережающая многие языки программирования, однако из-за отсутствия достаточно эффективных компьютеров для нее не удалось своевременно создать хорошие компиляторы.

Pascal (Паскаль). Язык Паскаль, созданный в конце 70-х годов основоположником множества идей современного программирования Никлаусом Виртом, во многом напоминает Алгол, но в нем ужесточен ряд требований к структуре программы и имеются возможности, позволяющие успешно применять его при создании крупных проектов.

Basic (Бейсик). Для этого языка имеются и компиляторы, и интерпретаторы, а по популярности он занимает первое место в мире. Он создавался в 60-х годах в качестве учебного языка и очень прост в изучении. Это один из перспективных языков программирования.

С (Си). Данный язык был создан в лаборатории Bell и первоначально не рассматривался как массовый. Он планировался для замены ассемблера, чтобы иметь возможность создавать столь же эффективные и компактные программы, и в то же время не зависеть от конкретного типа процессора. На этом языке в 70-е годы написано множество прикладных и системных программ и ряд известных операционных систем (Unix).

Java (Джава, Ява). Этот язык был создан компанией Sun в начале 90-х годов на основе Си++. Он призван упростить разработку приложений на основе Си++ путем исключения из него всех низкоуровневых возможностей. Но главная особенность этого языка - компиляция не в машинный код, а в платформно независимый байт-код (каждая команда занимает один байт). Этот байт-код может выполняться с помощью интерпретатора - виртуальной Java-машины (Java Virtual Machine), версии которой созданы сегодня для любых платформ. Благодаря наличию мно­жества Java-машин программы на Java можно переносить не только на уровне исходных текстов, но и на уровне двоичного байт-кода, поэтому по популярности язык Ява сегодня занимает второе место в мире после Бейсика.

В последнее время получили распространение системы программирования, ориентированные на создание Windows-приложений :

· пакет Borland Delphi (Дельфи) - блестящий наследник семейства компиляторов Borland Pascal, предоставляющий качественные и очень удобные средства визуальной разработки. Его исключительно быстрый компилятор позволяет эффективно и быстро решать практически любые задачи прикладного программирования.

· пакет Microsoft Visual Basic - удобный и популярный инструмент для создания Windows-программ с использованием визуальных средств. Содержит инструментарий для создания диаграмм и презентаций .

· пакет Borland C++ - одно из самых распространённых средств для разработки DOS и Windows приложений.

Министерство образования и науки Российской Федерации

Уральский федеральный университет

имени первого Президента России

ОСНОВЫ ПРОГРАММИРОВАНИЯ

НА ЯЗЫКЕ ФОРТРАН

Учебное пособие

Екатеринбург

Введение. 3

Историческая справка. 5

Структура программы.. 8

Отличия Фортрана 90 от Фортрана 77. 11

Доступ к вычислительным ресурсам. 15

Запуск задач на кластере. 17

Переписать тексты программ на сервер. 17

Компиляция программ. 17

Запуск программы на счет. 19

Типы данных. 22

Целая константа. 22

Вещественная константа. 23

Вещественная константа двойной точности. 23

Комплексная константа. 23

Комплексная константа двойной точности. 24

Логическая константа. 24

Текстовая константа. 24

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

INTEGER целого типа. 26

REAL и DOUBLE PRECISION вещественного типа. 27

COMPLEX и DOUBLE COMPLEX комплексного типа. 28

CHARACTER символьного типа. 29

LOGICAL логического типа. 29

DIMENSION массивов. 30

Атрибут PARAMETER.. 32

Разновидности встроенных типов данных. 35

Выражения, операции и присваивания. 36

Арифметические выражения. 36

Выражения отношения. 37

Логические выражения. 38

Правила вычисления выражений. 38

Операторы ввода/вывода. 39

Оператор ввода DATA.. 39

Оператор ввода READ.. 40

Оператор вывода WRITE. 41

Оператор вывода на экран PRINT. 42

Оператор задания формата ввода-вывода (FORMAT) 43

Спецификации X, T. 43

Спецификатор I 44

Разделители. 45

Спецификация F. 46

Повторители. 49

Спецификация E. 50

Спецификация G.. 51

Дескрипторы данных. 52

Операторы условия. 53

Логический оператор условия. 53

Арифметический оператор условия. 57

Конструкция SELECT CASE. 60

Операторы цикла. 62

Оператор цикла DO.. 62

Оператор цикла DO WHILE. 64

Оператор остановки STOP. 65

Оператор выхода из цикла EXIT. 66

Операторы перехода. 67

Оператор бузословного перехода GOTO.. 67

Вычисляемый оператор перехода GOTO.. 67

Оператор условного перехода IF … GOTO.. 68

Работа с массивами. 69

Ввод массивов. 69

Вывод массивов. 71

Обработка массивов. 73

Подпрограммы.. 76

Оператор-функция. 78

Подпрограмма-функция FUNCTION.. 81

Подпрограмма-процедура SUBROUTINE. 83

Работа с внешними файлами. 85

Оператор открытия файла OPEN.. 85

Оператор закрытия файла CLOSE. 86

Примеры работы с файлами. 86

Литература. 89

Введение

Характерная черта параллельных ЭВМ – возможность одновременного использования для обработки информации большого числа процессоров. Применение многопроцессорных вычислительных систем (МВС) ставит две задачи построения параллельных алгоритмов: распараллеливание существующих последовательных алгоритмов и создание новых алгоритмов с ориентацией на параллельные вычислительные системы.

Наиболее распространенной технологией программирования для параллельных компьютеров с распределенной памятью в настоящее время является MPI. Основным способом взаимодействия параллельных процессов в таких системах является передача сообщений друг другу. Это и отражено в названии данной технологии – Message Passing Interface (интерфейс передачи сообщений). Стандарт MPI фиксирует интерфейс, который должен соблюдаться как системой программирования на каждой вычислительной платформе, так и пользователем при создании своих программ. Коммуникационная библиотека MPI стала общепризнанным стандартом в параллельном программировании с использованием механизма передачи сообщений.

MPI-программа представляет собой набор независимых процессов, каждый из которых выполняет свою собственную программу (не обязательно одну и ту же), написанную на языке C или FORTRAN.В языке FORTRAN большинство MPI-процедур являются подпрограммами (вызываются с помощью оператора CALL), а код ошибки возвращают через дополнительный последний параметр процедуры. Несколько процедур, оформленных в виде функций, код ошибки не возвращают. Не требуется строгого соблюдения регистра символов в именах подпрограмм и именованных констант. Массивы индексируются с 1. Объекты MPI, которые в языке C являются структурами, в языке FORTRAN представляются массивами целого типа.

В ИММ программируют на Фортране. Главной сложностью в его использовании для больших задач является согласование взаимодействия частей большой задачи. Фортран 90 включает механизмы взаимодействия объектов в соответствии с технологией объектно-ориентированного программирования, которые облегчают коллективную работу над большим проектом. Это модули для оформления библиотек, структуры и производные типы данных для организации сложных данных, это динамическое распределение памяти, а также ряд механизмов обработки массивов, в том числе образование различных вырезок (сечений). Возможность объединения в одном семействе (в роду) типовых процедур обработки, отличающихся типами их аргументов, может быть полезным средством в целом ряде задач. Виды (семейства) типов данных позволяют легко настраивать реализацию типа с учетом свойств аппаратуры (например, тип INTEGER можно объявить длинным или коротким через управление видом KIND). Некоторые правила стилевого оформления могут помогать разработке, например, объявление входных, выходных и изменяемых параметров процедуры помогает отысканию ошибок взаимодействия программных единиц. Правила записи свойств данных, комментариев и других элементов облегчают чтение написанных программ, что ускоряет поиск ошибок.

Историческая справка

1954 г. – IBM , первый транслятор языка Фортран .

1958 г. – Фортран II .

1962 г. – Фортран IV .

1966 г. – Фортран 66.

1978 г. – Фортран 77 .

Модификация языка Фортран, появившиеся в 1958 году, получила название Фортран II и содержала понятие подпрограммы и общих переменных для обеспечения связи между сегментами.

К 1962 году относится появление языка, известного под именем Фортран IV . В 1966 завершена разработка американского стандарта на язык ANSI (American National Standards Institute), язык называют Fortran 66 . В 1978 году разработана вторая версия стандарта ANSI – язык Fortran 77 , включающий элементы структурного программирования, например, структурный IF, символьные типы.

Третий вариант стандарта ANSI – Fortran 90 , реализован в 1991. Fortran 90 является развитием языка Fortran 77 , так что программа, написанная на Fortran 77 , может быть скомпилирована и запущена как программа на Fortran 90 . Стандарт Fortran 90 Standard вводит много новых средств для операций над массивами, новые методы спецификации точности, свободный формат исходного кода, рекурсию, динамические массивы и т. д.

Программы на текущем языке стандарта Fortran 77 могут успешно компилироваться компиляторами Fortran 90 без каких-либо изменений. Тем не менее, структура программы на языке Fortran 90 может значительно отличаться от структуры эквивалентной программы на Fortran 77 . Программист должен остерегаться смешения двух стилей.

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

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