![]() | |||||
|
|
Статьи: Новый стандарт - Fortran 90С момента создания первой системы Fortran было принято три стандарта ANSI/ISO языка — FORTRAN 66, FORTRAN 77 и Fortran 90. Большинство российских программистов со стажем знакомо именно со стандартом FORTRAN 77. Однако после его принятия вышло довольно много редакций Fortran, каждая из которых обладала собственным набором расширений языка. В 1992 г. был принят новый стандарт — Fortran 90, в который вошли многие расширения спецификации FORTRAN 77, реализованные в наиболее распространенных сегодня системах разработки. За счет этого обеспечивается более высокий уровень совместимости между различными платформами. По устоявшейся традиции новый стандарт гарантирует полную совместимость с предыдущими. Вместе с тем он включает практически все атрибуты современного языка программирования; многие из его новых конструкций имеют прямые аналоги в других языках (C/C++, Pascal, Basic). Одновременно нужно отметить, что Fortran именно "догоняет" своих более современных собратьев, реализуя уже довольно известные языковые возможности. В качестве оригинальных возможностей Fortran можно отметить только матричные операции. Следует подчеркнуть, что современные компиляторы Fortran 90 не гарантируют получения более быстрого исполняемого кода по сравнению с компиляторами стандарта FORTRAN 77 (противоречие между сложностью языковых конструкции и оптимизацией результирующего кода уже отмечалось ранее). Наверное, именно поэтому в некоторых системах, например Microsoft PowerStation, фактически реализованы два варианта компилятора для обоих стандартов. С внешней стороны наиболее заметным новшеством является "свободная форма" исходного текста, дополненная другими полезными элементами оформления программы. В логических операторах можно использовать привычные математические знаки вместо неудобных символьных обозначений (например, ">" вместо ".gt."). Появление целого ряда операторов, управляющих логикой работы программы (DO, SELECT CASE, CYCLE, EXIT), упрощает процесс разработки и делает исходный текст более понятным. Кроме того, в новый стандарт языка вошла возможность устанавливать режим обязательного описания переменных (оператор implicit). Вот как стала выглядеть небольшая программа на Fortran 90:
!Данная программа выполняет пересчет единиц измерения
! углов из "градусов" в "радианы"
!
! комментарий отделяется символом "!"
! длина строки — 132 позиции
program Free_Form_Example ! идентификатор — до 31 символа
implicit none !контроль описания типа переменных
integer start, finish, step
real degrees, radians
start = -90; finish = 90; step = 5 ! несколько операторов в строке
do degrees = start, finish, step ! оператор "do ... end do"
radians = & ! "&" означает перенос строки
degrees*3.14159/180.0
end do
end program Free_Form_Example
Значительную часть новшеств Fortran 90 составляют расширенные возможности операций с матрицами (массивами), которые теперь могут использоваться в выражениях как простые переменные. Так, чтобы умножить все элементы матрицы a(3,2) на 2, достаточно написать: a = a*2. Кроме обычных арифметических функций, реализованы также и специальные операции над матрицами, в частности умножения и транспонирования, а также выборки подмножества матрицы. Наличие подобных операций не только упрощает код программы, но и повышает скорость ее выполнения. Здесь наряду с привычной оптимизацией машинного кода возможен дополнительный выигрыш за счет распараллеливания матричных операций еще на уровне компилятора. Новый вариант описания типа (например, integer(4) вместо INTEGER*4) позволяет использовать переменную для указания числа резервируемых байтов. Наряду с поддержкой специальных функций идентификации чисел (Numeric Inquiry Functions), это упрощает проблему совместимости компьютеров различных архитектур, в частности машин Cray и PC, использующих разные принципы хранения данных. В Fortran 90 наконец-то стали поддерживаться структуры данных, получивших название Derived Type (производный тип), который является аналогом структур C или записей Pascal. Их описание можно представить на таком примере: ! Структура данных для описания товара type item character*80 PartName ! название товара integer PartNumber ! инвентарный номер real Price ! стоимость integer NumberOnHand ! количество единиц на складе end type ! Описание данных type (item) PartList(1000) ! массив для хранения списка товаров. Еще одна важная новинка — возможность динамического резервирования массивов, выполняемого в автоматическом режиме (например, по умолчанию при входе в процедуру) или с помощью специальных команд. Это позволяет эффективнее использовать оперативную память: ее отводится ровно столько, сколько нужно для решения задачи с конкретными исходными данными, а после использования память освобождается. Предыдущие стандарты Fortran допускали использование только статических данных, так что, например, при решении двумерных задач моделирования конечно-разностными методами приходилось описывать размеры массивов (в программе их могло быть до нескольких десятков) непосредственно в коде программы: DD(50,50). В результате для определенных размеров модели (скажем, 60 на 30 узлов) задача оказывалась неразрешимой, при том что реальные требования к объему памяти были ниже. В новом стандарте реализован также механизм специальных указателей (pointers), которые можно динамически связывать с простыми переменными и элементами массивов (только статических). Он позволяет, в частности, создавать сложные динамические структуры данных:
integer, pointer :: Ptr
integer, target :: Value
...
Ptr=>Value ! теперь указатель Ptr будет восприниматься как
! переменная Value ( "=>" — оператор связывания)
Большое развитие получил аппарат управления межпроцедурным взаимодействием внутри программы. Благодаря ему теперь можно управлять процедурным интерфейсом (конструкция INTERFACE), что решает многие проблемы при смешанном программировании. Эта конструкция, среди прочих возможностей, позволяет заменить имя функции (например, когда имя вызываемой внешней функции является недопустимым с точки зрения синтаксиса Fortran), а также создать так называемый "обобщенный интерфейс", когда имя вызываемой функции выбирается компилятором автоматически на основе типов передаваемых параметров:
interface Example
! При вызове процедуры Example с целочисленным параметром
! произойдет обращение к процедуре Example1, при вызове с
! вещественным параметром — к Example2.
subroutine Example1(IntValue)
integer IntValue
end subroutine
subroutine Example2(RealValue)
real RealValue
end subroutine
end interface
В новом стандарте появилась конструкция "модуль" (Module), почти такая же, как в MS Basic. Основной ее смысл заключается в объединении в рамках одного модуля процедур, имеющих общие внутренние переменные. Помимо этого, реализована возможность использования внутренних процедур (Internal Procedure) подобно тому, как это делается в Pascal. В общем виде структура модуля такова: module ModuleName ! начало модуля ... Блок описания общих переменных модуля... contains ! начало "включения" в модуль ... Процедуры (subroutine ... end)... end module Для удобства работы с процедурами модуля из других частей программы можно использовать оператор USE, который делает все описания данных и процедур модуля доступными данной программе. Но при написании модуля программист может определить, какие из процедур будут доступны извне (Public), а какие — нет (Private). Это, конечно же, далеко не все новшества стандарта Fortran 90. Но главный вывод очевиден: современный Fortran — совсем не то, что помнят многие из нас. Возвращаясь к вопросу об особом интересе, который может представлять Fortran для российских разработчиков, следует вспомнить, что еще недавно это был один из самых популярных языков программирования в нашей стране. В России имеется огромное число наработок с его применением, причем именно в области математических расчетов, где отечественные ученые всегда занимали передовые позиции. Вот почему шансы российских программистов в этом секторе разработок могут быть достаточно высоки. Так что некоторым специалистам, вероятно, стоит призадуматься над лозунгом: "Назад к Fortran!".
|
||||
![]() | Copyright © fortran-online.info, 2007 | ||||