Фортран
Фортран | |
---|---|
![]() | |
Семантика | императивный,параллельный |
Класс языка | процедурный,модульный, c элементамиобъектно-ориентированного программирования |
Тип исполнения | компилируемый |
Появился в | 1957 |
Автор | Джон Бэкус,IBM |
Разработчик | IBM[1] и Джон Бэкус[1] |
Расширение файлов | .for .f .f90 .f95 .ftn |
Выпуск | Fortran 2023 (ISO/IEC 1539-1:2023) (17 ноября 2023) |
Система типов | строгая,статическая |
Основные реализации | GFortran,Open Watcom,Sun Studio,XL Fortran,Intel Fortran |
Диалекты | High Performance Fortran |
Испытал влияние | Speedcoding[вд] |
Повлиял на | ALGOL 68,Бейсик,PL/I |
Лицензия | лицензия MIT |
Сайт | fortran-lang.org (англ.) |
![]() |
Фортра́н (англ. Fortran) — первыйязык программирования высокого уровня, получивший практическое применение, имеющийтранслятор и испытавший дальнейшее развитие[2]. Создан в период с 1954 по 1957 год группой программистов под руководствомДжона Бэкуса в корпорацииIBM[3]. Название Fortran является сокращением отFORmulaTRANslator (формульный транслятор)[4]. Фортран широко используется в первую очередь для научных и инженерных вычислений. Одно из преимуществ современного Фортрана — большое количество написанных на нём программ и библиотек подпрограмм[5].
Имеется большое количество написанных на Фортране (в большей части на старых версиях языка) различных математических библиотек дляматричной алгебры и решения системлинейных уравнений, библиотеки для решениядифференциальных уравнений,интегральных уравнений и их систем,аппроксимации функций,специальных функций,быстрых преобразований Фурье, математической статистики и других математических дисциплин. Эти библиотеки поставляются, как правило, с компилятором. Ряд таких пакетов создавался на протяжении десятилетий и популярен в научной среде по сей день, например —Международная математическая библиотека подпрограмм (IMSL)[6][7].
Большинство таких библиотек является фактически достоянием человечества: они доступны в исходных кодах, хорошо документированы, отлажены и весьма эффективны.
Современный Фортран (Fortran 95 и Fortran 2003) приобрёл черты, необходимые для эффективного программирования, для новых вычислительных архитектур; позволяет применять современные технологии программирования, в частности,обобщённое имодульное программирование,ООП, сохраняя при этом преемственность с более ранними версиями. Одна из главных концепций развития современного Фортрана — средства поддержкипараллельности ивекторные операции[8].
Эволюция стандартов языка
[править |править код]Фортран — жёстко стандартизированный язык, поэтому он легко переносится на различные платформы. Новые стандарты языка в значительной мере сохраняют преемственность с более старыми, что позволяет использовать коды ранее написанных программ и модифицировать их[8]. При этом по мере развития языка заранее объявляются устаревшие конструкции, которые в будущем, возможно, будут удалены[9].
FORTRAN 66 (1966)
[править |править код]- СтандартANSI X3.9-1966[10] определил язык FORTRAN (основанный на FORTRAN IV фирмы IBM, который служил стандартом де-факто). Впоследствии на него стали ссылаться как на FORTRAN 66, хотя многие продолжали называть его FORTRAN IV, язык, на котором стандарт был в значительной степени основан.

FORTRAN 77 (1978)
[править |править код]- Введены операторы открытия и закрытия файла (
OPEN
,CLOSE
) и вывода на стандартное устройство —PRINT
. - Добавлены строковый тип данных и функции для его обработки.
- Введён блочныйоператор
IF
и конструкцияIF THEN
—ELSE IF THEN
—END IF
, а также оператор включения фрагмента программыINCLUDE
. - Введена возможность работы с файлами прямого доступа.
- Увеличена максимальная размерность массива с 3 до 7. Сняты ограничения на индексы массива.
- Усовершенствованы и расширены возможности работы с процедурами.
- Введено понятие внутреннего файла (каковыми являются массивы, числовые и строковые переменные). Внутренние файлы позволяют, в частности, осуществлять преобразование число-строка и строка-число стандартным операторами чтения и записи
READ
иWRITE
[12].
Fortran 90 (1991)
[править |править код]- ISO/IEC 1539:1991 (ANSI INCITS 198—1992)[13], значительно переработан стандарт языка[12] включая смену названия FORTRAN на Fortran.
- Введён свободный формат написания кода. Появились дополнительные описания
IMPLICIT NONE
,TYPE
,ALLOCATABLE
,POINTER
,TARGET
,NAMELIST
. - Введены управляющие операторы и конструкции. Добавлены
DO
…END DO
(вместо завершения цикла меткой),DO WHILE
, оператор передачи управления на начало циклаCYCLE
, конструкция выбораSELECT CASE
(для замены громоздких конструкцийIF
и операторовGOTO
), а также заключительный оператор программной единицы, модульной или внутренней процедурыEND
[8]. - Введён инструментарий указателей и функции для работы с оперативной памятью (по аналогии с языком С).
- Введены операторы работы с динамической памятью (
ALLOCATE
,DEALLOCATE
,NULLIFY
). - Добавлены программные компоненты
MODULE
,PRIVATE
,PUBLIC
,CONTAINS
,INTERFACE
,USE
,INTENT
. - Введено маскирование присваивания массивов (присваивание при выполнении наложенного на элементы массива логического условия без использования операторов условия), а также работа с сечениями массивов. Введён оператор и конструкция
WHERE
для частичной замены циклов (правая часть оператора присваивания не изменяется). Маскирование присваивания распространяется практически на все операторы, конструкции и функции, оперирующие с массивами. - Стандартные операции присваивания, сложения, вычитания, а также деления и умножения на число распространены на массивы и их секции, определяемые сечениями. В этом случае осуществляется поэлементное присваивание.
- Появились новые встроенные функции, в первую очередь для работы с массивами. Функции для вычислений в массивах:
ALL
(логическое произведение) иMASK
(логическое сложение),COUNT
(число истинных элементов),PRODUCT
(произведение элементов массива),SUM
(сложение элементов массива),DOT_PRODUCT
(скалярное произведение),MATMUL
(умножение матриц). Добавились справочные функции, а также функции переформирования и свёртки массивов. - В языке появились элементыООП[14]. Введены производные типы данных. Отдельно объявлен список устаревших черт языка, предназначенных для удаления в будущем.
- Добавлены дополнительные функции для работы со строковыми данными, в частности, функции
TRIM
(удаление завершающих пробелов) иREPEAT
(кратное копирование строки) и функции выравнивания по левой и правой границам.
Fortran 95 (1997)
[править |править код]- ISO/IEC 1539-1:1997[15], коррекция предыдущего стандарта. Введён оператор и конструкция
FORALL
, позволяющие более гибко, чем оператор и конструкцияWHERE
, присваивать массивы и заменять громоздкие циклы.FORALL
позволяет заменить любое присваивание сечений или оператор и конструкциюWHERE
, в частности, обеспечивает доступ к диагонали матрицы. Данный оператор считается перспективным в параллельных вычислениях, способствуя более эффективному, чем циклы, осуществлению распараллеливания[16][12][17].
Fortran 2003 (2004)
[править |править код]- Принят как ISO/IEC 1539-1:2004[18]. Дальнейшее развитие поддержкиООП в языке. Взаимодействие с операционной системой. Добавлены также следующие возможности[8]:
- Асинхронный ввод-вывод данных.
- Средства взаимодействия с языкомC.
- Усовершенствование динамического размещения данных[17].
Fortran 2008 (2010)
[править |править код]- ISO/IEC 1539-1:2010, общепринятое неформальное название Fortran 2008[19]. Стандартом предполагается поддержка средствами языка параллельных вычислений (Co-Arrays Fortran)[8][20]. Также предполагается увеличить максимальную размерность массивов до 15, добавить встроенные специальные математические функции[8] и др.
Fortran 2018
[править |править код]- Версия языка Fortran 2018 (ранее известная как Fortran 2015) была выпущена 28 ноября 2018 года[21].
- Fortran 2018 (ISO/IEC 1539-1:2018) включает в себя:
- Также введены поддержкаISO/IEC/IEEE 60559:2011, шестнадцатеричный ввод/вывод чисел с плавающей точкой, усовершенствования IMPLICIT NONE и другие изменения.
Fortran 2023
[править |править код]- Последняя версия языка Fortran — Fortran 2023 (ISO/IEC 1539-1:2023) была выпущена в ноябре 2023 года[24].
- Fortran 2023 — это небольшое расширение Fortran 2018, которое в основном фокусируется на исправлении ошибок и упущений в Fortran 2018. Также добавлены некоторые новые небольшие функции, включая возможности работать сперечислением.
Возможности и характерные особенности языка
[править |править код]Фортран имеет большой набор встроенных математических функций, поддерживает работу с целыми, вещественными и комплексными числами двойной и повышенной точности (при бинарных операциях используетсяreal(10)
), имеет богатый инструментарий работы с массивами и внешними файлами. Современный Фортран (2003 и выше) имеет полноценный инструментарий для работы с символьными данными.
Изначально выразительные средства языка были не очень велики, поскольку Фортран был первым реализованным языком высокого уровня. В дальнейшем в Фортран были добавлены многие лексические конструкции, характерные для структурного, модульного, обобщённого и объектно-ориентированного программирования.
Формат записи кода
[править |править код]
Структура программ изначально была ориентирована на ввод сперфокарт и имела ряд удобных именно для этого случая свойств. Так, с 1-й по 5-ю колонку располагалась область меток, 6-я служила для маркировки текста как продолжения предыдущей строки (любым символом, кроме пробела и «0»), а с 7-й по 72-ю располагался собственно текст оператора или комментария. Колонки с 73-й по 80-ю могли служить для нумерации карт (чтобы восстановить случайно рассыпавшуюся колоду) или для краткого комментария, транслятором они игнорировались. Если текст оператора не вписывался в отведённое пространство (с 7-й по 72-ю колонку), в 6-й колонке следующей строки ставился признак продолжения, и затем оператор продолжался на ней. Расположить два или более оператора в одной строке (карте) было нельзя. Когда перфокарты ушли в историю, эти достоинства превратились в серьёзные неудобства.
Именно поэтому к стандарту Фортрана, начиная с Fortran 90, с сохранением фиксированного формата исходного текста, был добавленсвободный формат, который не регламентирует позиции строки и позволяет записывать более одного оператора на строку. Введение свободного формата и современных способовструктурного программирования[8] позволило создавать код,читаемость и ясность которого не уступает коду, созданному при помощи других современных языков программирования, таких какПаскаль,C илиJava. Современные среды разработки позволяют комбинировать форматы: например, расширять длину строки до свободного формата (обычно 132 символа), позволяют записывать несколько операторов в строке, но при этом позволяют также сохранять отступ слева (делать левое поле), характерный для старого фиксированного формата, оставляя тем самым выделенную колонку для меток ошибок и форматов, а также колонку продолжения строки.
Своего рода «визитной карточкой» старого Фортрана является огромное количество меток, которые использовались в операторах безусловного переходаGOTO
, операторах циклов, в условных операторах и в операторах описания форматного ввода-выводаFORMAT
. Большое количество меток и операторовGOTO
часто делало программы на Фортране трудными для понимания.
Именно этот негативный опыт стал причиной, по которой в ряде современных языков программирования (например, в языкеJava) метки и связанные с ними операторы безусловного перехода сильно видоизменены.
Однако современный Фортран (в основном начиная с версии Fortran’90) избавлен от избытка меток за счёт введения таких операторов, какDO
…END DO
,DO WHILE
,SELECT CASE
, конструкцииIF THEN
-ELSEIF THEN
-ELSE
-END IF
и др. Более того, в современных стандартах языка оставлен лишь классический операторGOTO
, применяемый во многих языках и поныне. Вычисляемый операторGOTO
, а также конструкцияENTRY
— множественного входа в процедуры, — были исключены из стандарта, хотя, как правило, продолжают поддерживаться компиляторами.
Hello, World!
[править |править код]Фиксированный формат (символами «␣» выделены пробелы в позициях строки с 1 по 6):
␣␣␣␣␣␣PRINT*,'Hello, World!'␣␣␣␣␣␣END
Свободный формат:
print*,"Hello, World!"end
Замечания.
- Оператор начала главной программы
PROGRAM
не является обязательным. Строго говоря, единственный обязательный оператор Фортран-программы — операторEND
. - Выбор прописных или строчных букв для написания операторов программы произволен. С точки зрения современных стандартов языка Фортран, множество прописных букв и множество строчных букв совпадают.
Типы данных
[править |править код]Фортран поддерживает 5 основных элементарных встроенных типов данных:действительный (REAL
),комплексный (COMPLEX
),целый (INTEGER
) со знаком или без,логический (LOGICAL
) исимвольный (CHARACTER
). Кроме того, возможно создавать производные типы данных с помощью ключевого словаTYPE
. С самого начала создания языка существовали 4 типа данных: действительный, комплексный, целый и логический.
Существует понятиеразновидности типа данных илипараметры типа. Это позволяет параметризовать вещественные и комплексные данные (то есть указывать точность и диапазон десятичного порядка) и другие данные, повышая мобильность приложений.
Для всех числовых данных определены обычные арифметические операции и присваивания, существуют встроенные функции. Встроенная функцияLog(x)
в качестве аргументаx
может иметь толькодействительное иликомплексное число (не целое).
Как правило, для действительных чисел «одинарной» точности отводится 4 байта (REAL(4)
, или параметр разновидности типаKIND=4
), «двойной» — 8 байт. Для комплексных чисел число байт удваивается.
Целые числа могут занимать от 1 до 4 байт. Современные компиляторы позволяют программисту оперировать числами и «учетверённой» точности.
В арифметических операциях изменение типа производится по умолчанию от целого в действительное и далее комплексное число, либо применением специальной встроенной числовой функции. Так, эквивалентны следующие выражения (i — целое):Log(i*1.)
иLog(real(i))
.
Строковые (символьные) данные задаются с указанием длины в скобках либо после атрибута типа, либо после имени строки. Для задания строки в теле программы используются одинарные или двойные кавычки. Так, эквивалентны записи:A='It is hot' илиA="It is hot". Это удобно в тех случаях, когда в самой строке присутствуют кавычки:B="It isn’t hot".
Для строк существует встроенная операция конкатенации (сложения) строк://
. Существует 17 специализированных встроенных функций для символьных данных (помимо универсальных, обрабатывающих все типы данных).
Метки — это целые числа с числом цифр не более 5; символы не допускаются. Метки используются в операторахGO TO
, операторах чтения, записи и форматирования, а также при обработке ошибок и исключений. Помимо меток, в Фортране имеется возможностьименовать управляющие конструкции (циклы, логические условия, конструкцииFORALL
…END FORALL
,WHERE
…END WHERE
,SELECT CASE
…END SELECT
,TYPE
…END TYPE
и др.), причём имя конструкции может содержать любые допустимые в именах переменных символы.
Встроенные функции для символьных данных
[править |править код]Для преобразованиячисло-символ:CHAR(i)
иACHAR(i)
. Преобразуют целое в соответствующий ему символ операционной системы или символ таблицыASCII.
Для преобразованиясимвол-число:ICHAR(i)
иIACHAR(i)
. Осуществляют обратные преобразования.
Функции сравнения строк:LGE(A,B)
,LGT(A,B)
,LLE(A,B)
иLLT(A,B)
. Результат функций — «истина», если длины строк (L(A) иL(B)), выраженные в символах ASCII, удовлетворяют следующим неравенствам соответственно:L(A)L(B), L(A)L(B), L(A)L(B) иL(A)L(B).
Функции длины:LEN(A)
иLEN_TRIM(A)
. Первая возвращает длину строкиА (количество символов), вторая — возвращает длину строки без завершающих пробелов, если они имеются.
Функции преобразования:TRIM(A)
,ADJUSTL(A)
иADJUSTR(A)
,REPEAT(A,N)
. ФункцияTRIM(A)
возвращает строкуA без завершающих пробелов. ФункцииADJUSTL(A)
иADJUSTR(A)
выравнивают строку (удаляют пробелы) слева и справа соответственно. ФункцияREPEAT(A,N)
возвращаетN копий строкиА.
Функции поиска в строке:SCAN(A,B,[back])
,INDEX(A,B,[back])
,VERIFY(A,B,[back])
. Факультативный параметрback определяет направление поиска: по умолчанию слева (дляback=.false.
) направо (дляback=.true.
).
ФункцияSCAN
определяет номер позиции в строкеA (слева или справа) первого найденного символа из списка-строкиВ. Если результат отрицательный, то функция возвратит целочисленный 0. ФункцияINDEX
определяет номер позиции, с которой впервые начинаетсяполное вхождение строкиВ в строкуА. Причём поиск может вестись как слева, так и справа, но номер позиции исчисляется всегдаслева, от начала строки. При неудачном поиске функция возвратит 0. ФункцияVERIFY
обратна функцииINDEX
. Так,VERIFY
возвращает номер позиции такого символа строкиA, которогонет в строке-маскеВ. Если жевсе (различные) символы строки Априсутствуют в строке-маске В, то функция вернёт 0.
Все эти функции являются элементными и их аргументом может быть массив символов или целых чисел. Результатом будет согласованный численный, символьный или логический массив.
Стандарты Фортрана, начиная с версии 2003, предусматривают возможность работы с символамиЮникода.
Помимо указанных возможностей, Фортран позволяет обрабатывать символьные данные средствами своего встроенногоматричного (векторного) анализа, что существенно повышает гибкость обработки символьных данных.
В Фортране для совместимости с программами, написанными на языке Си, существует понятиеСи-строки, которая задаётся добавлением символас после кавычки:А='Это Си-строка’с. Нулевая строка будет задана так:А='\0’c.
Подпрограммы (процедуры и функции)
[править |править код]Подпрограммы в Фортране существовали с самого первого стандарта и поныне являются одним из главных инструментов программирования[8].
В Фортране вызов подпрограмм, функций и передача их параметров происходят исключительнопо ссылке (а непо значению). Поэтому подпрограмма может изменить переданный ей аргумент в главной программе, если специальным образом это не предотвратить. Такой механизм позволяет сделать естественной нотацию при записи математических формул и сохранить при этом высокое быстродействие при работе с большими массивами данных[25].
Подпрограммы Фортрана могут содержать в списке параметров (называемых формальными параметрами) и необязательные (опциональные) параметры, а могут вообще не содержать параметров.
Стандарт языка позволяет осуществлятьперегрузку процедур и операций посредством родового интерфейса, объединяя различные процедуры (оперирующая каждая, например, целыми, действительными, комплексными числами и символьными переменными) под одним (родовым) именем. В этом случае в главной программе достаточно обратиться к родовой процедуре, а характер выполняемых операций будет зависеть от типа данных, предложенных процедуре для обработки. По такому принципу сделаны все встроенные функции и подпрограммы, например,COS(x)
. Перегрузка процедур, функций и операторов (причём символы перегруженных операторов программист может предложить свои, помимо встроенных) распространяется не только на встроенные типы данных, но и на типы, определённые программистом[12].
Виды подпрограмм
[править |править код]Процедуры разделяются наподпрограммы ифункции. Подпрограммы удобнее, если необходимо возвратить большое число разнородных результатов; функции — при возвращении результата одного типа (в том числе массива).
Подпрограмма определяется оператором описанияSubroutine
имя_подпрограммы (список формальных аргументов), функция — операторомFunction
имя_функции (список формальных аргументов).
Вызов подпрограммы осуществляется операторомCall
имя_подпрограммы (список фактических аргументов). Вызов функции осуществляется по имени с указанием списка фактических аргументов и без использования какого-либо специального оператора.
Начиная со стандарта F’90 поддерживаютсярекурсивные процедуры (отсутствовавшие в ранних версиях из-за ограниченной машинной памяти), для объявления которых необходим явный спецификаторrecursive
. При этом результат функции должен отличаться от имени самой функции.
Чистые процедуры и функции (pure subroutine [function]
) — введённые стандартом F’95 процедуры и функции, не имеющие побочных эффектов. Чистая функция должна возвращать значение и не должна изменять ни одного из своих входных параметров и/или глобальных данных; чистая процедура должна изменять только те параметры, которые явно указаны как результирующие (выходные) посредством атрибутаintent(out
илиinout)
). Возможность побочных эффектов в Фортране (то есть, в конечном итоге, возможность изменения переменных в главной программе через подпрограмму) — побочное следствие быстрого метода передачи по адресу.
Чистые программные единицы не могут содержать операторов В/В (WRITE
иREAD
) во внешние файлы и устройства, включая клавиатуру и экран, а также операторов паузы и останова программы.
Все встроенные функции и подпрограммы Фортрана, в том числе математические (кроме обращающихся к операционной системе, функций даты и времени, а также датчиков случайных чисел) являются чистыми, то есть не создают побочных эффектов. Чистые функции введены с целью повышения культуры программирования и повышения эффективности распараллеливания алгоритмов[26][9].
Аргументы подпрограмм
[править |править код]В качестве аргументов подпрограмм могут быть любые встроенные типы данных, включая массивы и их секции, указатели, а также типы, определяемые программистом. Аргументами подпрограмм также могут быть функции и другие подпрограммы, кроме внутренних подпрограмм, операторной функции, родовых (обобщённых) процедур (допускаются только специфические имена) и некоторых др. встроенных типов.
Аргументы подразделяются наформальные ифактические. Аргументы заключаются в скобки после имени подпрограммы и разделяются запятыми. Имена фактических и формальных аргументов могут совпадать.
Формальные аргументы — это аргументы подпрограммы (функции), указанные при её описании. При отсутствии аргументов у подпрограммы, скобки могут быть опущены. У функции скобки расставляются и при отсутствии формальных аргументов. Формальный параметр-процедура называетсяформальной процедурой.
Фактические аргументы — это аргументы, передаваемые подпрограмме или функции для выполнения при её вызове. Функция без аргументов вызывается с пустым списком в скобках, подпрограмма — без скобок.
Формальные и фактические аргументы должны бытьсогласованы. Типы аргументов и разновидности их вида должны быть одинаковыми, массиву должен соответствовать массив (или сечение массива) той же конфигурации.
Существуют массивы,перенимающие конфигурацию иперенимающие размер как формальные аргументы процедур.Массив, перенимающий конфигурацию — это формальный аргумент-массив, который наследует конфигурацию соответствующего ему фактического массива. У такого массива при его объявлении задаётся размерность (совпадающая с размерностью фактического аргумента-массива) и опускаются верхние границы. По умолчанию нижние границы равны 1, но могут быть заданы произвольными. Число и значение элементов массива, перенимающего конфигурацию, точно наследуются от фактического аргумента-массива.Массив, перенимающий размер — это оставленный для совместимости более ранний, свойственный языку Fortran’77, способ описания наследующих массивов. У таких массивов наследуется только последнее измерение, верхняя граница которого описывается звёздочкой (*
). При этом формальный и фактический массивы-аргументы могут иметь разную размерность. Массивы, перенимающие конфигурацию и размер, не могут быть динамическими или быть указателями. Процедуры, имеющие наследующие массивы, должны иметь явный интерфейс.
Строки-формальные аргументы также могут наследовать (перенимать) длину у соответствующего фактического аргумента-строки.Строки, перенимающие длину, описываются посредством символа*
:Character (Len = *)
имя_строки. При явном задании длины строки, длина строки-формального аргумента не может быть больше соответствующего фактического аргумента-строки.
Аргументы бываютпозиционными иключевыми.Позиционные формальные и фактические аргументы связываются друг с другом по порядку их расположения в списке аргументов, который должен совпадать.Ключевые — по имени ключа, который совпадает с именем формального аргумента. Ключевые позволяют нарушить порядок следования аргументов или пропустить часть из них. Так, для подпрограммы с заголовкомSubroutine
ONE (A, B, C, D) вызов может быть таким:Call
ONE (D=Z, C=Y, B=X, A=W), гдеW, X, Y, Z — фактические аргументы.
Ключевые аргументы позволяют иметьнеобязательные аргументы, которые могут быть опущены. В этом случае необязательные аргументы должны иметь атрибутOptional
. Например, если заданоOptional
C, D, то в этом случае возможен вызовCall
ONE (B=X, A=W).
Процедуры с необязательными параметрами должны иметь явный интерфейс.
Работа с массивами
[править |править код]Массивы — центральный пункт философии Фортрана. Все конструкции языка, данные, программные единицы, операторы, встроенные функции, циклы созданы и создаются для эффективной обработки прежде всего массивов. Фортран по мере своего развития следует принципу максимального, насколько это возможно, ухода от детального (поэлементного) описания и обработки массивов. Особенно это эффективно при обработке многомерных массивов (предельная размерность массивов стандарта F2008 — 15).Такой взгляд на массивы не был свойственен ранним версиям языка; первые элементы обобщённого подхода к массивам появились в FORTRAN77; развиваются они и поныне.
Массивы бываютстатическими идинамическими. Динамические разделяются наразмещаемые иавтоматические (образуемые при вызове подпрограммы). Элементы двумерного массива в Фортране размещаютсяпо столбцам, а не по строкам, как, например, вСи. Таким образом, быстрее всего изменяется первый индекс массива. Поэтому для эффективной работы с массивами во вложенных циклах следует индексировать внутренние циклы левыми индексами, а внешние — правыми. По умолчанию присваивание, ввод, вывод и инициализация массивов осуществляются по столбцам.
dok=1,10doj=1,20doi=1,100arr(i,j,k)=25! правильноbrr(k,j,i)=0! работоспособно, но медленнее в несколько разend do;end do;end do
Массивы могут быть нулевого размера (в том числе, если нижняя граница превосходит верхнюю). Индексами границ массивов могут быть любые целые числа. По умолчанию нижняя граница равна 1.
Real,allocatable::ArR(:,:,:)! объявление размещаемого динамического действительного массиваInteger,allocatable::ArI(:),ArSI(2,5)! целых динамического и статического массивовCharacter(32),allocatable::ArC(:),ArC2(20)! динамического массива строк длиной 32 символа и статического массива строкAllocate(ArR(-74:0,8,1:3),ArI(0),ArC(1:-1))! размещение динамических массивовprint*,size(ArR),size(ArI),size(ArC),size(ArSI)! 1800 0 0 10ArC2(17)(5:27)='Это присваивание строки'! В строку номер 17 будет записано ␣ ␣ ␣ ␣ Это␣ присваивание␣ строки␣ ␣ ␣ ␣ ␣...
Сечения массивов, операторыFORALL
иWHERE
[править |править код]Фортран позволяет эффективно присваивать массивы без циклов посредствоммаскирования присваивания с помощью операторовWHERE
иFORALL
, а такжесечений массивов ивекторных индексов. Во всех случаях первоначально вычисляется правая часть выражения целиком (для всех индексов массива) и лишь затем выполняется присваивание для индексов, удовлетворяющих массиву-маске. Вычисления с помощью этих инструментов позволяют повышать быстродействие и облегчают компилятору работу по выделению участков программы, которые могут быть выполнены независимо, то есть распараллелены.
Real::arr(I1:I2,J1:J2,K1:K2),arr1(I1:I2,J1:J2,K1:K2),arr2(I1:I2,J1:J2,K1:K2)Real::frr(100),frr1(10)/1,2,3,3*4,4*5/! илиReal::frr1(10)=(/1,2,3,4,4,4,5,5,5,5/)...arr=1.! присваивание массива (встроенная перегрузка для оператора присваивания)arr1=Sin(arr)+arr! элементная функция sin применяется к каждому элементу массиваarr2(I1:I2:1,J1:J2:2,K2:K1:-4)=arr1(I1:I2:1,J1:J2:2,K2:K1:-4)! присваивание элементов с шагом 1, 2 и -4 (назад), заданное индексным триплетомfrr=(/(J,J=1,100)/)! присваивание одномерного массива посредством циклического спискаForall(i=I1:I2,j=J1:J2,k=K1:K2,arr(i,j,k)>0.)brr(i,j,k)=Log(arr(i,j,k))! замена циклов и условных операторов и конструкций. Маскирование присваивания (маска — arr(i,j,k)>0.)Forall(i=1:N,j=1:N,k=1:N)crr(i,j,k)=Sin(0.5*(i+j)-k)! расширение возможностей сеченийForall(i=1:100)! конструкция Forall для нескольких операторов присваиванияdrr(i,i)=0.! доступ к диагонали матрицыerr(i,i,i)=1.! и диагонали трёхмерного массиваEnd Forall
Возможны менее очевидные операции:
IntegerV(-2:2,1:5)V=reshape(source=(/(i,i=1,25)/),shape=(/5,5/))! инициализация массива порядковыми номерами с помощью конструктора массива и функции переформированияprint*,V! Вывод в DOS-окно будет произведён по строкам! 1 2 3 4 5 — 1-й столбец! 6 7 8 9 10 — 2-й! 11 12 13 14 15 — 3-й! 16 17 18 19 20 — 4-й! 21 22 23 24 25 — 5-йV(2,3:4)=V(-1:0,1)! Повернуть кусочек массиваprint*,V! Вывод в DOS-окно будет произведён по строкам! 1 2 3 4 5! 6 7 8 9 10! 11 12 13 14 2 замена в 3-м столбце 15 на 2! 16 17 18 19 3 замена в 4-м столбце 20 на 3! 21 22 23 24 25
Возможности оператора и конструкцииFORALL
, введённого стандартом F’95, шире возможностей оператора и конструкцииWHERE
, однако последний в некоторых случаях логического ветвления позволяет упростить код ввиду наличия альтернативыELSEWHERE
, избегая вложенных условных операторов и сложносоставленных массивов-масок.
Оператор и конструкцияFORALL
допускает использование толькочистых процедур и функций. При маскировании присваивания в операторахWHERE
,FORALL
, а также в специальных встроенных функциях для массивов (например,SUM
) логический массив-маска вычисляется до присваивания и позволяет заменять циклы с логическими условиями внутри них, что позволяет избежать дополнительной работы дляпредсказателя переходов микропроцессора.
Векторный индекс — целочисленный одномерный массив, значения которого — индексы некоторого другого массива. Векторные индексы используются для создания произвольных сечений многомерных массивов и являются их обобщениями. При использовании векторных индексов следует следить за повторяющимися значениями индексов в левой части оператора присваивания, так как в этом случае будет осуществлена попытка записи в одну ячейку памяти, возможно, разных значений. Порядок индексов — произвольный (хотя этим не следует злоупотреблять во избежание снижения быстродействия).
Integervi(5)/7,7,7,3,8/,vj(4)/1,2,3,10/! инициализация массивов - векторных индексовRealarr(20,20),brr(10,10)brr=0.;arr=1.! векторные индексы можно задавать и внутри использующего их массиваbrr((/8,6,2,1,4/),vj)=arr(vi,vj)! размерность векторных индексов должна совпадать слева и справа, а их значения - не выходить за пределы границ использующих их массивов! размер векторных индексов может быть меньше размера рабочих массивов
Встроенные функции для массивов
[править |править код]В современном Фортране имеется большое количество специализированных встроенных функций для работы с численными и символьными массивами (помимо разобранных выше общих способов). Аргументами функций выступают численный и/или символьный массивarray, логический массивmask (являющийся, например, условиемarray>0) и измерениеdim массиваarray, формирующее (если задан аргументdim) сечение массива вдоль одного из измерений с номеромdim. Массивarray может быть, если не указано иное, целочисленным, содержать действительные или комплексные числа. Если массив-маска не задан, то его значение считается тождественно истинным. Логический массивmask, если задан, должен иметь ту же форму, что и массивarray, либо скалярное значение.TRUE.
.
Основная масса функций введена стандартом F’90.
ALL(mask[, dim])
— логическая функция; возвращает «истина», если все элементы логического массива mask истинны (вдоль факультативного измеренияdim) и наоборот в противном случае.ANY(mask[, dim])
— логическая функция; имеет значение «истина», если хотя бы один элемент логического массива mask истинен (вдоль факультативного измеренияdim).COUNT(mask[, dim])
— целочисленная функция; результат равен числу истинных элементов массиваmask (вдоль факультативного измеренияdim).
MAXLOC(array[, mask][, dim])
,MINLOC(array[, mask][, dim])
,
— целочисленные функции, возвращающие соответственно индекс максимального и минимального элемента (или индексы максимальных и минимальных элементов) вдоль факультативного измеренияdim для элементов, удовлетворяющих массиву-маске. Функции возвращают индекс первого по порядку следования элемента массиваarray. Если аргумент функцийdim не задан, или еслиarray — одномерный массив, то результат записывается в одномерный массив.
Для многомерных массивовarray результат записывается в массив с рангом, на единицу меньшим ранга массиваarray (исключается измерение с номеромdim).
Значения индексов отсчитываются по порядку от нижних границ массива. То есть в случае, если номер нижней границы массиваarray отличается от единицы, то для доступа к максимальному или минимальному элементу массива следует прибавить к результату функцийMAXLOC
иMINLOC
разницу между индексом нижней границы и единицей.
MAXVAL(array[, mask][, dim])
,MINVAL(array[, mask][, dim])
— функции поиска максимального и минимального элемента соответственно в массивеarray для элементов, удовлетворяющих логическому массиву-маскеmask вдоль факультативного измеренияdim.Результат функции — такого же типа и разновидности, что и массивarray. Массивarray может быть только вещественным или целочисленным.
Для одномерного массиваarray или при отсутствии аргументаdim результатом является скаляр, иначе — массив с рангом, на единицу меньшим ранга массиваarray.
FINDLOC(array, value[, dim][, mask])
— целочисленная функция, возвращающая индекс равногоvalue элемента массиваarray. Введена стандартом F2008. Искомые элементы массива удовлетворяют логическому массиву-маскеmask вдоль факультативного измеренияdim. Тип аргументаvalue должен совпадать с типом массиваarray и может быть любого встроенного типа (включая комплексный, логический или символьный). Остальные свойства функции аналогичны свойствам функцийMAXLOC
иMINLOC
.
Начиная со стандарта F2003, функцииMAXLOC
иMINLOC
, как и функцияFINDLOC
, оперируют также и символьными данными.
SUM(array[, mask][, dim])
иPRODUCT(array[, mask][, dim])
осуществляют соответственно суммирование и умножение элементов массива. Смысл аргументов функцийSUM
иPRODUCT
тот же, что и у выше рассмотренных функций.
ФункцияPRODUCT
оперирует комплексными данными, начиная со стандарта F2003.
DOT_PRODUCT(vector_1, vector_2)
осуществляетскалярное произведение по правиламлинейной алгебры векторовvector_1 иvector_2 (одномерных массивов) одинакового размера. Одномерные массивыvector_1 иvector_2 могут содержать данные любого численного и логического типа. Вектораvector_1 иvector_2 могут быть либо оба численными, либо оба — логическими.
MATMUL(matrix_a, matrix_b)
— встроенная функция матричного перемножения. Перемножает две матрицы, матрицу на вектор, вектор на матрицу по правилам линейной алгебры. Аргументы функцииmatrix_a иmatrix_b — двумерные или одномерные численные (любых встроенных численных типов) или логические массивы. Аргументами функции не могут быть одновременно два вектора: один из аргументов обязан быть матрицей (двумерным массивом). Число элементов первого (либо единственного) измерения массиваmatrix_b должно быть равно числу элементов последнего измерения массиваmatrix_a. Введена стандартом F’90.
В некоторых случаях при расчёте произведения вектор-столбца на вектор-строку, требующего при использовании функцииMATMUL
дополнительного преобразовывания векторов в матрицы формы(/m,1/)
и(/1,n/)
, эффективностьMATMUL
по данным Бартеньева[12] заметно уступает обычному вложенному циклу.
По тестам NASA[27] для произведения матриц (двумерных массивов) быстродействиеMATMUL
компилятора фирмы Intel при использовании полной оптимизации-O3 существенно (в некоторых случаях — на порядок) превышает быстродействие вложенных циклов, хотя для матриц размером ~1000×1000 и больше несколько уступает быстродействию подпрограммыDGEMM библиотекиLAPAK. В то же время для матриц ~100×100 и меньшеMATMUL
превосходит по скорости DGEMM. Компилятор Фортрана фирмы IBM, начиная с версии F’90, использует дляMATMUL
алгоритм Винограда — Штрассена со сложностью[28]. Отметим, что стандартом алгоритмические реализации математических функций обычно не оговариваются и остаются на усмотрение разработчика компилятора.
MERGE(t_source, f_source, mask)
— функция, создающая новый массив под управлением маски-массиваmask из элементов массивовt_source иf_source той же формы и того же размера, что и исходные массивы. Массивы-аргументы и массив-результат могут быть любого встроенного типа и совпадать по типу данных, размеру и форме.
Если элементmask есть истина (.ТRUE.
), то соответствующий ему элемент массива-результата равен соответствующему элементу массиваt_source; если ложь (.FALSE.
) — то элементу массиваf_source.
Аргументами функции могут быть скаляры; в этом случае, например,MERGE(a,0,c>=0)
=a·Θ(с), гдеΘ(с) — целочисленнаяфункция Хэвисайда.
MOVE_ALLOC(from, to)
— встроенная подпрограмма, позволяющая динамически переразмещать ранее размещённый динамический массивto с новыми границами и размером, как у динамического массиваfrom. При этом данные из массиваfrom копируются в массивto. Тип данных и ранг массивовfrom иto должны совпадать. После переразмещения массиваto массивfrom освобождает память и становится неразмещённым. Может быть полезна в численных методах с изменяющейся дискретизацией задачи (многосеточных иадаптивных методах).
Введена стандартом F2003.
TRANSPOSE(matrix)
— функция,транспонирующая (меняющая местами строки и столбцы) двумерную матрицу.
В современном Фортране предусмотрены встроенные функции упаковки и распаковки многомерного массива в одномерный массив (и из одномерного массива, соответственно) под управлением логического условия для повышения быстродействия и экономии памяти.
PACK(array, mask [, vector])
— функция; упаковывает многомерный массив любого типаarray в одномерный массив-вектор под управлением логического массиваmask. Необязательный одномерный массивvector должен иметь тот же тип данных, что иarray, причём количество элементов вvector, если он задан, должно быть не меньше числа истинных элементов вmask. Еслиmask — скаляр со значением.TRUE.
, то число элементов в массивеvector, если он задан, должно быть не меньше, чем общее число элементов вarray.
Результатом функции будет одномерный массив того же типа, что иarray. Длина результата будет равна длине вектораvector, если он задан; если нет — то числу истинных элементов в массиве-маскеmask. Еслиvector не задан, аmask — скаляр со значениемистина, то длина результирующего одномерного вектора равна числу элементов массиваarray.
Результирующий массив последовательно заполняется элементами массиваarray (в порядке их размещения в компьютерной памяти), удовлетворяющими истинным значениям массиваmask. При этом, если заданvector, из него выбираются недостающие (возможно) элементы в массиве-результате, причём начиная с индекса, следующего за последним по порядку истинным элементом массиваarray.
Так, для массива
результатом функцииPACK(A, mask=A.NE.0)
будет одномерный массив. Если дополнительно задан вектор, то результатомPACK(A, mask=A.NE.0, V)
будет
.
Файлы и операции ввода-вывода
[править |править код]Фортран обладает богатым встроенным инструментарием для операций ввода-вывода, в том числе для больших массивов данных. Файлы в Фортране бывают внутренние и внешние.
Внутренний файл — это любой массив, символьная строка или подстрока. Внутренние файлы всегда открыты по умолчанию.Внешний файл — это любой файл, внешний по отношению к выполняемой программе.
С обоими типами файлов используются одни и те же операторы записиWRITE
и чтенияREAD
. Внутренние файлы используются для преобразований число-строка-число и для создания смешанных числовых и символьных записей.
Character(15)stringReal::xyz=-123.456IntegerintgWrite(string,*)xyz! Запись в строку числа -123.456Print*,'string=',string! string=␣ -123.4560␣ ␣Read(string,'(I6)')intg! Чтение из строки целого числаPrint*,'intg=',intg! intg=␣ -123!...
Внешние файлы подразделяются на форматные (текстовые, CR- и LF-потоки), бинарные (двоичные), непосредственно отображающие оперативную память, и неформатные (не двоичные). Кроме того, они могут быть файлами прямого и последовательного доступов с записями фиксированной и переменной длины (переменной — только для последовательных файлов), а также сегментированными записями (для очень больших неформатных последовательных файлов). Таким образом, Фортран позволяет создавать и обрабатывать довольно большое количество видов файлов — 15 способов организации.Максимальный размер одной записи — два гигабайта.
Файлы прямого доступа позволяют осуществлять операции ввода-вывода с записями с заданным номером (без затирания вышерасположенных или нижерасположенных записей в файле).
При открытии последовательного файла его можно позиционировать в начало, в конец (перед записью «конец файла»), что позволяет добавлять данные по мере их накопления без затирания ранее введённых, а также либо в начало, либо в конец в зависимости от ранее определённого статуса файла (был он открыт ранее или нет).
Работа с памятью
[править |править код]В современных стандартах языка (начиная с Fortran’90 или Fortran’95) возможна работа с тремя видамидинамических массивов (автоматическими, размещаемыми и массивами-ссылками),указателями,ссылками; имеются встроенные процедуры для работы с памятью напрямую и процедуры для побитовых операций.
Стандарты языка предполагают автоматическое освобождение оперативной памяти, занятой любым типом динамического массива, после завершения работы программы или подпрограммы (процедуры, функции), даже если программистом освобождение не было выполнено явно. Это позволяет избегать возникновенияутечек памяти при работе с динамическими массивами средствами Фортрана (при использовании указателей и в других случаях утечки возможны) при небрежности программирования[12].
Автоматические массивы (размещаемые компилятором) создаются при вызове подпрограммы и являются её локальными объектами. Их границы определяются всякий раз при обращении к процедуре; при этом при выходе из неё они уничтожаются, а память — очищается. Автоматические массивы во время выполнения программы находятся встеке, размещаемые (с помощью оператораALLOCATE
) — вкуче[26].
Указатели Фортрана аналогичны указателям Си[12], однако при решении вычислительных задач и разработке математических алгоритмов они в большинстве случаев с успехом заменяются иными инструментами Фортрана.
Управляющие конструкции
[править |править код]Начиная со стандарта F’90 конструкция условного переходаIF THEN
—ELSEIF THEN
—END IF
не отличается от подобных конструкций в других современных языках и заменила т. н. «арифметический»IF
с метками, признанный устаревшим[9]. Существует и более простая форма условного оператора:IF
(логическоеусловие)
оператор
, где исполняемый оператор должен быть единственным после оператораIF
, например,Goto
метка
.
Конструкция выбораSELECT CASE
—CASE
—CASE DEFAULT
—END SELECT
, наоборот, отличается от конструкцииSWITCH
—CASE
в Си-подобных языках, таких как:C++[29],Java[30],JavaScript[31] и других, несколько напоминая по возможностям операторCASE
вПаскале[32].
IntegerN(74)! выражение выбора — это целое, логическое, символьное выражение или...! целочисленый массив, или массив символов с любым ненулевым числом элементовnameSC:Select Case(N(i))! nameSC — имя конструкции, N(i) — элемент массиваCase(:-5)! выполняется для всех N(i), меньших либо равных -5 с шагом +1! Блок 1Case(-3,-1,0,2)! для переменной N(i), равной -3, -1, 0, 2! Блок 2Case(50:100)! для N(i) в диапазоне от 50 до 100 включительно (шаг +1)! Блок 3Case(400)! для N(i)=400! Блок 4Case(1,20:30,35)! для N(i)=1, N(i) в диапазоне от 20 до 30 включительно и N(i)=35! Блок 5CaseDefault! для всех прочих ситуаций. Case Default — опциональный, необязательный оператор! Блок по умолчаниюEnd SelectnameSC
Если значение переменной N, называемой выражением выбора, совпадёт со списком селекторов (списком значений или диапазоном) в к-либо оператореCASE
, например, в третьем дляN=70, то, после выполнения соответствующего блока операторовБлок-3, происходитвыход из конструкцииSELECT CASE
[12][26], и операторов прерывания (типаBREAK
)не требуется. ОператорCASE DEFAULT
, равно как и имя конструкции, не является необходимым. Диапазоны в списках селекторов различных операторовCASE
не должны пересекаться или иметь хотя бы одного общего элемента.
В качестве выражения выбора (N) может быть элемент целочисленного массива.
Диапазоны в списках селекторов применяются только для целых или для символов, по возрастанию от нижней границы к верхней; для символов — по возрастаниюих кодов.
В современном Фортране существуют две формы циклов со счётчиком итераций: традиционная конструкцияDO
—ENDDO
и цикл с меткой. Последняя признана устаревшей конструкцией начиная со стандарта F’90, однако до сих пор входит в стандарты. Для вложенных циклов с большим уровнем вложенности последняя форма может быть более лаконичной:
! Синтаксис устаревшей конструкции циклаdo1k=1,10! 1- это метка конца циклаdo1j=1,20! метка может быть одинаковой для вложенных цикловdo1i=1,100arr(i,j,k)=251Continue! метка может стоять только перед к-либо операторомL1:dok=1,10! однако современная запись допускает именовать циклы,L2:doj=1,20! что больше соответствует концепции структурного программированияL3:doi=1,100! и позволяет легче избежать ошибокarr(i,j,k)=25end doL3end doL2end doL1
Заголовок цикла со счётчиком имеет следующий полный вид:
name:DOI=N1,N2,dN! имя конструкции необязательно...! N1 — начальное значение счётчика, N2 — конечное, dN — шаг (параметры цикла)END DOname! Параметры цикла — целые числа произвольного знака. dN не равно нулю.
Число выполнения тела цикла без прерывания равноNс=max
(int
((N2-N1+dN)/dN), 0) и может быть равным нулю.
Например, цикл выполнится нуль раз, еслиN2<N1 и шаг положителен:dN>0. Если шаг отрицательный,dN<0, то цикл пройдёт в обратном порядке, при этом для выполнения цикла необходимо, чтобыN2<N1. Если шагdN опущен, то по умолчанию он считается равным единице:dN=1.
Значение переменной циклаI после выхода из него всегда равноNс+1, то естьна единицу больше числа итераций цикла и не менее единицы:I≥1.
Возможен также цикл с условиемDO WHILE
(логическоеусловие)
—END DO
, и бесконечный циклDO
—END DO
, имеющие стандартную форму.
ОператорCYCLE
имя цикла
прерываеттекущую итерацию цикла и переходит к следующей итерации этого же цикла. Если имя цикла не указано, то выполняется прерывание итерации текущего цикла (в котором расположен операторCYCLE
).
ОператорEXIT
имя цикла
прерывает выполнение цикла с указанным именем и передаёт управление далее, а при отсутствии имени — прерывает текущий цикл (в который вложен операторEXIT
).
ОператорыCYCLE
иEXIT
логически тождественны операторуGOTO
(в соответствующих обстоятельствах), но существенно облегчают понимание и обслуживание кода программистом.
Компиляторы
[править |править код]
С момента первоначальной разработки языкакомпиляторы Фортрана производит фирма IBM. В настоящее время фирмой IBM поставляется оптимизирующий компиляторVS Fortran[33] длямэйнфреймовIBM System z, история развития различных версий которого восходит ещё к1964 году, а также компиляторXL Fortran[34] для платформ на базе архитектурыPowerPC —AIX,Linux и суперкомпьютераBlue Gene (выпускалась также версия дляMac OS X, когда компьютерыMacintosh использовали процессоры PowerPC). Оба этих компилятора содержат очень сложные оптимизаторы, являющиеся результатом непрерывной научной работы специалистов IBM на протяжении полувека. На базе компилятора IBM Fortran XL фирмой Absoft, бизнес-партнёром IBM, создан и поставляется компилятор Absoft Pro Fortran для систем на базе процессоров PowerPC (Linux, Mac OS X) и Intel (Linux, Mac OS X, Windows)[35].
Существовала реализация Фортрана длявиртуальной машиныUCSD p-System, которая позволяла создавать исполняемый код независимый от аппаратной платформы.
До1997 крупным производителем компилятора Фортран для операционной системы Windows была корпорацияMicrosoft. Впоследствии она отказалась от их разработки в связи с низкой прибыльностью. После этого компилятор поставляла фирмаDEC, вошедшая в 1998 году в составCompaq и вместе с последней в 2002 году слившаяся сHP. Дальнейшей разработкой этой версии компилятора стала заниматься фирмаIntel, а компилятор называетсяIntel Fortran Compiler, который позволяет оптимизировать код под платформы Intel IA-32, x86_64 и IA-64.
Компания DEC поставляет компилятор, интегрированный в среду разработкиDigital Visual Fortran, основанную наMicrosoft Visual Studio. Наиболее известными продуктами этой линейки являются FPS 4.0 (Microsoft Fortran Power Station), DVF 5.0 и 6.0. Каждый компилятор может поддерживать несколько стандартов Фортрана. Слияния компаний явились причиной того, что последующие продукты появлялись на рынке под торговыми марками Compaq и HP. В настоящее время HP продаёт среду разработки версии 6.6 для Intel/win32. Поддержка Фортрана реализована также для всех высокопроизводительных платформ HP.
Другим крупным поставщиком систем разработки на Фортране является фирмаLahey, предлагающая интегрированные решения для Windows и Linux.
Долгое время лучшим компилятором Фортрана для PC считался компилятор фирмыWatcom, который был выделен в отдельный проектOpen Watcom, развивающий компилятор на открытой основе.
Среди бесплатных компиляторов Фортран следует выделить компилятор от бывшейSun Microsystems (сейчас Oracle), входящий в составSun Studio, который генерирует эффективный код подSPARC,x86 иx86-64[36] и доступен для ОСSolaris,OpenSolaris иGNU/Linux.
Фонд свободного программного обеспеченияGNU выпускал открытый компилятор Фортрана-77g77, доступный практически для любой платформы и полностью совместимый сGCC. Сейчас ему на смену пришёл компиляторGFortran, в котором реализованы практически все конструкции стандарта Фортран-95 и многие конструкции стандартов Фортран-2003, Фортран-2008 и Фортран-2018. Он также полностью обратно совместим с Фортран-77. Также существует независимый проектg95 по созданию на основеGCC компилятора Фортран-95.
Взаимодействие с другими языками
[править |править код]Многие системы программирования позволяют компоновать полученные в результате трансляции фортрановской программыобъектные файлы с объектными файлами, полученными от компиляторов с других языков, что позволяет создавать более гибкие и многофункциональные приложения. Для языка Фортран также доступно большое количество библиотек, содержащих как подпрограммы решения классических вычислительных задач (LAPACK,IMSL,BLAS), задач организации распределённых вычислений (MPI,PVM), так и задач построения графических интерфейсов (Quickwin,FORTRAN/TK) или доступа кСУБД (Oracle).
Фортран в СССР
[править |править код]Фортран вСССР появился позже, чем на Западе, поскольку поначалу в СССР более перспективным языком считалсяАлгол. Во внедрении Фортрана большую роль сыграло общение советских физиков со своими коллегами изCERN, где в 1960-х годах почти все расчёты велись с использованием программ на Фортране[37].
Первый советскийкомпилятор с Фортрана был создан в 1967 году для машиныМинск-2, однако он не получил большой известности. Широкое внедрение Фортрана началось после создания в 1968 году компилятора ФОРТРАН-ДУБНА для машиныБЭСМ-6. Фортран — основной язык дляАСВТ иСМ ЭВМ, часто использовался вместе спрепроцессоромРАТФОР. МашиныЕС ЭВМ, появившиеся в1972 году, уже изначально имелитранслятор Фортрана («позаимствованный» сIBM/360 вместе с другим программным обеспечением).
В 1970-x годах вИПМ была разработана графическая библиотекаГРАФОР («Графическое РАсширение ФОРтрана»)[38].
В конце 1980-х — начале 1990-х физикАндрей Зарецкий создал серию детских книжек, одним из главных героев которых былпрофессор Фортран, доступным языком объяснявший детям основыкомпьютерной грамотности и программирования[39][40].
Примечания
[править |править код]- ↑1234History of FORTRAN I, II, and III —Journal of the ACM, 1981.
- ↑В.Э. Карпов. КЛАССИЧЕСКАЯ ТЕОРИЯ КОМПИЛЯТОРОВ. — Учебное пособие. 2-е изд.. — Москва, 2011. — 91 с. — ISBN 5–230–16344–5.
- ↑ЯзыкПланкалкюль, претендующий на пальму первенства, был изобретён ещё в 1945 году, но не был реализован вплоть до 2000 года.
- ↑Словарь иностранных слов. — М.: «Русский язык», 1989. — 624 с.ISBN 5-200-00408-8
- ↑См., например:Netlib Repository at UTK and ORNLАрхивная копия от 27 июля 2021 наWayback Machine
- ↑IMSL Fortran Numerical Library | Rogue Wave (неопр.). Дата обращения: 19 августа 2015. Архивировано 16 августа 2015 года.
- ↑Бартеньев О.В. 1-3 // Фортран для профессионалов. Математическая библиотека ISML. — Москва: Диалог-МИФИ, 2001. — ч1 - 448 с., ч2 - 320 с., ч3 - 368 с. —3000 экз. —ISBN 5-86404-157-2 (ч.2), 5-86404-18-58-0 (ч.3).
- ↑123456789Горелик А. М. Эволюция языка программирования Фортран (1957—2007) и перспективы его развития (рус.) // Вычислительные методы и программирование. — 2008. —Т. 9. —С. 53—71. Архивировано 2 апреля 2015 года.
- ↑123Горелик А.М. Часть 2, Главы 14-20 // Программирование на современном Фортране. — Москва: Финансы и статистика, 2006. — 352 с. —3000 экз. —ISBN 5-279-03066-X.
- ↑ANSI. X3.9-1966 - FORTRAN. — 1966. Архивировано 1 ноября 2020 года.Архивная копия от 1 ноября 2020 наWayback Machine
- ↑Fortran 77 - ANSI X3J3/90.4 Working Group (англ.). Дата обращения: 18 февраля 2021. Архивировано 11 ноября 2020 года.
- ↑12345678Бартеньев О. В. Современный Фортран. —М.: Диалог МИФИ, 2005. —ISBN 5-86404-113-0. Архивировано 10 февраля 2011 года.
- ↑Fortran 90 - Last Working Draft (англ.). wg5-fortran.org. Дата обращения: 18 февраля 2021. Архивировано 5 ноября 2020 года.
- ↑Горелик А. М.Объектно-ориентированное программирование на современном ФортранеАрхивная копия от 7 сентября 2011 наWayback Machine
- ↑Fortran 95 - Last Working Draft (англ.). wg5-fortran.org. Дата обращения: 18 февраля 2021. Архивировано 1 июля 2021 года.
- ↑Горелик А. М. 3. Введение в параллельное программирование на Фортране // Программирование на современном Фортране. — Москва: Финансы и статистика, 2006. — 352 с. —ISBN 5-279-03066-X.
- ↑12Алгазин С. Д., Кондратьев В. В. Программирование на Visual Fortran. —М.: «ДиалогМИФИ», 2008. — 448 с. —ISBN 5-8243-0759-8.
- ↑Fortran 2003– Last Working Draft (неопр.). Gnu.Org. Дата обращения: 10 мая 2014. Архивировано 25 февраля 2021 года.
- ↑Fortran 2008 – Last Working Draft (неопр.). Gnu.Org. Дата обращения: 10 мая 2014. Архивировано 3 марта 2021 года.
- ↑Горелик А. М.НовостиАрхивная копия от 2 марта 2012 наWayback Machine
- ↑Fortran 2018 (неопр.). ISO. Дата обращения: 30 ноября 2018. Архивировано 1 декабря 2017 года.
- ↑Further Interoperability with C (неопр.). ISO. Дата обращения: 20 ноября 2017. Архивировано 8 марта 2021 года.
- ↑Additional Parallel Features in Fortran (неопр.). ISO. Дата обращения: 20 ноября 2017.
- ↑Fortran 2023 (неопр.). wg5-fortran.org. Дата обращения: 30 ноября 2023.
- ↑Трой Дуглас, Douglas A. Troy. пер. с англ. Б. А. Кузьмина. Программирование на языке Си для персонального компьютера IBM PC = Complete C Language Programming for the IBM-PC / И. В. Емелин. — Москва: "Радио и связь", 1991. — 432 с. —ISBN 5-256-00707-6, 0-316-85311-9.
- ↑123Горелик А.М. Часть 1, Главы 1-13 // Программирование на современном Фортране. — 1. — Москва: Финансы и статистика, 2006. — 352 с. —ISBN 5-279-03066-X.
- ↑Thomas Clune. Comparing Python, NumPy, Matlab, Fortran, etc. (неопр.) NASA Modeling Guru (октябрь 2009). Дата обращения: 7 октября 2015. Архивировано 23 октября 2015 года.
- ↑Craig C. Douglas, Gordon Slishman. Variants of Matrix-matrix Multiplication for Fortran-90 // SIGNUM Newsl.. — 1994-04-01. —Т. 29,вып. 2. —С. 4–6. —ISSN0163-5778. —doi:10.1145/181498.181500. Архивировано 9 августа 2021 года.
- ↑Оператор switch (C++) (неопр.). msdn.microsoft.com. Дата обращения: 5 июня 2016. Архивировано 13 августа 2016 года.
- ↑The switch Statement (англ.). oracle.com. Дата обращения: 15 августа 2024. Архивировано 15 марта 2010 года.
- ↑Конструкция "switch" (рус.). Дата обращения: 5 июня 2016. Архивировано 9 июня 2016 года.
- ↑The Case statement (неопр.). www.freepascal.org. Дата обращения: 5 июня 2016. Архивировано 22 мая 2016 года.
- ↑VS FORTRAN (неопр.). Дата обращения: 8 марта 2010. Архивировано 9 августа 2021 года.
- ↑XL Fortran for Linux (неопр.). Дата обращения: 8 марта 2010. Архивировано 9 августа 2021 года.
- ↑Absoft Pro Fortran Compiler Suites General Overview (неопр.). Дата обращения: 8 марта 2010. Архивировано 9 августа 2021 года.
- ↑Sun Studio — Benchmarks (неопр.). Дата обращения: 20 ноября 2007. Архивировано 26 октября 2007 года.
- ↑Очерк Александра Расторгуева о появлении Фортрана в Дубне (неопр.). Дата обращения: 22 января 2012. Архивировано 10 июля 2014 года.
- ↑История компьютерной графики в России (неопр.). Дата обращения: 8 января 2012. Архивировано изоригинала 17 марта 2012 года.
- ↑Энциклопедия профессора Фортрана.Sutki.net. 29 января 2008.Архивировано 10 марта 2012. Дата обращения: 11 июня 2013.
- ↑Кириленко, Александр (7 сентября 2009).Эстония вводит программирование в школах начиная с младших классов.Ноосфера.Архивировано 9 сентября 2012. Дата обращения: 11 июня 2013.
Литература
[править |править код]- Fortran. Programmer's Reference Manual. The Fortran Automatic Coding System for the IBM 704 EDPM. — IBM Corp., 1956. — 51 с.
- Роберт У. Себеста. 2.3. Компьютер IBM 704 и язык Фортран // Основные концепции языков программирования = Concepts of Programming Languages / Пер. с англ. — 5-е изд. —М.:Вильямс, 2001. — С. 63—69. — 672 с. —5000 экз. —ISBN 5-8459-0192-8 (рус.),ISBN 0-201-75295-6 (англ.).
- ISO/IEC 1539-1:2010 Information technology — Programming languages — Fortran — Part 1: Base language
- ISO/IEC 1539-2:2000 Information technology — Programming languages — Fortran — Part 2: Varying length character strings
Ссылки
[править |править код]- О старом Фортране замолвлено слово…
- Professional Programmer’s Guide to Fortran77 (англ.)
- gfortran — Компилятор Фортрана 95/2003/2008, частьКоллекции компиляторов GNU (англ.)
- Статья Фортран вПрогопедии — энциклопедии языков программирования (рус.)