Фортран
Фортран (Fortran) (раніше FORTRAN[1] — скорочення від «The IBM Mathematical Formula Translating System», тобто «Система трансляції математичних формул від IBM») — імперативна мова програмування загального призначення, яка особливо підходить для інтенсивних чисельних та наукових обчислень. Розроблена корпорацією IBM в 1950-х роках в університетському містечку на півдні Сан-Хосе (Каліфорнія) для потреб наукових та інженерних проектів.
Fortran | |
---|---|
Парадигма | структурна, імперативна (процедурна, об’єктно-орієнтована), узагальнена, паралельна |
Дата появи | 1957 |
Творці | Джон Бекус |
Розробник | Джон Бекус і IBM |
Система типізації | сильна, статична, маніфест |
Основні реалізації | Absoft, Cray, GFortran, G95, IBM, Intel, Lahey/Fujitsu, Open Watcom, Pathscale, PGI, Silverfrost, Oracle, XL Fortran, Visual Fortran, та інші |
Під впливом від | Speedcoding |
Вплинула на | ALGOL 58, BASIC, C, PL/I, PACT I, MUMPS, Ratfor |
Звичайні розширення файлів |
. |
Вебсайт | fortran-lang.org |
Фортран у Вікісховищі |
Досить швидко Фортран почав домінувати в цій галузі програмування, і понад півстоліття постійно використовується для чисельного прогнозу погоди[2], аналізу методом скінченних елементів, обчислювальної гідродинаміки, обчислювальної фізики та хімії. Це одна з найбільш популярних мов для високопродуктивних обчислень, а також використовується для тестування швидкодії найпотужніших у світі суперкомп'ютерів[3][4].
Фортран вважається першою мовою програмування, що широко використовувалась та підтримувала найрізноманітніші комп'ютерні архітектури. Розвиток Фортрану відбувався паралельно ранній еволюції технології компіляторів, і багато досягнень в галузі теорії та розробки компіляторів були спеціально мотивовані необхідністю створення ефективного коду для програм мовою Фортран.
Історія розвитку
Фортран як мова розвивався стабільно і навіть консервативно. Кожен наступний стандарт був створений після тривалої дискусії між виробниками компіляторів та зацікавленими експертами. Тому кожна з версій, що розвивалася, зазвичай додавала тільки розширення мови, одночасно зберігаючи при цьому сумісність з попередніми версіями (однак були і винятки). Версія Fortran 77 додала підтримку для обробки символьних даних; операції з масивами і модульне програмування з'явилися у версії Fortran 90; функційне програмування у версії Fortran 95 (частково), об'єктно-орієнтоване програмування та узагальнене програмування у версії Fortran 2003. Узагальнене паралельне програмування з допомогою co-arrays, що використовує архітектурно-незалежний та близький для фортрану синтаксис для паралельної декомпозиції даних та виконання інструкцій, було стандартизовано у версії Fortran 2008.
До 1960 версії мови Фортран були доступні для комп'ютерів IBM моделей 709, 650, 1620, і 7090. Зростання популярності мови спонукало виробників комп'ютерів забезпечити компіляторами Фортрану свої машини, до 1963 існувало понад 40 різних компіляторів Фортрану.
До появи дисків та файлів, текстових редакторів та терміналів, програми найчастіше вводили за допомогою перфокарт на клавіатурі перфоратора на 80 знаків. Колода карт подавалася в спеціальний зчитувач перфокарт для компіляції. Тому оригінальний код Фортрану мав фіксований формат завдовжки 80 символів (стовпчиків). Не підтримувалась рекурсія та підпрограми.
FORTRAN
Наприкінці 1953 Джон В. Бекус запропонував своєму керівництву в IBM розробити більш практичну альтернативу мови програмування для їхньої ЕОМ IBM 704. До команди створення мови Фортран увійшли також програмісти Річард Ґолдберґ, Шелдон Бест, Гарлан Геррік, Пітер Шерідан, Рой Натт, Роберт Нельсон, Ірвін Ціллер, Лоїс Гейбт, Девід Сейр. Проект специфікації системи було завершено до середини 1954. Перший посібник для мови Фортран з'явився в жовтні 1956, а перший компілятор — у квітні 1957.
Це був перший у світі оптимізувальний компілятор, оскільки клієнти погоджувалися використовувати мови програмування високого рівня тільки якщо компілятор зможе генерувати код з продуктивністю близькою до коду, який може написати досвідчений програміст безпосередньо на асемблері. Мова була позитивно прийнята вченими та інженерами для написання програм, котрі створили необхідні умови та ринок для створення компіляторів, які можуть генерувати більш швидкий і ефективний код. Додання комплексних чисел зробило мову особливо зручною також для технічних та інженерних програм, таких як електротехніка.
FORTRAN II
FORTRAN II від IBM з'явився 1958. Основними поліпшеннями були підтримка процедурного програмування, тобто підпрограми і функцій з параметрами, що передавалися за посиланням (by reference). Для підпрограм надали можливість доступу до глобальних змінних.
FORTRAN III
1958 IBM розробила FORTRAN III, що дозволяв писати на асемблері у функціях, цю версію не випустили на ринок як готовий продукт.
FORTRAN для IBM 1401
Для машини IBM 1401 було створено інноваційний на той час 63-прохідний компілятор Фортрану, розміром 8 кілобайт. Він зберігав код програми в пам'яті та одночасно поступово транслював її машинною мовою — це був перший у світі інтерпретатор мови програмування. Наступний інтерпретатор для іншої мови (Паскаль) зʼявився 1970.
FORTRAN IV
Починаючи з 1961, після вивчення потреб клієнтів, компанія IBM розпочала розробку версії FORTRAN IV, в якій були видалені машиннозалежні особливості FORTRAN II (такі як READ INPUT TAPE), і додано багато нових елементів, таких як: логічний тип даних, логічні операції та логічний IF як альтернативу арифметичному IF. FORTRAN IV випустили 1962, спочатку для комп'ютерів IBM 7030 («Stretch»), а потім і для IBM 7090 та IBM 7094. До 1965 FORTRAN IV був «стандартом» відповідно до American Standards Association X3.4.3 FORTRAN Working Group[5].
FORTRAN 66
Після рішення Американської асоціації стандартів (ANSI зараз) сформувати комітет для розробки «американського стандарту Фортрану» в березні 1966 Fortran 66 фактично став першою «стандартною для індустрії» версією Фортрану.
Fortran 66 мав дуже багато удосконалень:
- програмні одиниці: головна програма,
subroutine
,function
, таblock data
; - типи даних
integer
,real
,double precision
,complex
таlogical
; - інструкції
common
,dimension
, іequivalence
; - інструкція
data
для специфікації початкових значень змінних; - функції
intrinsic
таexternal
(тобто бібліотечні); - інструкції
goto
, визначенийgoto
, та обчислюванийgoto
; - логічний та арифметичний (триваріантний)
if
; - цикл
do
; - ключові слова для послідовних операцій вводу-виводу
read
,write
,backspace
,rewind
, таendfile
; - інструкція для форматованого вводу-виводу
format
; - інструкції
call
,return
,pause
, таstop
; - константи Голлеріта у виразах
data
таformat
, а також як аргументи для процедур; - ідентифікатори з довжиною до 6 символів,
- можливість запису коментарів у коді.
FORTRAN 77
Після оприлюднення стандарту FORTRAN 66, виробники компіляторів продовжували на прохання користувачів додавати розширення для мови, що змусило ANSI 1969 почати перегляд затвердженого 1966 стандарту. Остаточні проекти наступного стандарту були завершені 1977, офіційне затвердження стандарту FORTRAN 77 відбулося в квітні 1978.
Новий стандарт FORTRAN 77 додавав низку істотних особливостей для вирішення багатьох недоліків FORTRAN 66:
- блоки
if ... end if
, з опціональнимиelse ... else if
, що значно полегшували структурне програмування; - розширення циклів з параметричними виразами, негативним інкрементом та нульовим циклом
do
; - інструкції
open
,close
, таinquire
для роботи з файлами, а також прямий доступ до файлів; - вираз
implicit
та символьний тип данихcharacter
з великою кількістю функцій для нього; parameter
для декларування констант;save
для постійних локальних змінних;- загальні імена для вбудованих функцій.
У цій версії стандарту окремі інструкції були вилучені або оголошені застарілими (тобто такими, що будуть вилучені в наступних версіях мови).
Fortran 90
Зі значним запізненням, як наступник FORTRAN 77, відомий зараз як Fortran 90 (попередня назва Fortran 8X) був випущений як стандарт ISO 1991 і стандарт ANSI 1992. Це був досить масштабний перегляд попереднього стандарту, котрий також враховував нові тенденції та розвиток інших мов. Було додано безліч нових функцій, щоб відобразити значні зміни в практиці програмування:
- нефіксована форма запису джерельного коду (інструкції можуть бути розміщені де завгодно в рядку,
&
означає продовження інструкції в наступному рядку,;
розділяє кілька інструкцій в одному рядку) а також запис ключових слів малими літерами; - ідентифікатори змінних довжиною до 31 символа;
- вбудовані однорядкові коментарі
!
; - операції над масивами як ціле, та над вибірками масивів, що значно спрощувало математичні та інженерні обчислення, введено поняття масиву без елементів (нульового розміру);
- рекурсивні процедури (підпрограми та функції);
- модулі
module ... end module
для групування пов'язаних процедур і даних, щоб зробити їх доступними для інших частин програми, включаючи можливість обмежувати доступ тільки до певних частин модуля з допомогоюprivate/public
; - значно покращився механізм передачі аргументів (атрибути
optional
,intent(in/out/inout)
), що дозволяло перевіряти інтерфейси функцій та процедур під час компіляції (атрибутintrinsic
); додано також опціюresult()
для оголошення назви змінної, що повертається функцією; - передбачено створення інтерфейсів
interface ... end interface
користувачем для узагальнених процедур; - перевантаження операторів;
- похідні/абстрактні типи даних
type ... end type
з оператором вибору компонента
%
; новий тип синтаксису для декларації типу даних та інших атрибутів змінних:kind
(та додатковоlen
для символьногоcharacter
вбудованого типу),save
, та іменованих константparameter
; - динамічне виділення пам'яті за допомогою атрибутів
allocate/deallocate
таallocatable
; - вказівник
pointer
та атрибутtarget
для типу, на який вказує вказівник,— для полегшення створення та операцій з динамічними структурами даних; - нові оператори порівняння
<
,<=
,==
,/=
,>
,>=
; - структуровані циклічні конструкції
do i = x,y,z ... end do
зend do
, а неcontinue
для завершення циклу,cycle
таexit
для контролю та виходу з ітерацій циклу; циклиdo while () ... end do
, необмежені цикли у форміdo ... end do
без лічильника; select case ... end select
для багатоходового вибору;sequence
інструкцію для контролю запису на фізичний носій об'єктів похідних типів, якщо такі об'єкти знаходяться в інструкціяхequivalence
таcommon
;- конструкцію
where () ... elsewhere ... end where
для полегшення маніпуляцій з масивами; - специфікації точності обчислень під контролем користувача;
- нові та вдосконалені вбудовані процедури (понад 100 нових функцій та підпрограм!);
На відміну від попередніх версій, з версії стандарту Фортран 90 не було видалено жодного елементу, однак багато оголосили застарілими: нецілі лічильники в конструкціях циклів, завершення циклу з допомогою визначеної мітки, спільні continue
для вкладених do
циклів, арифметичні конструкції if(x) a,b,c
, інструкцію pause
, assign
.
Fortran 95
Fortran 95 був незначним переглядом попереднього стандарту, переважно для вирішення нагальних питань з практики програмування за допомогою стандарту Fortran 90.
До версії Fortran 95 також було додано розширення:
- з так званого високопродуктивного фортрану (High Performance Fortran):
forall
і вкладені інструкціїwhere
, для полегшення векторизації; pure
і елементарніelemental
процедури;- стандартна ініціалізація за замовчуванням компонентів похідних типів;
- розширено можливості використання виразів ініціалізації;
- доповнили явним роз'ясненням, що пам'ять зайнята динамічними (
allocatable
) масивами автоматично звільняється, коли вони виходять з своєї області видимості; - розширили кількість вбудованих функцій.
Окремі інструкції відзначені у версії Fortran 90 як застарілі, були видалені з версії Fortran 95: цикли з дійсними лічильниками, pause
тощо.
Важливим доповненням до Fortran 95 стала доповідь ISO TR-15581. У цій специфікації визначено розширене використання динамічних (allocatable
) масивів, ще до наявності повністю сумісних компіляторів для версії Fortran 2003. Додали можливість для динамічних масивів бути компонентами похідних типів, в списках формальних параметрів процедур, а також як значення, що повертаються функцією.
Ще одним важливим доповненням до Fortran 95 була технічна доповідь ISO TR-15580: з обробкою винятків роботи з рухомою комою, неофіційно відомий як IEEE TR. В цій специфікації визначено також повну підтримку IEEE арифметики з рухомою комою. Fortran 95 також додав два додаткові модулі для підтримки рядків змінної довжини (Varying character strings (ISO/IEC 1539-2 : 2000)) та умовної компіляції (Conditional compilation — ISO/IEC 1539-3 : 1998).
Fortran 2003
Fortran 2003 став одним з основних переглядів, що додав багато нових можливостей.
Основні поліпшення для нової версії стандарту[6]:
- покращення для похідних типів — додано параметризовані похідні типи (з допомогою вхідних параметрів типу
kind
, таlen
); - покращено контроль доступності;
- поліпшено структури конструкторів та введено явні деструктори з допомогою
final
; - додано зв'язування модульних процедур до оголошених в похідному типі процедур та операторів (перевантаження та створення нових операторів) у вигляді
=>
; - додано узагальнені ідентифікатори-назви
generic
для зв'язаних процедур-методів похідного типу (поліморфних для різних типів вхідних параметрів); - додано явні атрибути
pass
таnopass
для керування передачі вказівника на об'єкт в прив'язаних до типу процедур, можливість керувати видимістю (private
,public
) окремих компонентів типу — як видимістю компонентів з даними так і видимістю прив'язаних процедур (слід однак мати на увазі, що видимість і доступність типів, компонент типів, об'єктів та змінних в фортрані заснована на модулях/субмодулях, а не на похідних типах, як в багатьох інших ОО-мовах); - об'єктно-орієнтоване програмування — розширення типу і успадкування (за допомогою
extends
) та заборона за потреби переозначення зв'язаних до батьківського типу процедур (ключове словоnon_overridable
), поліморфізм типів (class
, необмежений поліморфний специфікаторclass(*)
, конструкціїselect type ... end select
, та вбудовані функціїsame_type_as
,extends_type_of
), відкладене зв'язування (deffered
) та абстрактні типи (abstract
), динамічне виділення пам'яті для типів та прив'язаних до типу процедур; - покращення маніпуляцій з даними — динамічне виділення пам'яті для компонентів типів, автоматичне виділення пам'яті для динамічних масивів під час присвоєння, перевиділення(перенесення) пам'яті для динамічної змінної (з допомогою підпрограми
move_alloc
); - блок для скороченого іменування довгих виразів
associate ... end associate
; - атрибут
volatile
; - явні специфікації типу в конструкторах масивів;
- удосконалення вказівників
pointer
; - введення вказівників на модульні процедури, вказівників на процедури як компонент похідних типів (procedure pointer components дозволяють реалізувати динамічне зв'язування (ручну динамічну диспетчеризацію) процедур-методів в об'єкті-примірнику похідного типу в часі виконання), розширені вирази для ініціалізації, і покращення вбудованих процедур;
- внесення концепції вбудованих модулів (
intrinsic
), а також самі модулі, напр —iso_fortran_env
; - видимість модульних об'єктів — додано
protected
для видимості модульних об'єктів, додано можливість перейменовувати (невбудовані) об'єкти і сутності модуля (об'єкти даних, похідні типи, інтерфейсні блоки, процедури, узагальнені ідентифікатори та групи списків імен) в специфікаторіuse
, додано твердженняimport
для контролю видимості модульних об'єктів в тіліinterface ... end interface
; - операції читання/запису — асинхронна передача в інструкціях читання/запису (
asynchronous='yes'
) та для оголошених змінних, потоковий доступ, визначені користувачем операції для похідних типів, контроль за округленням в специфікаціїformat
, іменовані константи для відкритих файлових потоків, інструкціяflush
для завершення запису з буферів, регуляризація ключових слів та доступ до повідомлень про помилки; - визначені користувачем операції читання/запису для похідних типів (англ. User-Defined Derived Type Input/Output або UDTIO), що дозволяють розробнику деталізувати, як похідний тип читається з файла та записується в файл з допомогою вбудованих інструкцій
read
таwrite
. Технічно це задається зв'язуванням узагальнених та прив'язаних до типу процедур-інструкційgeneric :: read(formatted) =>X
,generic :: write(formatted)=>Y
,generic :: read(unformatted) => X
,generic :: write(unformatted) => Y
з приватними підпрограмами X та Y з визначеним інтерфейсомX(dtv, unit, iotype, v_list, iostat, iomsg)
; - підтримка IEEE із рухомою комою і обробка винятків (включаючи TR 15580) у вбудованому модулі
ieee_arithmetic
(нові типи, та нові функціїieee_support_underflow_control
,ieee_get_underflow_mode
,ieee_set_underflow_mode
, та багато ін.); - взаємодія з мовою програмування C з допомогою вбудованого модуля
iso_c_binding
, де оголошені іменовані константи для kind параметрів більшості типів мови C (c_int
,c_short
,c_long
,c_long_long
та всі інші цілі типи,c_signed_char
,c_size_t
,c_float
,c_double
,c_long_double
,c_float_complex
,c_double_complex
,c_long_double_complex
,c_bool
,c_char
, а такожc_null_char
,c_backspace
,c_form_feed
,c_new_line
,c_carriage_return
,c_horizontal_tab
,c_vertical_tab
), для вказівників та їх нульових значень (c_ptr
,c_funptr
,c_null_ptr
,c_null_funptr
), а також додаткові процедури (c_loc
,c_funloc
,c_associated
,c_f_pointer
,c_f_procpointer
); додано атрибутbind(c)
для модульних змінних та похідних типів, щоб вони могли бути сумісними зі структурами в мові C; - підтримка інтернаціоналізації: доступ до ISO 10646 4-байтових символів і вибір десяткового знаку чисел під час форматованого читання/запису (
selected_char_kind
); - введення констант в двійковій
b'10001'
, вісімковійo'345'
, та шістнадцятковійz'1234abcd'
системі числення як аргументів до вбудованих функцій (int(),real(),cmplx(),dble()
); - введення квадратних дужок
[...]
як альтернативу для ініціалізації масивів з допомогою конструктора(/.../)
; - розширена інтеграція з основною операційною системою — доступ до аргументів командного рядка, змінні оточення, та повідомлення про помилки процесора з вбудованого модуля
iso_fortran_env
(input_unit
,output_unit
,error_unit
,iostat_end
,iostat_eor
,numeric_storage_size
,character_storage_size
,file_storage_size
), а також додано вбудовані функціїcommand_argument_count
,get_command
,get_command_argument
,get_environment_variable
;
Важливим доповненням у версії Fortran 2003 стала доповідь ISO TR-19767: про розширення модулів в Фортрані. Ця доповідь внесла додатковий submodule
що дозволяє визначення і реалізацію модулів, які можуть описуватись частинами в окремих блоках програми, і дозволяє покращити архітектуру великих бібліотек, полегшує публікацію інтерфейсів, а також запобігає каскадній компіляції.
Fortran 2008
Стандарт ISO / IEC 1539-1:2010, неофіційно відомий як Fortran 2008, було затверджено голосуванням у вересні 2010[7]. Як і Fortran 95, це незначне оновлення, включає роз'яснення та поправки до Fortran 2003, але також додає кілька нових можливостей[8]:
submodule
— замінили ISO / IEC TR 19767:2005;- Coarray Fortran (CAF) — вбудований в мову синтаксис для паралельних обчислень[9];
- конструкція
do concurrent
для розпаралелювання циклів без взаємозалежностей; - атрибут
contiguous
для масивів, які розміщені безперервно одним шматком в оперативній пам'яті та вказівників, котрі на такі масиви вказують і функціюis_contiguous
; - конструкція
block
, всередині якої можна оголошувати нові змінні з локальною межею видимості і котрі можуть бути вкладеними; - рекурсивні динамічні компоненти похідних типів;
- внутрішні вкладені процедури можуть використовуватись як аргументи в інших процедурах
- доступ до дійсної та уявної частини комплексних чисел в «стилі ООП» з допомогою псевдокоманд
%re
та%im
; - створення нової динамічної змінної в
allocate (b, mold=a)
копіюючи розмірність та тип іншої змінної, але без копіювання значень з допомогою нового специфікатораmold
додатково до вже наявногоsource
; також ці специфікатори дозволяється використовувати для одночасного створення кількох змінних; - автоматичне виділення пам'яті змінних під час операції присвоєння, які раніше були задекларовані як
allocatable
; - рекурсивні операції вводу/виводу для будь-яких файлів (на відміну від стандарту 2003, де це дозволялось тільки для внутрішніх файлів)
- специфікатор
newunit
для інструкціїopen
, який автоматично виділяє унікальне ціле число-ідентифікатор для операцій читання та запису; - новий універсальний дескриптор формату
g0.x
- нові вбудовані функції — математичні (
acosh
,asinh
,atanh
,bessel_j0
,bessel_j1
,bessel_jn
,bessel_y0
,bessel_y1
,bessel_yn
,erf
,erc
,erf_scaled
,gamma
,log_gamma
,hypot
,norm2
), маніпуляції з бітами (bge
,bgt
,ble
,blt
,dshiftl
,dshiftr
,iall
,iany
,iparity
,leadz
,popcnt
,poppar
,trailz
,maskl
,masr
,merge_bits
,shiftl
,shiftr
), для паралельної роботи з комасивами (atomic_define
,atomic_ref
,image_index
,lcobound
,num_images
,this_image
,ucobound
), для взаємодії з операційною системою та запуску її командexecute_command_line
, для пошуку в масивахfindloc
, для отримання розміру об'єктів в пам'ятіstorage_size
, - розширення модуля
iso_fortran_env
з допомогою додаткових процедурcompiler_version
таcompiler_options
, які дають за потреби інформацію про компілятор та його опції під час фази компіляції - в модулі
iso_c_binding
доданоc_sizeof
— відповідає операторуsizeof
в мові C.
Остаточний проект міжнародного стандарту (Final Draft international Standard — FDIS) наводиться в документі N1830[10], та технічні доповнення N1903[11] та N1958[12]. Важливим розширенням до Fortran 2008 стало ISO Technical Specification (TS) 29113 щодо взаємодії Фортрану з мовою C[13][14], який був представлено ISO в травні 2012 на затвердження. Специфікація додає підтримку доступу до дескриптора масиву з мови C і дозволяє не звертати уваги на тип і ранг аргументів.
Fortran 2018[15]
Робота над наступним стандартом тривала понад 8 років[16][17]. 1 грудня 2012 затверджено й опубліковано «ISO/IEC TS 29113:2012» Technical Specification (TS29113) щодо взаємодії Фортрану з мовою C[18], 19 листопада 2015 затверджено й опубліковано «ISO/IEC TS 18508:2015 Information technology — Additional Parallel Features in Fortran» щодо розпаралелювання за допомогою комасивів (TS18508)[19]. Офіційне оприлюднення стандарту Fortran 2018, ISO/IEC 1539:2018 відбулося з кількамісячним запізненням[20] 2 грудня 2018 року[21].
Додано такі удосконалення до цього стандарту[22]:
- Значно розширено сумісність мови Fortran з мовою C у зворотному напрямку. Для цього компілятор супроводжується вихідним файлом
ISO_Fortran_binding.h
котрий значним чином розширено у новому стандарті і містить визначення та прототипи, що дозволяють функціям C працювати з об’єктами мови Fortran, і отримувати доступ до всіх їх властивостей. Для цього до файлу додано коди атрибутівCFI_attribute_pointer
,CFI_attribute_allocatable
,CFI_attribute_other
, також типCFI_dim_t
таCFI_type_struct
, що сумісний з похідними типами мови Fortran. Також доданоCFI_MAX_RANK
,CFI_VERSION
та цілий ряд макросів для типів мови C але з точки зору мови Fortran. Додано також функціїCFI_establish
,CFI_setpointer
,CFI_allocate
,CFI_deallocate
, функції для секцій (перерізів) масивівCFI_section
,CFI_select_part
, і функцію адресаціїCFI_address
. Крім того додано функцію перевірки масиву на суцільністьCFI_is_contiguous
та цілий ряд константних кодів для позначення помилок.c_ptrdiff_t
тип додано в модульiso_c_binding
для використання в якості параметра типу, щоб забезпечити взаємодію з типомptrdiff_t
. - Додано поняття передбачуваного рангу
assumed rank
для полегшення взаємодії з функціями C, які були написані для аргументів будь-якого рангу. Фіктивний аргумент, який не є масивом і не має атрибутаvalue
, може бути оголошений з передбачуваним рангом із синтаксисом(..)
Щоб процедура Fortran могла визначити ранг, додано нову внутрішню функціюrank(a)
. Для виконання альтернативного коду в залежності від фактичного рангу об’єкта з припущеним рангом надається конструкціяselect rank .. end select
з селекторамиrank (scalar-int-constant-expr )
,rank (*)
чиrank default
. Додано поняття передбачуваного типуassumed type
, щоб функція C могла приймати аргумент будь-якого типу. Масив із передбачуваним рангом може мати атрибут неперервностіcontiguous
. - Асинхронний атрибут
asynchronous
розширено з застосування вводу-виводу для випадків, що виконується іншими способами, ніж Fortran (напр. MPI). - Значно розширено можливості паралельного програмування з допомогою комасивів. Поняття команди/колективу
team
було введено, щоб дозволити виконувати самостійно окремі набориimages
. Для цього можна використовувати новий типteam_type
із внутрішнього модуляiso_fortran_env
. Створення нової командиteam
задається інструкцієюform team
для вибраних зображень. Зміна команди відбувається з допомогою блоку інструкційchange team .. end team
- Константу
stat_failed_image
додано до модуляiso_fortran_env
, щоб позначати чи отримувати стан про зображенняimage
в станіfailed
. Термінactive
додано для зображенняimage
, яке не знаходиться ані в стані помилки, ані зупинки. - Поняття подій
event
були введені, щоб дозволити не виконувати інструкції до тих пір, поки одна або кілька дій не будуть виконані з іншими зображеннями. Запис про події зберігається у скалярному масиві розширюваного типуevent_type
із внутрішнього модуляiso_fortran_env
і відомий тепер якevent
-змінна . Зображення виконуєevent wait
, якщо йому потрібно затримати інструкції виконання для інших зображень. Кожен викликevent post
має відповідний викликevent wait
, що включає одну й ту саму зміннуevent
. - Для синхронізації було введено
sync team
, щоб дозволити синхронізацію вteam
предка, не виходячи за межі блокуchange team
- Додано внутрішні функції
get_team
,team_number
, а функціїimage_index
,num_images
,this_image
тепер мають три форми аргументів - Внутрішня функція
move_alloc
тепер не єpure
, якщо її аргументи є масивами. - Інструкція
fail image
змушує виконуване зображення отримати статусfailed
. Також додано нові внутрішні процедури для ідентифікації невдалих (failed
) та зупинених (stopped
) зображень:failed_images([ team, kind])
,stopped_images([ team, kind])
,image_status(image[, team])
- Додано внутрішні підпрограми
co_broadcast
,co_max
,co_min
,co_sum
,co_reduce
для виконання колективних операцій над усіма зображеннями команди - Додано дев’ять атомарних підпрограм, і дві старі отримали додатковий аргумент:
atomic_add
,atomic_and
,atomic_or
,atomic_xor
,atomic_fetch_add
,atomic_fetch_and
,atomic_fetch_or
,atomic_fetch_xor
,atomic_cas
- Для відповідності новому стандарту IEEE для арифметики з рухомою комою ISO/IEC/IEEE 60559:2011 було внесено велику кількість змін до внутрішніх вбудованих модулів
ieee_arithmetic
,ieee_exceptions
таieee_features
. - Змінено доступність за замовчуванням для об'єктів, до яких здійснюється доступ із модулів. Розширено можливості посилання на властивість об’єкта у константних виразах. Додано універсальні дескриптори форматування виводу
d0.d, e0.d, es0.d, en0.d, g0.d and ew.de0
Додано нову елементарну внутрішню функціюout_of_range
, щоб перевірити чи дійсне/ціле значення можна безпечно перетворити на інший дійсний чи цілийtype
таkind
. Додано нову трансформаційну внутрішню функціюreduce
для звичайного масиву, яка відповідає колективній підпрограміco_reduce
для комасивів . Додано внутрішню функціюcoshape
. - У Fortran 2008 були виявлені проблеми із використанням підпрограми генератора випадкового числа
random_number
. Fortran 2018 вимагає, щоб кожне зображення мало свійseed
для ефективності, і для управління ініціалізацієюseed
було додано внутрішню підпрограмуrandom_init
- Вираз імпорту, що використовується у вбудованій підпрограмі або конструкції блоку для управління асоціацією, тепер має нові форми:
import, only: import-name-list
,import, none
,import, all
- Видалено застарілу інструкцію
arithmetic if
Особливості та можливості
Можливості та переваги походять зі сфери застосування цієї мови (наука, інженерія, та високошвидкісні, паралельні обчислення):
- проста у використанні, стандартизована мова (граматика і синтаксис наближені до англійської мови та математичних формул);
- багато загальних операцій організовано на вищому рівні, ніж це зроблено в C чи C++, і це дає можливість писати коротший і зрозуміліший код;
- рядки символів це об'єкти першого класу і операції з рядками символів є надзвичайно простими і зрозумілими;
- операції введення/виведення простіші і організовані переважно як інструкції а не як процедури чи функції;
- використання модулів та інтерфейсів дозволяє кращу діагностику на етапі компіляції;
- менше використання вказівників у коді та високорівневий доступ до пам'яті роблять код безпечнішим;
- вказівники впроваджені таким чином, що компілятору надзвичайно просто ідентифікувати їх і неправильне їхнє використання;
- мало «винятків з правил» чи непередбачуваної поведінки компіляторів відповідно до стандарту;;
- в середньому гарна діагностика від компіляторів, тому початківець отримує багато підказок
- операції з комплексними числами та числами підвищеної точності;
- багато вбудованих функцій з автоматичним вибором точності та типу (такі функції дуже добре оптимізуються);
- вбудована підтримка операцій з багатомірними масивами як ціле, і з вибірками (окремо, і в інструкціях, напр. вибору
select case
); - підтримка одного рівня «вкладених функцій» (англ. nested function) за допомогою
contains
; - індекси масивів можуть бути будь-які цілі числа (від'ємні також);
- дуже гарна підтримка операцій читання/запису (форматованого, асинхронного та ін);
- спеціальний синтаксис для розпаралелювання обчислень за допомогою комасивів Coarray Fortran;
- стандартна (найшвидша) передача змінних за посиланням (by reference) як параметрів у функціях та підпрограмах;
- краща (загалом) оптимізація коду, що позитивно впливає на швидкодію програм та більш оптимізовані математичні обчислення;
- порядок математичних операцій визначено абсолютно точно і також контролюється дужками;
- нечутливість до регістру дозволяє уникати помилок при неправильному записі «КоНстаНт» та «ЗміНниХ»;
- всі слова мови ключові, але не зарезервовані, що додає певний додатковий простір вибору назв змінних;
- принцип «одна інструкція на рядок коду» загалом додає стабільності програмам (однак можна використовувати крапку з комою для запису двох і більше інструкцій в рядку);
- Перевантаження стандартних операторів та розширення набору операторів за допомогою створення нових дозволяє писати програми максимально наближеними до складних математичних формул[23][24][25][26][27].
Основні можливості об'єктно-орієнтованого програмування додали до стандарту Fortran 90. Починаючи зі стандарту Fortran 2003, мова отримала повний набір можливостей, що дозволяють класифікувати її як об'єктно-орієнтовану мову програмування: інкапсуляцію та модульність; успадкування; прив'язані до типів процедури; поліморфізм; вказівники на процедури; абстрактні типи даних. Також сучасний стандарт частково дозволяє використовувати функційну парадигму програмування з допомогою pure
та elemental
функцій, рекурсії та функцій вищого порядку (як аргумент, результат та з одним рівнем вкладених функцій),- однак без замикань (closures), анонімних функцій (лямбда-функцій) та часткового застосування.
Компілятори
Основні, широковідомі компілятори, та такі, що розвиваються:
- G77
- GNU gfortran
- Intel ifort
- Absoft Fortran
- Lahey Fortran
- g95
- NVIDIA HPC SDK[28]
- NAG Fortran Compiler
- Silverfrost FTN95 для Windows
- Oracle f90 (раніше входив до Sun Studio)
- MS/Compaq/Dec FORTRAN
- IBM XL Fortran
- Open64 Fortran
- Open Watcom fortran
- PathScale Fortran Compiler
Всі названі компілятори значно відрізняються між собою рівнем підтримки сучасних стандартів фортрану. Деякі з них зупинилися на версії Fortran 90, чи Fortran 95, а деякі завершують імплементацію нововведень останніх стандартів Fortran 2003/2008[29][30] (GNU gfortran[31][32][33], INTEL ifort, PGI pgfortran, NAG Fortran Compiler[34]). Більшість з цих компіляторів є комерційними, однак GNU gfortran, g95 та Open64 випускаються під публічними відкритими ліцензіями. В листопаді 2015 NVIDIA, Національна Адміністрація ядерної безпеки США (NNSA) та інші три національні лабораторії оголосили про початок розробки нового відкритого компілятора Фортран для суперкомп'ютерів на базі архітектури LLVM[35][36][37]
Бібліотеки
Фортран дозволяє скористатись дуже багатьма зразками наявного сумісного і перевіреного коду різноманітних математичних бібліотек, а також спеціалізованого коду з усіх галузей науки та техніки[38]. Дуже широко розвинутими є напрямки математичних бібліотек та спеціалізовані алгоритми з чисельних методів[39]. Найбільш відомі загальні математичні бібліотеки для роботи в Fortran це комерційні NAG, MKL, IMSL, та з публічними ліцензіями: netlib.org[40], TOMS алгоритми[41], BLAS[42], LAPACK[43], ScaLAPACK[44], SLATEC[45], GSL разом з FGSL[46], SPHEREPACK[47], FISHPACK90[48], FFTPACK5[49], CERNLIB[50] та ін.
Проблеми
Більшу частину коду на фортрані почали розробляти ще до затвердження стандарту Fortran 90 і тому він часто містить в собі всі недоліки попередніх стандартів (фіксований код, нестандартні розширення, погану структурованість, незрозумілі назви змінних, статичне виділення пам'яті, проблеми з багатонитевою безпекою та інше). Дуже мало старих бібліотек переписувалось за новими стандартами. Додавати такий код в сучасні проекти не проблема, але проблеми часто виникають, коли в коді цих бібліотек необхідно щось змінити.
В фортрані майже[51] відсутні бібліотеки з узагальненими алгоритмами для роботи з різноманітними типами даних. Також немає достатньої кількості зразкового коду, що використовує об'єктно-орієнтовану модель, шаблони проектування[52] та роботу з узагальненими типами даних. Звичайно це пояснюється низькою потребою в такому коді в тих галузях, де використовується Фортран.
Сумісність
Зі стандартом 2003—2008 значно покращилась сумісність та можливість взаємодії бібліотек та програм на C та Фортрані. Тому на даний час можна безпосередньо писати звичайний інтерфейс для використання потрібних бібліотек, що написані мовою C. Це використовується наприклад в FGSL[46] — інтерфейсі до GNU Scientific Library. В деяких випадках можна згенерувати такий інтерфейс автоматично[53]. Багато фірм-розробників компіляторів додають також інші нестандартні додаткові функції: в gfortran — у вигляді GNU extension функцій, або ж як в intel ifort у вигляді додаткового модуля-бібліотеки «intel portability library», котра підключається з допомогою інструкції USE IFLPORT[54].
Графічні інтерфейси
Для програмування графічних інтерфейсів на Фортрані також можна виділити кілька відомих бібліотек, що дозволяють відносно швидку реалізацію ГІК, чи візуалізувати дані у вигляді різноманітних графіків: gtk-fortran[53], QuickWin[55], Winteracter[56], DISLIN[57], GINO[58], PLPLOT[59], GrWin[60], f90gl[61], JAPI[62], PGPLOT[63], g2[64], MathGL[65], f03gl[66], gnufor2[67], gnuplotfortran[68], ogpf[69].
Автоматизовані CASE-засоби розробки ПЗ на Fortran
Інтегровані середовища розробки для Fortran
Розробку ПЗ на Fortran підтримують наступні ІСР: Eclipse з встановленим Eclipse Parallel Tools Platform (PTP), Code::Blocks, NetBeans, Geany, Oracle Developer Studio, Simply Fortran від Approximatrix[78], IntelliJ IDEA за наявності додатка[79], Atom з додатком ide-fortran, та інші.
Критика
- Критика, пов'язана з незнанням сучасних стандартів Фортрану
Спеціалісти, котрі стикалися з ним кілька десятків років тому, тобто щонайбільше зі стандартом Fortran 77 уявляють Фортран кодом у фіксованому форматі зі скороченими (чи обрізаними) іменами змінних, з неявною типізацією, статичним виділенням пам'яті та надзвичайно перевантаженим використанням інструкції безумовного переходу goto
. Незважаючи на те, що такий код дійсно підтримується майже всіма компіляторами, в сучасному Фортрані це архаїзм і більше не використовується в нових проектах.
- Критика та суперечки щодо того, яка мова програмування (точніше компілятор) дає більш оптимізований за швидкодією код
Внаслідок довготривалого розвитку та орієнтації мови Фортран на чисельне математичне програмування, компілятори мають дуже високий рівень оптимізації. Тому дискусія зводиться переважно до суперечки: швидше C чи Фортран. Компілятори для програми на C++ з використанням шаблонів та метапрограмування можуть також позмагатися у швидкодії з Фортраном, однак зневадження коду на C++, що використовує такий підхід та супроводження і модифікація є надзвичайно складними і затратними. Загалом швидкодія програм написаних на Фортрані та на C є приблизно однакова.
- Критика пов'язана з неправильною інтерпретацією сфери застосування
Фортран має достатньо вузьку нішу застосування, що часто використовується критиками при порівнянні з іншими мовами широкого профілю такими як C чи C++. Однак Фортран не призначено для системного чи низькорівневого програмування.
- Критика (справедлива) про недоліки мови Фортран та компіляторів
- Немає бібліотек з універсальними алгоритмами для роботи зі складними структурами даних на кшалт STL чи Boost в C++. Всі відомі та широковживані контейнери (дерева, черги, купи, таблиці, стеки, зв'язані списки ітд.) винаходяться щоразу майже[80] заново.
- Недостатня підтримка основними компіляторами останнього стандарту[29][30]
- В стандарті мови відсутні деякі відомі з інших мов вбудовані прості типи, наприклад беззнакові цілі (невід'ємні) числа, а це зазвичай ускладнює створення алгоритмів з бітовою арифметикою.
- Узагальнене програмування для похідних типів хоча і є в стандарті, але на практиці реалізація виявляється складною. Шаблони для різних типів, як в C++ відсутні[80]. Відсутність механізму використання шаблонів у Фортрані порівняно з C++ є однією з основних вад в контексті використання мови в об'єктно-орієнтованому програмуванні.
- Компілятори загалом несумісні з ABI (англ. Application Binary Interface) тобто на рівні двійкового коду, а це ускладнює поширення готових бібліотек.
- Немає звичного вбудованого механізму обробки винятків, як в інших мовах і тому неможливо реагувати програмно на виняткові ситуації. Існує підтримка винятків для IEEE арифметики з рухомою комою та для інструкцій
read
іwrite
. - Дещо обмежене поняття вказівника — наприклад для створення масиву вказівників потрібно використовувати окремий похідний тип з компонентом-вказівником всередині і потім створювати масив таких об'єктів-вказівників.
- Ієрархічна модель простору імен (по аналогії до
namespace
в C++) — у Фортрані відсутня і до версії Fortran 2008 це створювало незручності для організації ієрархії коду та її компіляції. Зазвичай перший рівень простору імен забезпечувався модулями з певним рівнем видимості для змінних (вживаючи відповідні інструкціїprivate
чиpublic
для певних змінних) або ж обмежуючи видимість сутностей в модулі за допомогоюuse module_name, only: some_variable
. Популярним також було безпосереднє додавання префіксів для кожної змінної в певному модулі, чи створення нового модуляzz_module_name
в котрому робили перейменування всіх видимих змінних:use module_name, x=>zz_x
. Ієрархію простору імен можна також симулювати декларуванням похідних типів, котрі в свою чергу містять наступні типи, однак такий спосіб не вирішує повністю проблем розділення видимості (наприклад при розпаралелюванні програми з такими типами). Починаючи зі стандарту Fortran 2008, задача локалізації видимості об'єктів та змінних навіть в межах одного модуля вирішується з використанням ієрархії на основіsubmodule
, оскільки інші субмодулі певного модуля типово не мають доступу до об'єктів, які оголошені локально в кожному з цих субмодулів[81]. Субмодуль може мати тільки один предок-модуль та ієрархію предків-субмодулів. Використовуючи видимість та ієрархію за допомогою субмодулів двох окремих модулів можна легко добратись навіть перехресно до об'єктів та сутностей, оголошених в кожному з цих модулів, — субмодуль модуля А може використовувати об'єкт з модуля Б, а субмодуль модуля Б в свою чергу використовує об'єкт модуля А (що без субмодулів явно заборонено і викликає помилку циркулярної взаємозалежності модулів А та Б під час компіляції). - Код на Фортрані, хоча й в меншій мірі, але як і в C чи C++, може містити серйозні уразливості щодо безпеки, які не завжди виявляють компілятори: переповнення цілочисельного буферу, висячі вказівники та ін[82].
Приклади
Програма ілюструє динамічне виділення пам'яті та операції з масивами; необхідно відзначити відсутність явних циклів та математичні операції з масивами як ціле. Цей приклад обчислює середнє арифметичне з даних, введених інтерактивно:
program average
! обчислення середнього арифметичного для заданих чисел
! якщо немає вводу, повертаємо нуль
! така поведінка обрана для спрощення коду
implicit none
real, dimension(:), allocatable :: points
integer :: number_of_points
real :: average_points=0., positive_average=0., negative_average=0.
write (*,*) "Input number of points to average:"
read (*,*) number_of_points
allocate (points(number_of_points))
write (*,*) "Enter the points to average:"
read (*,*) points
! Обчислити середнє
if (number_of_points > 0) average_points = sum(points) / number_of_points
! Зараз середнє для додатних чи від'ємних чисел
if (count(points > 0.) > 0) then
positive_average = sum(points, points > 0.) / count(points > 0.)
end if
if (count(points < 0.) > 0) then
negative_average = sum(points, points < 0.) / count(points < 0.)
end if
deallocate (points)
! вивести результат в терміналі
write (*,'(a,g12.4)') 'Average = ', average_points
write (*,'(a,g12.4)') 'Average of positive points = ', positive_average
write (*,'(a,g12.4)') 'Average of negative points = ', negative_average
end program average
Наступна програма використовує можливості розпаралелювання з допомогою комасивів (використовуються можливості з TS18508[19]):
program hello_world
implicit none
character(len=20) :: name[*] ! скалярний комасив, одне name для кожного image
! тобто: "name" це локальна змінна а "name[<index>]" надає доступ
! до копії цієї змінної в конкретному image; "name[this_image()]" те ж саме, що і "name".
! взаємодія з користувачем в image 1; виконання всіх інших проходить без переривання.
if (this_image() == 1) then
write(*,'(a)',advance='no') 'enter your name: '
read(*,'(a)') name
end if
! розсилання інформації в змінній name з image 1 всім іншим відображенням
call co_broadcast(name,source_image=1)
! виведення з усіх відображень виконуються в довільному порядку, але кожна інструкція write завершується повністю
write(*,'(3a,i0)') 'hello ',trim(name),' from image ', this_image()
end program hello_world
Гумор
Впродовж багатьох років існування та розвитку в розробників стали поширеними саркастичні жарти та специфічний фольклор щодо Фортрану.
- Відомий експерт професор Едсгер Дейкстра 1975 сказав[83]: «Фортран страждає від дитячої хвороби — на даний час вже існує майже 20 років і є безнадійно неадекватний для розробки будь-якої комп'ютерної програми, котра вам спаде на думку сьогодні: він занадто незграбний, занадто ризикований і обходиться занадто дорого у використанні». А також: «У старі добрі часи фізики відтворювали експерименти інших фізиків, просто щоб бути впевненими. Сьогодні вони вчепилися за Фортран, бо можуть просто поділитися один з одним програмами, включно з усіма помилками в коді».
- Знавець Unix i BSD, Дон Сілей, (англ. Donn Seeley) написав[84] роздуми на тему: «Як не писати на Фортрані будь-якою мовою програмування». Як наслідок, набув значного поширення вислів «ви можете програмувати на Фортрані, використовуючи будь-яку мову».
- Кен Томпсон у статті «Reflections on Trusting Trust» сказав: «Фортран вибирають з тієї самої причини, з якої є популярними змагання з бігу зі зв'язаними ногами».
- В Sun FORTRAN Reference Manual стверджувалось: «систематичний поділ слів прогалинами став загальною звичкою близько десятого століття нашої ери і це тривало приблизно до 1957 року, коли у мові FORTRAN відмовилися від цієї практики».
- Алан Перліс: «FORTRAN — не квітка, а бур'ян: витривалий, іноді цвіте, але виростає в кожному комп'ютері»; «ви можете виміряти перспективність програміста, дізнаючись про його ставлення до (дивної) триваючої життєздатності мови FORTRAN»; «хоча китайці повинні обожнювати APL, вони вкладають свої гроші чомусь до ФОРТРАНУ»; «протягом багатьох століть навіть древні індіанці різних племен розробили спільну мову жестів для спілкування та пояснення явищ, що являють певний обопільний інтерес. Програмісти з різних племен (FORTRAN, LISP, Алгол, SNOBOL та інших) могли б також навчитись якоїсь однієї мови, яка б не вимагала від них возити за собою шкільну дошку на своїх поні, щоб порозумітися».
- Стівен Фейнер (англ. Steven Feiner): «ви можете сказати, як далеко нам ще потрібно пройти, якщо FORTRAN — це зараз у нас мова для суперкомп'ютерів.»
- Unix програма fortune видає таку «мудрість»: «комп'ютер без COBOLа та FORTRANа — це як шматочок шоколаду без кетчупу та гірчиці»
- Під час засідання комітету затвердження стандарту FORTRAN 77 була внесена технічна пропозиція під назвою «Літера О розглядається як небезпечна». В ньому містилось пояснення, що оскільки літера О подібна до цифри 0, то необхідно заборонити вживання літери О в наступному стандарті в іменах змінних та видалити її з дозволених символів. Це допоможе уникати помилок, а також сприятиме кращій структуризації програм (роблячи неможливим використання горезвісного
goto
). Небезпечну інструкціюformat
теж буде нейтралізовано. Відзначалося, що це «може зробити деякі наявні програми неробочими», але більшість з них «ймовірно, були несумісними зі стандартом так чи інакше ще раніше.» - В «FORTRAN manual for Xerox computers» був такий абзац: «Основною метою інструкції
data
є називання констант: замість посилання щоразу на π як +3,141592653589793 змінній π може бути надане це значення і використовуватись на заміну числової форми постійно. Це також спрощує модифікацію програми в тому випадку, коли значення π раптом зміниться». - FORTRAN — це не мова програмування. Це спосіб перетворити мейнфрейм, що коштує багато мільйонів, в програмований науковий калькулятор за 50$.
Примітки
- До версії Fortran 90 всі ключові слова мали писатися великими літерами. Починаючи з версії Fortran 90 назву мови FORTRAN офіційно почали писати як Fortran.
- Найбільш відомий комплекс програм для моделювання та прогнозу погоди у відкритому доступі: The Weather Research and Forecasting (WRF) Model (National Center for Atmospheric Research, USA) Архівовано 17 червня 2015 у Wayback Machine.(англ.)
- The NAS Parallel Benchmarks (NPB) від NASA
- CPU™ 2006[недоступне посилання з липня 2019]
- McCracken, Daniel D. (1965). Preface. A Guide to FORTRAN IV Programming. New York: Wiley. с. v. ISBN 0-471-58281-6.
- огляд нових можливостей Fortran 2003 на офіційному сайті робочої групи Фортран. Fortran Working Group (WG5). Завантажити як PDF file
- N1836, Summary of Voting/Table of Replies on ISO/IEC FDIS 1539-1, Information technology — Programming languages — Fortran — Part 1: Base language ftp://ftp.nag.co.uk/sc22wg5/N1801-N1850/N1836.pdfPDF ( 101 KiB)
- John Reid, The new features of Fortran 2008, JKR Associates, UK. May 6, 2009[недоступне посилання з липня 2019](англ.)
- станом на квітень 2016 кілька комерційних компіляторів (Cray, Intel) підтримували це нововведення, також створено суспільний проект з відкритим джерельним кодом OpenCoarrays, який забезпечує підтримку двійкового інтерфейсу (ABI) coarray Fortran (CAF) в GFortran
- N1830, Information technology — Programming languages — Fortran — Part 1: Base language http://j3-fortran.org/doc/standing/links/007.pdfPDF ( 7.9 MiB)
- Technical corrigendum 1 [недоступне посилання з липня 2019]
- Technical corrigendum 2[недоступне посилання з липня 2019]
- ISO page to ISO/IEC DTS 29113, Further Interoperability of Fortran with C
- Draft of the Technical Specification (TS) 29113 ftp://ftp.nag.co.uk/sc22wg5/N1901-N1950/N1917.pdfPDF ( 312 kiB)
- Fortran 2015 > Fortran 2018, Fortran 2020 > Fortran 202x
- JTC1/SC22/WG5
- Doctor Fortran Goes Dutch: Fortran 2015
- TS 29113 Further Interoperability of Fortran with C[недоступне посилання з липня 2019]
- TS18508, Additional Parallel Features in Fortran — ISO чорновик (2013)[недоступне посилання з червня 2019], N2074, вільнодоступний чорновик з iso.org, (2015)
- Doctor Fortran in «One Door Closes», 21 вересня 2015(англ.)
- Fortran 2018 на веб-сторінці JTC1/SC22/WG5
- Reid J. The new features of Fortran 2018(англ.)
- Damian Rouson et al. This Isn't Your Parents' Fortran: Managing C++ Objects with Modern Fortran, Comput. Sci. Eng. 14, 46 (2012)
- Damian Rouson, Jim Xia, Xiaofeng Xu, Scientific Software Design: The Object-Oriented Way, Cambridge University Press, 2011 ISBN 9781139498784
- Magne Haveraaen et al. High-Performance Design Patterns for Modern Fortran, Scientific Programming, Volume 2015 (2015), див. також 1, 2
- Ed Akin, Object-Oriented Programming Via Fortran 90/95, Cambridge University Press, 2003 ISBN 9780521524087
- Markus A., Metcalf w.M. Modern Fortran in practice, Cambridge University Press 2012 ISBN 9781107017900
- набір компіляторів (включаючи nvfortran) та спеціалізованих бібліотек, які дозволяють розробникам програмувати для HPC платформ, базованих на GPUs та CPUs. Раніше це був набір компіляторів від Portland Group, Inc, однак в червні 2013 NVIDIA Corporation придбала цю компанію і зараз це окремий підрозділ NVIDIA. З того часу набір компіляторів поширювався у версії "PGI Community Edition", включно з компілятором фортрану. Зараз NVIDIA HPC SDK надається NVIDIA під безкоштовною ліцензією.
- Compiler Support for the Fortran 2003 Standard(англ.)
- Compiler Support for the Fortran 2008 Standard(англ.)
- Chart of Fortran 2003 Features supported by GNU Fortran
- Chart of Fortran 2008 Features supported by GNU Fortran
- Chart of Fortran TS 29113 Features supported by GNU Fortran
- What's New in Fortran 2008. Архів оригіналу за 23 квітня 2015. Процитовано 2 листопада 2015.
- NNSA, national labs team with Nvidia to develop open-source Fortran compiler technology(англ.)
- Flang: Developing an open source Fortran front-end for LLVM, ARM HPC User Group 2016, Doug Miles, PGI Compilers & Tools, NVIDIA Corporation, 14 November, 2016. Архів оригіналу за 15 серпня 2017. Процитовано 15 серпня 2017.
- flang on github.com
- нaприклад Computer Physics Communications Program Library — колекція понад 3000 програм журналу Computer Physics Communications з обчислювальної фізики та хімії
- Список чисельних бібліотек на фортрані (англ.)
- Netlib колекція математичнного ПЗ (більшість з якого написано фортраном)
- Software associated with papers published in the Transactions on Mathematical Software(англ.)
- Basic Linear Algebra Subprograms
- LAPACK — Linear Algebra PACKage
- ScaLAPACK — Scalable Linear Algebra PACKage
- SLATEC Common Mathematical Library
- FGSL: A Fortran interface to the GNU Scientific Library
- SPHEREPACK — A Package for Modeling Geophysical Processes
- FISHPACK90 — Efficient FORTRAN Subprograms for the Solution of Separable Elliptic Partial Differential Equations
- FFTPACK — A Fortran77 library of fast Fourier transforms
- CERN Program Library
- FLIBS — A collection of Fortran modules
- Реалізація популярних шаблонів проектування в Фортрані
- Fortran 95 GTK+ Interface Modules
- Portability Library Routines
- Intel Fortran QuickWin library Графічна бібліотека поставляється з Intel Visual Fortran (раніше Compaq Visual Fortran) тільки для MS Windows.
- Winteracter Winteracter Графічний інтерфейс і засоби візуалізації. Мультиплатформне власницьке ПЗ.
- DISLIN закрита графічна бібліотека для відображення даних у вигляді графіків, гістограм, кругових діаграм, 3D-кольорових ділянок, поверхонь, контурів і карт, створена в Max Planck Institute for Solar System Research. Мультиплатформна і для багатьох компіляторів. Безкоштовна для некомерційного використання.
- GINO Графічний інтерфейс і засоби візуалізації. Мультиплатформне власницьке ПЗ.
- PLPLOT Бібліотека для наукових графіків. Мультиплатформна, вільне програмне забезпечення під ліцензією LGPL.
- GrWin Графічна бібліотека для Windows, безкоштовна для некомерційного використання.
- f90gl Надає Fortran 90 інтерфейс до OpenGL, GLU і GLUT. Мультиплатформна. Працює з багатьма компіляторами. Ліцензія: суспільне надбання.
- JAPI Графічна бібліотека на JAVA і C, що забезпечує доступ до JAVA AWT Toolkit для C, Fortran, Pascal і Basic. Мультиплатформна, вільне програмне забезпечення під ліцензією LGPL.
- PGPLOT Графічна бібліотека, мультиплатформна, безкоштовна для некомерційного використання.
- g2 graphical library Архівовано 17 серпня 2012 у Wayback Machine. Мультиплатформна графічна бібліотека, вільне програмне забезпечення під ліцензією LGPL.
- MathGL Мультиплатформна графічна бібліотека, надає інтерфейс для багатьох мов програмування, зокрема для Фортрану, вільне програмне забезпечення
- f03gl Бібліотека забезпечує інтерфейс версії Fortran 2003 до бібліотеки OpenGL, GLU і GLUT, вільне ПЗ, ліцензія GPL3
- gnufor2 — модуль, написаний версією Fortran 90, надає інтерфейс до Gnuplot ПЗ
- gnuplotfortran бібліотека надає також контроль сеансу Gnuplot з коду на Fortran 95.
- ogpf бібліотека для сеансу Gnuplot з коду на Fortran 2003/2008.
- CamFort: Automated evolution and verification of computational science models
- Fortran Analysis and Refactoring with plusFORT
- Refactoring in Photran
- Forcheck, a Fortran source code analyzer and programming aid
- Understand™ Static Code Analysis Tool
- Cleanscape FortranLint
- ftnchek, a static analyzer for Fortran 77 programs. Архів оригіналу за 17 серпня 2016. Процитовано 23 вересня 2016.
- ForUML на github.com, ForUML
- Simply Fortran
- Fortran language plugin for IntelliJ Idea
- див. однак: BlockIt and PyF95++: Fortran templating and pre-processing(англ.)
- Fortran Wiki, Submodules(англ.)
- Document: WG 23/N0442, ISO/IEC JTC1/SC22/WG5 N1965, Fortran Annex to TR 24772, Guidance to Avoiding Vulnerabilities in Programming Languages through Language Selection and Use, ISO/IEC JTC1/SC22/WG5(англ.)
- Dijkstra, Edsger W. (18 червня 1975). Як ми подаємо правду, що є болючою? (англ.).
- Donn Seeley, How Not to Write Fortran in Any Language
Стандарти мови Fortran
- Ansi x3.9-1966. USA Standard FORTRAN. American National Standards Institute. Архів оригіналу за 15 травня 2011. Процитовано 15 травня 2016. (FORTRAN 66)
- Ansi x3.9-1978. American National Standard – Programming Language FORTRAN. American National Standards Institute. Архів оригіналу за 29 жовтня 2013. Процитовано 15 травня 2016. (FORTRAN 77)
- ANSI X3.198-1992 (R1997) / ISO/IEC 1539:1991. American National Standard – Programming Language Fortran Extended. American National Standards Institute / ISO/IEC. (Fortran 90)
- ISO/IEC 1539-1:1997. Information technology – Programming languages – Fortran – Part 1: Base language. Архів оригіналу за 18 серпня 2011. Процитовано 15 травня 2016. (Fortran 95)
- ISO/IEC 1539-1:2004. Information technology – Programming languages – Fortran – Part 1: Base language. (Fortran 2003)
- ISO/IEC 1539-1:2010 (Final Draft International Standard). Information technology – Programming languages – Fortran – Part 1: Base language (чорновик J3/18-007r1, F2018 Interpretation Document, назва оригінального документу: N1830.pdf).(Fortran 2008)
Література
- Ray, Subrata (2019). Fortran 2018 With Parallel Programming (англійська) (вид. 1). CRC Press. с. 654. ISBN 9780367218430.
- Chapman, Stephen J. (2017). Fortran for Scientists and Engineers (англійська) (вид. 4). McGraw-Hill. с. 1056. ISBN 9780073385891.
- Metcalf, M.; Reid, J.; Cohen, M. (2011). Modern Fortran Explained. Numerical Mathematics and Scientific Computation (англійська) (вид. 4). Oxford University Press. с. 512. ISBN 9780199601417.
- Clerman, Norman S.; Spector, Walter (2011). Modern Fortran: Style and Usage (англійська) (вид. 1). Cambridge University Press. с. 352. ISBN 9780521730525.
- Markus, Arjen (2012). Modern Fortran in Practice (англійська) (вид. 1). Cambridge University Press. с. 272. ISBN 9781107603479.
- Chapman, Stephen J. (2007). Fortran 95/2003 for Scientists and Engineers (англійська) (вид. 3). McGraw-Hill. с. 974. ISBN 9780073191577.
- Adams, Jeanne C.; Brainerd, Walter S.; Hendrickson, Richard A.; Maine, Richard E.; Martin, Jeanne T. (2008). The Fortran 2003 Handbook: The Complete Syntax, Features and Procedures (англійська) (вид. 1). Springer. с. 712. ISBN 9781846283789.
- Chivers, Ian; Sleightholme, Jane (2015). Introduction to Programming With Fortran: With Coverage of Fortran 90, 95, 2003, 2008 and 77 (англійська) (вид. 3). Springer International Publishing. с. 674. ISBN 9783319177007.
- Hanson Richard J.; Hopkins Tim (21 листопада 2013). Numerical Computing with Modern Fortran (англійська). SIAM. ISBN 9781611973129.
- Brainerd W.S. (2009). Guide to Fortran 2003 programming (англійська) (вид. 1). Springer. с. 367. ISBN 9781848825420.
- Brainerd W.S. (2015). Guide to Fortran 2008 Programming (англійська) (вид. 2). Springer. с. 408. ISBN 9781447167594.
- Немнюгин, Сергей; Стесик, Ольга (2004). Современный Фортран. Самоучитель (російська) (вид. 1). BHV. с. 496. ISBN 5941573022.
- Бартеньев, О. В. (2005). Современный Фортран (російська) (вид. 1). Диалог-МИФИ. с. 560. ISBN 5864041130.
Див. також
- photran — Інтегроване середовище розробки для мови Fortran на основі відкритої IDE Eclipse[1]
- 9548 Фортран — астероїд, названий на честь мови програмування[2].
Примітки
- Photran — An Integrated Development Environment and Refactoring Tool for Fortran
- Lutz D. Schmadel, International Astronomical Union. Dictionary of Minor Planet Names. — 5-th Edition. — Berlin Heidelberg New-York : Springer-Verlag, 2003. — 992 с. — ISBN 3-540-00238-3.
Посилання
- Фортран-Wiki (англ.)
- Збірка рецептів та порад для написання програм на сучасному Фортрані (англ.)
- Зразки коду на Фортрані від rosettacode.org (англ.)
- Колекція програм та бібліотек на фортрані для чисельного аналізу (англ.)
- Корисні додатки, бібліотеки та програми від Алана Міллера на Фортрані (англ.)
- Зібрання корисних посилань на ресурси по Фортрану та компіляторах (англ.)
- Зібрання корисних посилань на ресурси по Фортрану: Michel Olagnon's Fortran 90 List (англ.)
- Структуроване зібрання інформації про комерційні компілятори на polyhedron.com (англ.)
- Різноманітна інформація по Фортрану та ресурсах на fortranplus.co.uk (англ.)
- Fortran 90 Reference Card (англ.)
- Илья Чернов, Fortran-2008. Язык для эффективных расчетов. Palmarium Academic Publishing, (2012), 124 c (рос.)
- Ед Йоргенсен, Вступ до програмування за допомогою Fortran 95/2003/2008 (англ.)
- PGI Fortran Reference Guide — Посібник від Portland Group для Fortran 77-2003 (англ.)
- Intel® Fortran Compiler 16.0 Update 2 User and Reference Guide — Опис мови Fortran 90-2008 та компілятора ifort від Intel (англ.)