Fortran операторы. Имеет относительно безоблачное будущее. Взаимодействие с другими языками

Fortran операторы. Имеет относительно безоблачное будущее. Взаимодействие с другими языками

02.05.2019

Впервые я услышал о Фортране в раннем детстве от отца. Он рассказывал, что в 70-х годах ему приходилось часами выстаивать очереди к едва ли не единственной ЭВМ в ВУЗе, дабы используя перфокарту запустить примитивный код. Признаюсь честно, с тех пор и до недавнего времени (несмотря на полученное техническое образование) я пребывал в полной уверенности, что Фортран остался где-то далеко там, в мире, где носителями информации выступают странные картонки с дырками, а компьютеры стоят так дорого, что воспринимаются, как настоящий аттракцион.

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

Пережил минимум 10 обновлений

В действительности, тот Фортран о котором вы слышите от преподавателей в школе или университете был создан в период с 1954 по 1957 года. Он вошёл в историю, как первый полностью реализованный язык высокого уровня, совершил маленький прорыв в IT-мире, но по сути был не слишком удобен и функционален. “Допиливать” его в IBM принялись практически сразу, уже в 1958 году появился FORTRAN II и параллельно FORTRAN III. Но более-менее приличный вид он приобрёл лишь в 70-х, когда появились достаточно портативные машины, когда был разработан полноценный стандарт IBM FORTRAN IV, и появился FORTRAN 66 с циклами, метками, условными операторами, командами ввода/вывода и прочими по современным меркам примитивными возможностями.

Последняя версия появилась в 2010 году, её название Fortran 2008 (как видите, в ходе истории, название перестало писаться исключительно заглавными буквами), отличительной чертой которой являются всевозможные параллельные вычисления, положительно сказывающиеся, как на скорости обработки данных, так и на размерности обрабатываемых массивов. Кроме того, на 2018 год запланирован выход Fortran 2015. Из анонса следует, что в нём будет улучшена интеграция с С, а также устранены текущие недоработки.

Входит в 30 самых популярных языков программирования

На сегодняшний день 0,743% запросов в поисковых системах относительно языков программирования посвящену именно Фортрану. Чтобы вы поняли, насколько это круто, просто представьте, что такие языки, как Lisp, Scala, Clojure, LabVIEW, Haskell, Rust и VHDL, находятся в рейтинге ниже.

Может работать на Android (и не только)

Компиляторы для Фортана за его долгую историю разрабатывались такими компаниями, как IBM, Microsoft, Compaq, HP, Oracle, благодаря чему сегодня язык совместим с Windows, Mac OS и Linux. Более того, удобное приложение с компилятором теперь можно взять с собой, благодаря приложению CCTools для Android. Можно запустить компилятор и на вашем iPhone, но в этом случае немного поколдовать.

Конкурирует с MATLAB

Пока в этом тексте не было сказано главного, а именно области применения Фортрана. Так вот это язык, востребованный в науке и инженерии, полностью или частично применяемый для прогноза погоды, океанографии, молекулярной динамики, сейсмологического анализа. В общем, это самый настоящий “Data Science”-язык родом из времени, когда в массовую продажу впервые поступил калькулятор.

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

По сути, главным конкурентом Фортрана на сегодняшний день является MATLAB, который более универсален, более функционален и удобен. Однако MATLAB при этом имеет строгие ограничения по используемому ПО, достаточно дорого стоит и в большинстве случаев просто излишен.

Имеет относительно безоблачное будущее

Безусловно, мы не можем предсказать, что будет через 10-20 лет, и как за это время изменится IT-мир. Однако, если посмотреть на возможных новых конкурентов для Фортрана (таких, как Go), их главный недостаток - универсализация. То есть создатели 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
  • научное программирование
Добавить метки

Попробовать написать здесь свой первый пост меня подтолкнула , где vt4a2h предлагает использовать для обучения C++. Да, на данную тему было сломано множество копий.

Я, как и наверное большинство школьников на просторах нашей необъятной Родины, начинал постигать азы через синий экран, но не смерти, а Turbo Pascal 7.0. Был конечно и Basic, с котором я впервые столкнулся в дошкольном возрасте на советском компьютере «Электроника». Тогда он казался странным текстовым редактором, ведь компьютер глазами ребенка создан для игр. Однако уже в институте я познакомился с языком Fortran, познав который, я до сих пор недоумеваю, почему он не используется для обучения.

Да, многие скажут, что язык мертвый, не соответствует современным реалиям, а учебники с названием, как на картинке, вызывают лишь улыбку. Я попробую объяснить, чем же так замечателен этот язык и почему я его рекомендую в качестве первого языка. Если заинтересовало, добро пожаловать под кат.

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

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

Чем же так замечателен Фортран?

Обратимся к истории создания этого языка. Появился он в далекие 50-е годы прошлого века, когда компьютеры еще были большие, программистов было мало, а информатика не преподавалась в школе, да и вообще считалась лженаукой. Нужен был простой язык, который помогал бы инженерам и ученым «скармливать» ЭВМ формулы, написанные на бумаге, пусть даже через перфокарты.

Отсюда и название самого языка: For mula Tran slator или же «переводчик формул». Т.е. изначально язык был ориентирован на людей без специальной подготовки, а значит должен был быть максимально простым.

Что ж, простота создателям удалась. Классическая первая программа выглядит следующим образом:

Program hw write(*,*) "Hello, World!" end
Синтаксис даже чуть проще Паскаля, нет необходимости ставить в конце строки "; " или ": " перед знаком равенства. Более того, людям, обладающих минимальным знанием английского языка, понять смысл простейшей программы не составит труда.

Тут я хочу отметить, что Фортран имеет несколько ревизий стандартов, основными из которых являются 77 и 90 (при этом сохраняется преемственность). 77 Фортран действительно архаичен, есть ограничение на длину строки, и необходимо делать отступ в начале строки, что может вызвать у молодого кандидата в программисты культурный шок. Недаром программы, написанные на 77 Фортране, получили из уст моего знакомого емкое название «Брежневский код». Поэтому весь мой текст относится к стандарту языка 90 и новее.

Для примера, приведу код для вычисления суммы неотрицательных целых чисел от 1 до n, вводимого с клавиатуры, написанный моей дипломницей при обучении её программированию с нуля. Именно на ней я испытал преподавание Фортрана в качестве первого языка. Надеюсь, что для неё это пошло на пользу, а мой экперимент удался. По крайней мере основы она усвоила за пару занятий, первое из которых ушло на лекцию про язык.

Program chisla implicit none ! Variables integer n,i,s ! Body of chisla s=0 write (*,*) "Введите n" read (*,*) n if (n.le.0) then write (*,*) "Отрицательное или ноль" else do i=1,n s=s+i end do write (*,*) "Сумма=", s end if end
Нетрудно заметить, что как мы думаем, так и записываем код. Никаких сложностей у обучаемого не может возникнуть в принципе. Внимательный читатель конечно же спросит, что за implicit none и две звездочки в скобках через запятую. implicit none говорит нам, что мы явно указываем тип переменных, тогда как без данной записи компилятор будет сам угадывать тип. Первая звездочка означает, что ввод и вывод происходят на экран, а вторая говорит о том, что формат ввода-вывода определяется автоматически. Собственно, программы на Фортране выглядит не сложнее, чем написанный выше кусок кода.

А что насчет программной среды?

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

Для написания программ на Фортране подойдет любой текстовый редактор. Если хочется подсветки синтаксиса, то можно использовать Notepad++ (поддерживает синтаксис только 77 стандарта) или SublimeText. Программу написали, чем будем компилировать? Тут все просто, можно использовать свободный GNU Fotran. Если использование планируется некоммерческое, то разрешается замахнуться и на компилятор от Intel, который хорошо оптимизирован под одноименные процессоры и поставляется с минимально необходимым IDE. Т.е. порог вхождения весьма льготный.

Лучшей средой разработки под Фортран по мнению многих пользователей остается Compaq Visual Fortran 6.6, последняя версия которого увидела свет в начале 2000-х. Почему же так сложилось, что среда, основанная на Visual Studio 6.0, которая без танцев с бубном заводится максимум на Windows XP 32 bit, и имеет ограничение на используемую память, снискала такую популярность среди фортранщиков. Ответ приведен на рисунке ниже.

Это Compaq Array Visualizer, который представляет собой очень удобный инструмент по визуализации 1, 2 и 3-х мерных массивов в процессе отладки программы непосредственно из дебаггера. Как говорится, попробовав раз, ем и сейчас. Дело в том, что Фортран сейчас используется в основном в науке (о чем будет сказано позже), в частности в той области, с которой я имею дело, а именно в физике атмосферы. При отладке программ массивы представляют собой различные метеорологические поля, такие как температура, давление, скорость ветра. Искать ошибку в графических полях гораздо проще, чем в наборе цифр, тем более, обычно известно, как примерно должно выглядеть поле, поэтому очевидные ошибки отсекаются моментально.

К сожалению, все наработки по компилятору перешли от Compaq к Intel. Intel первоначально поддерживала Array Visualizer, правда, уже те версии были бледным отражением продукта от Compaq, работать с ними было не так удобно, как прежде, но хотя бы минимальная работоспособность поддерживалась. Увы, Intel перестала разрабатывать новые версии Array Visualizer"а, поставив крест на этом удобнейшем инструменте. Именно поэтому фортрановское сообщество в основной своей массе пишет программы и занимается их отладкой под Compaq Visual Fortran на Windows, а боевые расчеты запускает на серверах под Linux, используя Intel-овские компиляторы. Интел, пожалуйста, услышь мольбы пользователей, верни нормальный инструмент для визуализации массивов в свой дебаггер!

Место Фортрана в современном мире

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

Код в буквальном смысле передается из поколения в поколение, да еще и хорошо документируется. Можно найти множество готовых решений уравнений математической физики, линейной алгебры (здесь следует отметить удачную реализацию работы с матрицами), интегральных и дифференциальных уравнений и многого-многого другого. Наверное тяжело найти задачу из области физмат наук, для которой не был бы реализован алгоритм на языке Фортран. А если учесть отличную оптимизацию интеловских компиляторов под интеловские же процессоры, поддержку параллельных вычислений на высокопроизводительных кластерах, то становится понятно почему в научной среде этот язык занимает заслуженное первое место. Думаю, на любом суперкомпьютере можно найти установленный фортрановский компилятор.

Большинство серьезных моделей, по крайней мере из области физики атмосферы, написаны именно на Фортране. Да-да, прогноз погоды, которым каждый интересуется время от времени, получается в ходе расчетов моделей, написанных на этом языке. Более того, язык не находится в стагнации, а постоянно совершенствуется. Так, после описанных раннее стандартов 77 и 90, появились новые редакции 95, 2003, 2008, поддержка которых внедрена в актуальные компиляторы. Последние версии Фортрана несколько освежили старый проверенный временем язык, превнеся поддержку современного стиля, добавив объектно-ориентированное программирование, отсутствие которого было чуть ли не самым главным козырем противников этого языка. Более того, The Portland Group выпустила PGI CUDA Fortran Compiler, позволяющий проводить высокопараллельные расчеты на видеокартах. Таким образом, пациент более чем жив, а значит программисты на Фортран остаются востребованными до сих пор.

Вместо послесловия

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

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 не часто используется за пределами научных и инженерных вычислений, он остается языком для высокой производительности численных вычислений.



© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows