FORTRAN умер. Да здравствует Fortran!
Андрей Колесов

© 1996, А.Колесов
Исходный, авторский вариант статьи, опубликованной в еженедельнике ComputerWeek-Moscow (№ 13/96, с. 28) в сокращенном варианте (25%).


Fortran в России
Секрет долгожительства
Fortran-приложения переходят на ПК
Новый стандарт — Fortran 90
Fortran и Россия — дружба навек?

Fortran в России

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

Еще лет десять назад Fortran был самым популярным языком программирования в нашей стране. Даже те, кто непосредственно с ним не работал, были в какой-то мере знакомы с Fortran: его изучение входило в обязательную часть всевозможных курсов программирования, в том числе и в вузах. С появлением персональных компьютеров ситуация резко изменилась: о Fortran все забыли. Число публикаций, где хотя бы просто упоминался Fortran, в отечественной компьютерной прессе за последние годы можно буквально пересчитать по пальцам. Дошло до того, что на прошлогодней российской конференции разработчиков программных средств DevCon'95 язык Fortran практически вообще не фигурировал как инструмент программирования.

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

В начало статьи

Секрет долгожительства

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

Секрет долгожительства Fortran, вроде бы, очевиден. С самого начала он был ориентирован на решение научно-технических задач математической обработки числовых данных (что отражено в самом названии языка: FORmula TRANslator — транслятор формул). А эта сфера деятельности отличается известным консерватизмом: здесь по большому счету основные вычислительные алгоритмы остались теми же, что пятьдесят и даже сто лет назад. Математические задачи в минимальной степени связаны с вводом/выводом данных, способами хранения информации и другими аспектами наиболее динамично меняющихся элементов архитектуры компьютеров.

Но объяснение жизнестойкости Fortran только его "специализированностью" нельзя считать исчерпывающим. Ведь у Fortran всегда было немало достойных и, пожалуй, более прогрессивных конкурентов, например ALGOL и PL, о которых сейчас почти никто и не вспоминает. А Fortran, "примитивность" которого всегда считалась очевидной среди программистов, по-прежнему не сдает своих позиций. В чем же секрет его долгожительства?

Дело в том, что он наиболее оптимально соответствует сфере применения, а также имеет ряд особенностей, основными из которых являются следующие:

Межплатформенная совместимость. Сильной стороной языка всегда была высокая степень переносимости исходного кода между различными платформами (как существующими, так и будущими), обеспечивающая хорошую масштабируемость программ и их долговечность.

В основе этой совместимости лежит достаточно жесткий стандарт, которого стараются придерживаться все разработчики компиляторов. Это особенно важно для математических программ, жизненный цикл которых значительно превышает время существования конкретных компьютерных платформ. Недаром один из главных рекламных тезисов фирм-разработчиков компиляторов звучит примерно так: "Вам не надо писать новые программы — просто возьмите написанный ранее код и откомпилируйте его".

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

Высокая эффективность исполняемого кода. Это всегда было важнейшим качеством для задач, требовавших максимального использования вычислительных мощностей. Fortran все время опережал своих конкурентов (причем довольно существенно) и по быстродействию программ, и по их компактности. В известной степени это объясняется многолетней отработкой алгоритмов компилятора. Но самое главное — использование более простых конструкций языка.

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

Огромный объем готовых математических наработок. Гордостью Fortran всегда была богатая коллекция самых разнообразных библиотек, и прежде всего математических. Реализованные, как правило, на самом Fortran, они кочевали с ним от одной компьютерной платформы к другой, шлифуя свои алгоритмы и расширяя состав функций. Исходные тексты подобных библиотек одновременно служат отличным подспорьем при изучении численных методов и алгоритмов, а также при разработке собственных. Одна из наиболее известных и популярных библиотек — IMSL фирмы Visual Numerics — включает свыше тысячи процедур математической и статистической обработки данных и фактически является стандартом на самых различных компьютерных платформах.

Разумеется, наличие математических библиотек не является монополией Fortran. Например, продукты LAPACK (фирма Rogue Ware) и M++ (Dyad Software) для C++ также предлагают широкий спектр функций математической обработки данных. Но здесь перевес в пользу Fortran обеспечивается за счет уже упомянутой ранее более высокой скорости выполнения кода.

Как язык программирования, Fortran, безусловно, всегда выглядел довольно примитивно на фоне богатых возможностей своих конкурентов. Но, возможно, именно это и способствовало его популярности: ведь значительный объем Fortran-приложений писался специалистами в предметных областях (условно скажем — математиками), которые были далеко не самими сильными программистами и для которых освоение, например C/C++, было не очень простой задачей.

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

Еще одна перспективная область применения Fortran-программ — использование их в клиент/серверных системах в качестве серверного компонента. Дело в том, что чистых Fortran-приложений сейчас практически не существует — уже давно большинство математических пакетов имеет двухуровневую схему: расчетный блок, написанный на Fortran, и модуль пользовательского интерфейса, реализованный на более приспособленном для этого языке (C/C++, Visual Basic и др.). В этой конструкции проглядываются зачатки достаточно простого перехода к сетевым клиент/серверным вариантам программных комплексов.

В начало статьи

Fortran-приложения переходят на ПК

ПК относятся хотя и к наиболее массовому, но самому низкому уровню в иерархии профессиональных компьютеров. Поэтому естественно, что сложные математические задачи (которые никак нельзя отнести к массовым) в большинстве своем до сегодняшнего дня решались на более мощной технике — рабочих станциях, мини-ЭВМ, мэйнфреймах. Созданием и поддержкой компиляторов Fortran для этих типов компьютеров (в основном в среде UNIX) занимаются многие ведущие разработчики системного ПО — CraySoft, DEC, EPC, Fujitsu, IBM, Microway, NAG (Numeric Algorithms Group), Parasoft и другие.

Поддерживая общепринятый стандарт языка (сейчас это Fortran 90), многие компиляторы имеют свои собственные расширения, связанные, как правило, с архитектурой конкретных вычислительных систем (Cray, Vax, Sun) и направленностью решаемых на них задач. Например, компиляторы DEC имеют оптимизирующие возможности, связанные с особенностями процессора DEC Alpha, а системы CraySoft имеют традиционно более сильные средства для работы с матрицами.

Позиции Fortran на персональных компьютерах пока довольно скромны, по оценкам Microsoft на них работают в настоящее время только 30% приложений, написанных на Fortran. Наверное, именно этим объясняется тот факт, что ассортимент компиляторов для ПК существенно меньше, чем для UNIX-систем. Кроме того, DOS-компиляторы (этот термин часто используется как синоним пакетов для ПК, когда речь идет о сравнении с другими классами компьютеров) заметно уступают по своим функциональным возможностям.

Тем не менее, ситуация на рынке Fortran в последнее время заметно меняется и наблюдается тенденция к существенному увеличению доли персональных компьютеров, используемых для решения математических задач. Здесь можно отметить следующие моменты:

На рынке компиляторов для ПК лидирующие позиции занимает фирма Microsoft, которая в конце 1995 г. выпустила новую версию Fortran PowerStation 4.0 для Windows 95 и Windows NT. В то же время она продолжает поддерживать системы Fortran 5.1 (16-разрядная для DOS) и Fortran PowerStation 1.0 (32-разрядная для DOS/Windows).

В качестве наиболее реального конкурента в сегменте ПК чаще всего упоминается фирма Lahey Computer Systems, которая в конце 1995 г. выпустила пакет Lahey FORTRAN 90 2.00a. В качестве иллюстрации тенденций роста роли Fortran на персональных компьютерах можно сослаться на решение американского Центра управления полетами НАСА (NASA Mashall Space Flight Center) о более активном применении ПК для выполнения математических расчетов. Координатор научных систем доктор Бриско Стефенс (Briscoe Stephens) по поводу новой системы фирмы Microsoft заявил: "Fortran PowerStation 4.0 позволит нам снизить затраты. Теперь мы сможем использовать недорогие ПК архитектуры Intel для решения проблем, которые ранее требовали применения рабочих станций Unix или даже суперкомпьютеров Cray". Примечательно, что для подобного перехода не потребуется какого-либо перепрограммирования существующих пакетов.

Вместе с тем заметно, что позиционирование Fortran-систем со стороны его разработчиков отличается от других пакетов программирования. Например, ни в один из компиляторов для ПК не входят средства поддержки групповой разработки, в том числе контроль версий, ставшие обычными для C/C++ или Visual Basic. Вместе с тем, все специалисты, занимавшиеся тестированием различных систем программирования, отмечают более высокую производительность Fortran в обработке числовых данных по сравнению с другими языками, в том числе C.

В начало статьи

Новый стандарт — 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 для российских разработчиков, следует вспомнить, что еще недавно это был один из самых популярных языков программирования в нашей стране. В России имеется огромное число наработок с его применением, причем именно в области математических расчетов, где отечественные ученые всегда занимали передовые позиции. Вот почему шансы российских программистов в этом секторе разработок могут быть достаточно высоки. Так что некоторым специалистам, вероятно, стоит призадуматься над лозунгом: "Назад к Fortran!"

В начало статьи