Фортран |
Fortran | |
---|---|
![]() | |
![]() | |
декілька: | |
Дата появи: | 1957 |
Творці: | |
Розробник: | |
сильна, | |
Основні реалізації: | Absoft, |
Під впливом від: | Speedcoding |
Вплинула на: | ALGOL 58, |
Звичайні | .f , .for , .f90 , .f95 |
Just Solve the File Format Problem | FORTRAN |
![]() |
Фортран (Fortran) (раніше FORTRAN — скорочення від «The IBM Mathematical Formula Translating System», тобто «Система трансляції математичних формул від
Фортран як мова розвивався стабільно і навіть консервативно. Кожен наступний стандарт був створений в результаті тривалої дискусії між виробниками компіляторів та зацікавленими експертами. Завдяки цьому, кожна з версій, що розвивалася, зазвичай додавала тільки розширення мови, одночасно зберігаючи при цьому сумісність з попередніми версіями (однак були і винятки). Версія Fortran 77 додала підтримку для обробки символьних даних; операції з
Особливістю мови Fortran є вже те, що з розвитком вона змінила навіть свою назву, відображаючи той факт, що до версії Fortran 90 всі ключові слова повинні були бути написані великими літерами. Це змінилось в Fortran 90 і починаючи з цієї версії мову FORTRAN офіційно стали називати Fortran.
В кінці 1953 року
До появи дисків та файлів, текстових редакторів та терміналів, програми найчастіше вводили за допомогою перфокарт на клавіатурі перфоратора на 80 знаків. Тобто, в результаті колода карт подавалася в спеціальний «кард-рідер» ЕОМ для компіляції. Тому оригінальний код ФОРТРАНу був в фіксованому форматі завдовжки 80 символів (стовпчиків). Не підтримувалась
IBM, FORTRAN II з'явився в 1958 році. Основними поліпшеннями були підтримка процедурного програмування, тобто підпрограми і функцій з параметрами, що передавалися за посиланням (by reference). Для підпрограм надали можливість доступу до глобальних змінних.
IBM також розробила FORTRAN III в 1958 році, що дозволяв писати на асемблері в функціях, однак цю версію так і не випустили на ринок як готовий продукт.
Для машини IBM 1401 було створено інноваційний на той час 63-прохідний компілятор Фортрану, який поміщався всього у 8-кілобайт. Він зберігав код програми в пам'яті та одночасно поступово транслював її на машинну мову — тобто це був перший в світі інтерпретатор мови програмування. Наступний інтерпретатор (мови
Починаючи з 1961 року, в результаті вивчення потреб клієнтів, компанія IBM розпочала розробку версії FORTRAN IV, в якому були видалені машинно-залежні особливості FORTRAN II (такі як READ INPUT TAPE), а додано багато нових елементів, таких як: логічний тип даних, логічні операції та логічний IF як альтернативу арифметичному IF. FORTRAN IV випустили в 1962 році, спочатку для комп'ютерів
Мабуть, найбільш значною подією в ранній історії FORTRAN стало рішення Американської асоціації стандартів (ANSI зараз) сформувати комітет для розробки «американського стандарту Фортрану». Fortran 66 в березні 1966 року фактично став першою «стандартною для індустрії» версією FORTRAN. В Fortran 66 входили дуже багато удосконалень: main program, subroutine
, function
, та block data
програмні одниниці; типи integer
, real
, double precision
, complex
та logical
; common
, dimension
, and equivalence
інструкції; data
для специфікації початкових значень змінних; intrinsic
та external
(тобто бібліотечних, зовнішніх) функцій; goto
, визначений goto
, та обчислюваний goto
; логічний та арифметичний if
; do
цикли; read
, write
, backspace
, rewind
, та endfile
ключові слова для послідовних операцій вводу-виводу; format
для форматованого вводу-виводу; call
, return
, pause
, та stop
; холеричні константи в data
та format
виразах, а також як аргументи для процедур; ідентифікатори з довжиною до 6 символів а також надано можливість запису коментарів в коді.
Після оприлюднення стандарту 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).
Зі значним запізненням, як наступник FORTRAN 77, відомий зараз як Fortran 90 (а до цього, Fortran 8X) був випущений як стандарт ISO 1991 і стандарт ANSI в 1992 році. Це був досить масштабний перегляд попереднього стандарту, котрий також враховував нові тенденції та розвиток інших мов. Було додано безліч нових функцій, щоб відобразити значні зміни в практиці програмування:
&
означає продовження інструкції в наступному рядку, ;
розділяє кілька інструкцій в одному рядку) а також запис ключових слів малими літерами;!
;recursive
процедури (підпрограми та функції);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
для полегшення маніпуляцій з масивами;На відміну від попередніх версій, з версії стандарту Фортран 90 не було видалено жодного елементу, однак значну їх кількість оголосили застарілими: нецілі лічильники в конструкціях циклів, завершення циклу з допомогою визначеної мітки, спільні continue
для вкладених do
циклів, арифметичні конструкції if(x) a,b,c
, інструкцію pause
, assign
та ін.
Fortran 95 був незначною ревізією попереднього стандарту, в основному, щоб вирішити деякі невирішені нагальні питання з практики програмування за допомогою стандарту Fortran 90. Тим не менш, в Fortran 95 також було додано ряд розширень, зокрема,
forall
і вкладені інструкції where
, для полегшення векторизації;pure
і елементарні elemental
процедури;allocatable
масивами автоматично звільняється, коли вони виходять з своєї області видимості;Деякі інструкції відзначені в Fortran 90 як застарілі, були видалені з Fortran 95: цикли з дійсними лічильниками, pause
та ін.
Важливим доповненням до Fortran 95 стала доповідь ISO TR-15581. У цій специфікації визначено розширене використання allocatable
масивів, ще до наявності повністю Fortran 2003 сумісних компіляторів. Додали можливість для allocatable
масивів бути компонентами похідних типів, в списках формальних параметрів процедур, а також як значення, що повертаються функцією. Ще одним важливим доповненням до 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 можна прочитати на офіційному сайті робочої групи Фортран[5]. Згідно з цією статтею, основні поліпшення для нової версії стандарту включають:
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
інструкція для завершення запису з буферів, регуляризація ключових слів та доступ до повідомлень про помилки;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_arithmetic
(нові типи, та нові функції ieee_support_underflow_control
, ieee_get_underflow_mode
, ieee_set_underflow_mode
, та багато ін.);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;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: про розширення модулів в Fortran. Ця доповідь внесла додатковий submodule
що в свою чергу дозволяє визначення і реалізацію модулів, які можуть описуватись частинами в окремих блоках програми, і дозволяє покращити архітектуру великих бібліотек, полегшує публікацію інтерфейсів, а також запобігає каскадній компіляції.
Останній стандарт ISO / IEC 1539-1:2010, неофіційно відомий як Fortran 2008, було затверджено голосуванням у вересні 2010 року[6]. Як і Fortran 95, це незначне оновлення, включає роз'яснення та поправки до Fortran 2003, але також вносить декілька нових можливостей. Ці можливості включають в себе[7]:
submodule
— замінили ISO / IEC TR 19767:2005;do concurrent
конструкцію для розпаралелювання циклів без взаємозалежностей;contiguous
для масивів, які розміщені безперервно цілим куском в оперативній пам'яті та вказівників, котрі на такі масиви вказують і функцію is_contiguous
;block
конструкцію, всередині якої можна оголошувати нові змінні з локальною межею видимості і котрі можуть бути вкладеними;%re
та %im
;allocate (b, mold=a)
копіюючи розмірність та тип іншої змінної, але без копіювання значень з допомогою нового специфікатора mold
додатково до вже існуючого source
; також ці специфікатори дозволяється використовувати для одночасного створення кількох змінних;allocatable
;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[9], та технічні доповнення N1903[10] та N1958[11]. Важливим розширенням до Fortran 2008 стало ISO Technical Specification (TS) 29113 по подальшій взаємодії в Fortran з мовою C[12][13], який був представлено ISO в травні 2012 на затвердження. Специфікація додає підтримку доступу до дескриптора масиву з мови C і дозволяє не звертати уваги на тип і ранг аргументів.
Продовжується робота над наступним стандартом[15][16]. Вже затверджено й опубліковано 1 грудня 2012 року "ISO/IEC TS 29113:2012" Technical Specification (TS29113) по подальшій взаємодії в Fortran з мовою C[17], та затверджено й опубліковано 19 листопада 2015 року "ISO/IEC TS 18508:2015 Information technology - Additional Parallel Features in Fortran" щодо розпаралелювання за допомогою комасивів (TS18508)[18]. Офіційне оприлюднення стандарту планується на 2018 рік[19]
На новій веб-сторінці JTC1/SC22/WG5, де публікують інформацію щодо стандартів Fortran і посилання на всі документи WG5, стартувало опитування щодо думок, пропозицій та функціональності, котра доцільна для наступного стандарту з попередньою назвою Fortran 202x[20].