Почему физики всё ещё используют Fortran. Язык программирования Фортра́н (Fortran)

Впервые я услышал о Фортране в раннем детстве от отца. Он рассказывал, что в 70-х годах ему приходилось часами выстаивать очереди к едва ли не единственной ЭВМ в ВУЗе, дабы используя перфокарту запустить примитивный код. Признаюсь честно, с тех пор и до недавнего времени (несмотря на полученное техническое образование) я пребывал в полной уверенности, что Фортран остался где-то далеко там, в мире, где носителями информации выступают странные картонки с дырками, а компьютеры стоят так дорого, что воспринимаются, как настоящий аттракцион.

Каково же было моё удивление, когда я узнал, что Фортран не просто ещё где-то используется, он развивается, востребован и по-прежнему актуален. Если вы также до этого момента полагали, что Фортран давно носит статус мертвеца, то вот вам несколько интересных фактов, почему он ещё ходит.

Пережил минимум 10 обновлений

В действительности, тот Фортран о котором вы слышите от преподавателей в школе или университете был создан в период с 1954 по 1957 года. Он вошёл в историю, как первый полностью реализованный язык высокого уровня, совершил маленький прорыв в IT-мире, но по сути был не слишком удобен и функционален. “Допиливать” его в IBM принялись практически сразу, уже в 1958 году появился FORTRAN II и параллельно FORTRAN III. Но более-менее приличный вид он приобрёл лишь в 70-х, когда появились достаточно портативные машины, когда был разработан полноценный стандарт IBM FORTRAN IV, и появился FORTRAN 66 с циклами, метками, условными операторами, командами ввода/вывода и прочими по современным меркам примитивными возможностями.

Последняя версия появилась в 2010 году, её название Fortran 2008 (как видите, в ходе истории, название перестало писаться исключительно заглавными буквами), отличительной чертой которой являются всевозможные параллельные вычисления, положительно сказывающиеся, как на скорости обработки данных, так и на размерности обрабатываемых массивов. Кроме того, на 2018 год запланирован выход Fortran 2015. Из анонса следует, что в нём будет улучшена интеграция с С, а также устранены текущие недоработки.

Входит в 30 самых популярных языков программирования

На сегодняшний день 0,743% запросов в поисковых системах относительно языков программирования посвящену именно Фортрану. Чтобы вы поняли, насколько это круто, просто представьте, что такие языки, как Lisp, Scala, Clojure, LabVIEW, Haskell, Rust и VHDL, находятся в рейтинге ниже.

Может работать на Android (и не только)

Компиляторы для Фортана за его долгую историю разрабатывались такими компаниями, как IBM, Microsoft, Compaq, HP, Oracle, благодаря чему сегодня язык совместим с Windows, Mac OS и Linux. Более того, удобное приложение с компилятором теперь можно взять с собой, благодаря приложению CCTools для Android. Можно запустить компилятор и на вашем iPhone, но в этом случае немного поколдовать.

Конкурирует с MATLAB

Пока в этом тексте не было сказано главного, а именно области применения Фортрана. Так вот это язык, востребованный в науке и инженерии, полностью или частично применяемый для прогноза погоды, океанографии, молекулярной динамики, сейсмологического анализа. В общем, это самый настоящий “Data Science”-язык родом из времени, когда в массовую продажу впервые поступил калькулятор.

При этом стоит признать, что частично своей популярностью Фортран обязан наследию. За долгие годы практически без конкуренции язык оброс огромной базой клиентов, библиотек и надстроек. Кроме того, каждая следующая версия Фортрана неизбежно поддерживает предыдущие. Поэтому сложилась ситуация, когда отсутствуют какие-либо существенные факторы, для того, чтобы учёные и инженеры вынуждены были отказаться от этого союза.

По сути, главным конкурентом Фортрана на сегодняшний день является MATLAB, который более универсален, более функционален и удобен. Однако MATLAB при этом имеет строгие ограничения по используемому ПО, достаточно дорого стоит и в большинстве случаев просто излишен.

Имеет относительно безоблачное будущее

Безусловно, мы не можем предсказать, что будет через 10-20 лет, и как за это время изменится IT-мир. Однако, если посмотреть на возможных новых конкурентов для Фортрана (таких, как Go), их главный недостаток - универсализация. То есть создатели Fortran очень быстро наметили целевую аудиторию в виде учёных, их мнение и пожелания имеют приоритетное значение. Поэтому трудно представить, что завтра они откажутся от своего “спецзаказа” ради какой-то модной тенденции. Именно на основании этого можно утверждать, что ещё одно поколение Фортран отходит смело.

А потом они просто выпустят новую версию.

Алфавит - в программировании – система неразложимых, уверенно отличимых друг от друга символов (букв, цифр, знаков препинания и др. символов), используемых для построения языков программирования.

Синтаксис - сторона языка программирования, которая описывает структуру программ как наборов символов. Синтаксису языка противопоставляется его семантика. Синтаксис языка описывает «чистый» язык, в то же время семантика приписывает значения различным синтаксическим конструкциям.

Сема́нтика - в программировании - система правил определения поведения отдельных языковых конструкций. Семантика определяет смысловое значение предложений алгоритмического языка.

Языки программирования низкого уровня – Автокод, Ассемблер,

Языки программирования высокого уровня -Фортран, Алгол, Кобол, Паскаль, Бейсик, Си++, Пролог

Языки программирования сверхвысокого уровня – APL, Алгол-68

Вычислительные Языки программирования - Фортран, Паскаль, Алгол, Бейсик, Си

Языки символьной обработки – Лисп, Пролог, Снобол и др.

Языки первого поколения:

Машинные коды были языком программирования первого поколения

Языки второго поколения:

Ассемблер

Языки третьего поколения:

эти языки часто обозначаются как языки «высокого» уровня.

Языки четвертого поколения:

Бейсик, Кобол, Си и Паскаль

Языки программирования пятого поколения:

Пролог, ЛИСП, Си++, Visual Basic, Delphi.

Язык программирования Фортра́н (Fortran)

Первый язык программирования высокого уровня, имеющий транслятор. Создан в период с 1954 по 1957 год группой программистов под руководством Джона Бэкуса в корпорации IBM. Название Fortran является акронимом от FORmula TRANslator (переводчик формул). Фортран широко используется в первую очередь для научных и инженерных вычислений. Одно из преимуществ современного Фортрана - большое количество написанных на нём программ и библиотек подпрограмм. Большинство таких библиотек является фактически достоянием человечества: они доступны в исходных кодах, хорошо документированы, отлажены и весьма эффективны. Поэтому изменять, а тем более переписывать их на других языках программирования накладно, несмотря на то, что регулярно производятся попытки автоматического конвертирования FORTRAN-кода на современные языки программирования.

Современный Фортран (Fortran 95 и Fortran 2003) приобрёл черты, необходимые для эффективного программирования для новых вычислительных архитектур, позволяет применять современные технологии программирования, в частности, ООП.

Эволюция стандартов языка

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

FORTRAN 77 (1980)

Введено множество улучшений:

Введены операторы открытия и закрытия файла (OPEN, CLOSE) и вывода на стандартное устройство - PRINT.

Добавлены строковый тип данных и функции для его обработки.

Введён блочный оператор IF и конструкция IF THEN - ELSE IF THEN - END IF, а также оператор включения фрагмента программы INCLUDE.

Введена возможность работы с файлами прямого доступа.

Увеличена максимальная размерность массива с 3 до 7. Сняты ограничения на индексы массива.

Усовершенствованы и расширены возможности работы с процедурами.

Введено понятие внутреннего файла (каковыми являются массивы, числовые и строковые переменные). Внутренние файлы позволяют, в частности, осуществлять преобразование число-строка и строка-число стандартным операторами чтения и записи READ и WRITЕ.

Fortran 90 (1991)

Значительно переработан стандарт языка.

Введён свободный формат написания кода. Появились дополнительные описания IMPLICIT NONE, TYPE, ALLOCATABLE, POINTER, TARGET, NAMELIST.

Введены управляющие операторы и конструкции. Добавлены DO … END DO (вместо завершения цикла меткой), DO WHILE, оператор передачи управления на начало цикла CYCLE, конструкция выбора SELECT CASE (для замены громоздких конструкций IF и операторов GOTO), а также заключительный оператор программной единицы, модульной или внутренней процедуры END.

Введён инструментарий указателей и функции для работы с оперативной памятью (по аналогии с языком С).

Введены операторы работы с динамической памятью (ALLOCATE, DEALLOCATE, NULLIFY).

Добавлены программные компоненты MODULE, PRIVATE, PUBLIC, CONTAINS, INTERFACE, USE, INTENT.

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

Стандартные операции присваивания, сложения, вычитания, а также деления и умножения на число распространены на массивы и их секции, определяемые сечениями. В этом случае осуществляется поэлементное присваивание.

Появились новые встроенные функции, в первую очередь для работы с массивами. Функции для вычислений в массивах: ALL(лог. произведение) и MASK(логическое сложение), COUNT(число истинных элементов), PRODUCТ(произведение элементов массива), SUM(сложение элементов массива), DOT_PRODUCT (скалярное произведение), MATMUL (умножение матриц). Добавились справочные функции, а также функции переформирования и свёртки массивов.

В языке появились элементы ООП. Введены производные типы данных. Отдельно объявлен список устаревших черт языка, предназначенных для удаления в будущем.

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

Fortran 95 (1997)

Коррекция предыдущего стандарта. Введён оператор и конструкция FORALL, позволяющие более гибко, чем оператор и конструкция WHERE, присваивать массивы и заменять громоздкие циклы. FORALL позволяет заменить любое присваивание сечений или оператор и конструкцию WHERE, в частности, обеспечивает доступ к диагонали матрицы. Данный оператор считается перспективным в параллельных вычислениях, способствуя более эффективному, чем циклы, осуществлению распараллеливания.

Fortran 2003 (2004)

Дальнейшее развитие поддержки ООП в языке. Взаимодействие с операционной системой. Добавлены также следующие возможности:

Асинхронный ввод-вывод данных.

Средства взаимодействия с языком C

Усовершенствование динамического размещения данных

Стандартом предполагается поддержка средствами языка параллельных вычислений (Co-Arrays Fortran). Также предполагается увеличить максимальную размерность массивов до 15, добавить встроенные специальные математические функции и др.

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

Большинство таких библиотек является фактически достоянием человечества: они доступны в исходных кодах, хорошо документированы, отлажены и весьма эффективны. Поэтому изменять, а тем более переписывать их на других языках программирования накладно, несмотря на то, что регулярно производятся попытки автоматического конвертирования FORTRAN-кода на современные языки программирования.

Современный Фортран (Fortran 95 и Fortran 2003) приобрёл черты, необходимые для эффективного программирования для новых вычислительных архитектур, позволяет применять современные технологии программирования, в частности, ООП .

Эволюция стандартов языка

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

FORTRAN 66 (1972) На базе стандарта фирмы IBM FORTRAN IV FORTRAN 77 (1980) Введено множество улучшений: Fortran 90 (1991) Значительно переработан стандарт языка. Fortran 95 (1997) Коррекция предыдущего стандарта. Введён оператор и конструкция FORALL, позволяющие более гибко, чем оператор и конструкция WHERE, присваивать массивы и заменять громоздкие циклы. FORALL позволяет заменить любое присваивание сечений или оператор и конструкцию WHERE, в частности, обеспечивает доступ к диагонали матрицы. Данный оператор считается перспективным в параллельных вычислениях, способствуя более эффективному, чем циклы, осуществлению распараллеливания . Fortran 2003 (2004) Дальнейшее развитие поддержки ООП в языке. Взаимодействие с операционной системой. Добавлены также следующие возможности: Fortran 2008 (2010) Стандартом предполагается поддержка средствами языка параллельных вычислений (Co-Arrays Fortran) . Также предполагается увеличить максимальную размерность массивов до 15, добавить встроенные специальные математические функции и др.

Компиляторы

С момента первоначальной разработки языка, компиляторы Фортрана производит фирма IBM. В настоящее время фирмой IBM поставляется оптимизирующий компилятор VS Fortran для мэйнфреймов IBM System z , история развития различных версий которого восходит ещё к 1964 году , а также компилятор XL Fortran для платформ на базе архитектуры PowerPC - AIX , Linux и суперкомпьютера Blue Gene (выпускалась также версия для Mac OS X , когда компьютеры Macintosh использовали процессоры PowerPC). Оба этих компилятора содержат очень сложные оптимизаторы, являющиеся результатом непрерывной научной работы специалистов IBM на протяжении полувека. На базе компилятора IBM Fortran XL фирмой Absoft, бизнес-партнёром IBM, создан и поставляется компилятор Absoft Pro Fortran для систем на базе процессоров PowerPC (Linux, Mac OS X) и Intel (Linux, Mac OS X, Windows) .

Фонд свободного программного обеспечения GNU выпускал открытый компилятор Фортрана-77 g77, доступный практически для любой платформы и полностью совместимый с GCC . Сейчас ему на смену пришел компилятор GFortran , в котором реализованы практически все конструкции стандарта Фортран-95 и многие конструкции стандартов Фортран-2003 и Фортран-2008. Он также полностью обратно совместим с Фортран-77. Также существует независимый проект g95 по созданию на основе GCC компилятора Фортран-95.

Возможности и структура программы

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

Перфокарта с разметкой колонок для Фортрана.

Структура программ изначально была ориентирована на ввод с перфокарт и имела ряд удобных именно для этого случая свойств. Так, 1-я колонка служила для маркировки текста как комментария (символом C ), с 1-й по 5-ю располагалась область меток, а с 7-й по 72-ю располагался собственно текст оператора или комментария. Колонки с 73-й по 80-ю могли служить для нумерации карт (чтобы восстановить случайно рассыпавшуюся колоду) или для краткого комментария, транслятором они игнорировались. Если текст оператора не вписывался в отведённое пространство (с 7-й по 72-ю колонку), в 6-ой колонке следующей карты ставился признак продолжения, и затем оператор продолжался на ней. Расположить два или более оператора в одной строке (карте) было нельзя. Когда перфокарты ушли в историю, эти достоинства превратились в серьёзные неудобства.

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

Своего рода «визитной карточкой» старого Фортрана является огромное количество меток, которые использовались как в операторах безусловного перехода GOTO , так и в операторах циклов, и в операторах описания форматного ввода/вывода FORMAT. Большое количество меток и операторов GOTO часто делало программы на Фортране трудными для понимания.

Именно этот негативный опыт стал причиной, по которой в ряде современных языков программирования (например, Java) метки и связанные с ними операторы безусловного перехода сильно видоизменены.

Однако современный Фортран избавлен от избытка меток за счёт введения таких операторов, как DO … END DO, DO WHILE, SELECT CASE. Более того, в современных стандартах языка оставлен лишь классический оператор GOTO, применяемый во многих языках и поныне. Вычисляемый оператор GOTO, а также конструкция ENTRY - множественного входа в процедуры, были исключены.

Также к положительным чертам современного Фортрана стоит отнести большое количество встроенных операций с массивами и гибкую поддержку массивов с необычной индексацией. Пример:

Real ,dimension (: ,: ) :: V ... allocate (V(- 2 : 2 ,0 : 10 ) ) ! Выделить память под массив, индексы которого могут ! меняться в пределах от -2 до 2 (первый индекс) ! и от 0 до 10 - второй ... V (2 ,2 : 3 ) = V(- 1 : 0 ,1 ) ! Повернуть кусочек массива write(* ,* ) V(1 ,: ) ! Напечатать все элементы массива V, первый индекс которых равен 1. deallocate (V)

Hello, World!

Фиксированный формат (символами «␣» выделены пробелы в позициях строки с 1 по 6):

␣␣␣␣␣␣PROGRAM hello ␣␣␣␣␣␣PRINT* , "Hello, World!" ␣␣␣␣␣␣END

Свободный формат:

Program hello print * , "Hello, World!" end

Замечания.

  • Оператор PROGRAM не является обязательным. Строго говоря, единственный обязательный оператор Фортран-программы - оператор END .
  • Выбор прописных или строчных букв для написания операторов программы произволен. С точки зрения современных стандартов языка Фортран, множество прописных букв и множество строчных букв при написании операторов языка совпадают.

Взаимодействие с другими языками

Многие системы программирования позволяют компоновать полученные в результате трансляции фортрановской программы объектные файлы с объектными файлами, полученными от компиляторов с других языков, что позволяет создавать более гибкие и многофункциональные приложения. Для языка Фортран также доступно большое количество библиотек, содержащих как подпрограммы решения классических вычислительных задач (LAPACK , IMSL, BLAS), задач организации распределённых вычислений (MPI , pvm), так и задач построения графических интерфейсов (Quickwin , FORTRAN/TK) или доступа к СУБД (Oracle).

Фортран в СССР

Примечания

  1. См., например: Netlib Repository at UTK and ORNL
  2. А. М. Горелик . Эволюция языка программирования Фортран (1957-2007) и перспективы его развития//Вычислительные методы и программирование, 2008, Т. 9, с. 53-71
  3. Бартеньев О.В. Современный Фортран . - М .: Диалог МИФИ, 2005. - ISBN 5-86404-113-0
  4. А. М. Горелик. объектно-ориентированное программирвание на современном Фортране
  5. С. Д. Алгазин, В. В. Кондратьев. Программирование на Visual Fortran. - М .: «Диалог МИФИ », 2008. - 448 с. - ISBN 5-8243-0759-8
  6. Горелик А. М.Новости
  7. VS FORTRAN
  8. XL Fortran for Linux
  9. Absoft Pro Fortran Compiler Suites General Overview
  10. Sun Studio - Benchmarks
  11. Очерк Александра Расторгуева о появлении Фортрана в Дубне
  12. История компьютерной графики в России

Литература

  • Fortran. Programmer"s Reference Manual. The Fortran Automatic Coding System for the IBM 704 EDPM . - IBM Corp., 1956. - 51 с.
  • ISO/IEC 1539-2:2000 Information technology - Programming languages - Fortran - Part 2: Varying length character strings
  • Роберт У. Себеста. 2.3. Компьютер IBM 704 и язык Фортран // Основные концепции языков программирования = Concepts of Programming Languages / Пер. с англ. - 5-е изд. - М .: Вильямс, 2001. - С. 63-69. - 672 с. - 5000 экз. - ISBN 5-8459-0192-8 (рус.), ISBN 0-201-75295-6 (англ.)

Ссылки

  • gfortran - Компилятор Фортрана 95/2003/2008, часть Коллекции компиляторов GNU
  • в Прогопедии - энциклопедии языков программирования (рус.)
* "Магия ПК" 2000 №6(28), С. 49–50.

В 1955 году увидел свет первый алгоритмический язык высокого уровня FORTRAN (FORmula TRANslator – транслятор формул). Он использовался в основном для решения научно-технических и инженерных задач, а разработали его сотрудники фирмы IBM под руководством Джона Бэкуса . Чуть позже, в 1957 году, Джон Бэкус и его сотрудники установили в IBM (Beстингхауз) первый компилятор языка Фортран. Программисты, ранее работавшие исключительно на Ассемблере, скептически относились к возможностям высокопроизводительного языка высокого уровня, поэтому основным критерием при разработке стандартов на Фортран и создания компиляторов с этого языка была эффективность исполняемого кода. Кстати, термин "компилятор" тогда еще широко не использовался, хотя уже был введен Грейс Хоппер – единственной в США женщиной-адмиралом, которую называли также "первой леди программирования и бабушкой Кобола".
Большинство операторов Фортрана транслировались непосредственно в одну–две машинные команды, простые синтаксические конструкции и активное использование меток и goto позволяло получить очень быстрый код, и в результате программы на Фортране подчас работали быстрее ассемблерных. Сама внутренняя структура оттранслированной программы была также очень простой – весь код, все подпрограммы и все данные вместе с общим блоком размещались исключительно в статической памяти, из-за чего, правда, невозможно было использовать рекурсию.
Поскольку Фортран был первым языком высокого уровня, отвечающим нуждам большинства пользователей того времени, да еще и простым в изучении, распространился он очень быстро.
Из-за широкого распространения этого языка и появления множества Фортран-программ (преимущественно вычислительного характера) насущным стал вопрос его стандартизации. Сначала это был стандарт Fortran IV 1964 года, затем, по мере появления новых идей, в 1978 году был принят новый стандарт Fortran 77 (f77) с большим числом более современных и гибких синтаксических расширений. Сегодня наиболее распространенным вариантом Фортрана являются Fortran 90 (f90) и Fortran 95 . Группа энтузиастов заканчивает работу над суперверсией языка F2k, которая будет опубликована в этом году.
Хотя в новые версии языка вносились подчас как ненужные дополнения (например, расширения, связанные с динамической аллокацией памяти), так и полезные, типа модульной организации программы, работы с частями массивов и др., сегодня этот язык нельзя назвать перспективным для изучения, так как синтаксис его значительно устарел.
Однако тем, кому довольно часто приходится решать различные вычислительные задачи, совсем не обязательно каждый раз брать в руки учебник по математике и "начинать с нуля". В 90% подобных случаев то, что вы ищете, уже давно реализовано и отлажено на Фортране. Поэтому, скорее всего, жизнь Фортрану обеспечена надолго.
Есть и еще одна, сравнительно молодая ниша для Фортрана – параллельные вычисления, где строгая семантика языка позволяет получать высокопроизводительные программы. Обычно используется стандарт f90, немного расширенный набором операторов для указания пригодных к распараллеливанию частей программы. Параллельный Фортран имеет свой стандарт HPF (High Performance Fortran). Тем не менее фанаты Фортрана, девизом которых стала легендарная фраза "Зачем мне изучать другие языки, когда я могу всё написать на Фортране", ощущали его очевидную непригодность для крупномасштабных проектов, связанную с привязанностью к синтаксису 50-х годов, и пытались ввести в него модные идеи ООП, но объектный Фортран в качестве стандарта так и не появился.
Среди бесплатно распространяемых версий Фортрана наиболее известен f2c, реализованный для всех UNIX-систем и преобразующий текст Фортран-программы в Си-код. Для DOS имеется версия bcf77, распространяемая бесплатно. Из коммерческих версий в первую очередь надо отметить Microsoft Fortran, позволяющий создавать dll-библиотеки, и Watcom Fortran, генерирующий высокоэффективный код. Для задач, требующих высокой точности вычислений, предназначен компилятор фирмы MicroWay. А вообще различные по качеству компиляторы Фортрана имеются на абсолютно всех компьютерных платформах.
Однако основная заслуга Фортрана в другом. Когда появилась необходимость в разработке очень крупных проектов, недостатки Фортрана, связанные в первую очередь с "тяжелой" отладкой, стали излишне обременительны. Поэтому Фортран послужил сильнейшим стимулом для развития теории отладки и тестирования программ. Появились сотни синтаксических верификаторов Фортран-текстов, вылавливающих скрытые логические ошибки. В дальнейшем из этого направления выросли такие теоретические области программирования, как эквивалентные оптимизирующие преобразования программ, высокоуровневая компиляция, автоматическое тестирование и т.д. Так что про Фортран забывать никак нельзя. Использовать его в качестве инструментария в задачах системной интеграции, наверное, не имеет смысла, но то, что было наработано лучшими программистами за 30–40 лет, вполне может ускорить процесс разработки. По крайней мере, программных "кирпичиков" для Фортрана ныне существует несравненно больше, чем для других языков программирования. ■

* * *
Джон Бэкус родился 3 декабря 1924 в Филадельфии, штат Пенсильвания, в богатой семье, детские годы провел в Вилмингтоне. Закончив школу в 1942 году, он поступил в университет штата Вирджиния на химический факультет (по настоянию отца-химика), но спустя некоторое время перестал заниматься и в 1943 году был призван на военную службу.
Бэкус начинал служить в бригаде противовоздушной обороны в форте Stewart, штат Джорджия, но впоследствии был направлен в колледж для изучения медицины.
Некоторое время он с увлечением работал в городской больнице, но в 1946 году охладел к этой работе, оставил армию и переехал в Нью-Йорк, хотя не знал за что браться и как жить дальше.
Через некоторое время Бэкус поступил в школу подготовки радиотехников. "У меня был очень хороший преподаватель, и он попросил, чтобы я вычислил характеристики некоторых схем. Это было страшно утомительно, но крайне интересно".
Вскоре Бэкус поступил в Колумбийский университет (Нью-Йорк), чтобы изучать математику, где и получил высшее образование (1949 г.). Незадолго перед тем, как закончить обучение, он посетил компьютерный центр IBM на Мэдисон Авеню. И здесь удача во второй раз улыбнулась ему – в 1950 году Бэкус стал программистом компании IBM.
О доминировании IBM в компьютерной индустрии впервые заговорили в 1952 году. Всё началось с модели 701, известной также под именем Defence Calculator (оборонный вычислитель). Сразу после выпуска модели 701 специалисты подразделения прикладных исследований приступили к ее совершенствованию (1955–1956 годы).

Наиболее серьезные изменения предложил внести Джон Бэкус, впоследствии принимавший активное участие в создании компьютера 704. В частности, благодаря ему появилась технология так называемого "ускоренного кодирования" (speed-coding), позволившая заметно упростить написание программ для 701. "Возможность ускоренного формирования кода для машины 701, которая представляла собой одноадресный компьютер с фиксированной запятой без индексных регистров, превратила ее в систему с плавающей запятой, произвольной адресацией и индексными регистрами, – вспоминал Бэкус. – Таким образом, пользователям больше не нужно было мучиться с двоичным кодом".
Уже тогда появились первые компоненты технологии быстрого написания программ, которая используется сегодня. Фактически данная система стала предшественницей аналогичных комплексов, которые были выпущены в 50–60 годах и впоследствии вытеснены языками высокого уровня.
А в 1955 году Бэкус "изобрел" Фортран, первый машинный язык высокого уровня. Впоследствии, вспоминая этот период, Бэкус скажет: "Мы не знали, к чему стремиться, и не знали, как это сделать". Первоначально все работы планировалось завершить в начале 1954 года, однако разработка языка завершилась практически через два года.
Первая версия компилятора состояла из 25000 строк машинного кода, записанного на магнитной ленте. Каждая IBM 704 обеспечивалась копией программы с руководством по программированию на 51 странице.
В 1959 году Бэкус разработал грамматические правила для описания синтаксиса языков высокого уровня (нормальная форма Бэкуса-Наура, сокращенно БНФ).
В 1976 году Джон Бэкус был награжден Национальной медалью за вклад в науку, а с 1991 года перестал заниматься компьютерной тематикой.

Владимир Буслаев

OCR: fir-vst, 2016

  • gfortran
    • gfortran 4.5.0
  • Язык программирования

    Фортран (Fortran) - первый реализованный язык программирования высокого уровня (после ), правда, с одной небольшой оговоркой - для машин, построенных по классической схеме фон Неймана. Создан в период с 1954 по 1957 год группой программистов под руководством Джона Бэкуса (John Backus) в корпорации IBM. Через пару лет начались его коммерческие поставки. До этого программирование велось либо непосредственно в машинных кодах, либо на символических ассемблерах. Название Fortran является аббревиатурой от FORmula TRANslator, то есть, переводчик формул.

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

    Большинство таких библиотек является фактически достоянием человечества: они доступны в исходных кодах, хорошо документированы, отлажены и весьма эффективны. Поэтому изменять, а тем более переписывать их на других языках программирования накладно, несмотря на то, что регулярно производятся попытки автоматического конвертирования FORTRAN-кода на современные языки программирования.

    Своего рода «визитной карточкой» старого Fortran является огромное количество меток, которые использовались как в операторах безусловного перехода GOTO , так и в операторах циклов, и в операторах описания форматного ввода/вывода FORMAT . Большое количества меток и операторов GOTO часто делало программы на Фортране трудными для понимания.

    Именно этот негативный опыт стал причиной, по которой в ряде современных языков программирования (например, Java) метки и связанные с ними операторы безусловного перехода вообще отсутствуют.

    Однако современный Fortran избавлен от избытка меток за счет введения таких операторов, как DO … END DO, DO WHILE, SELECT CASE. Также к положительным чертам современного Fortran стоит отнести большое количество встроенных операций с массивами и гибкую поддержку массивов с необычной индексацией.

    Взаимодействие с другими языками

    Многие системы программирования позволяют компоновать полученные в результате трансляции программы на Fortran объектные файлы с объектными файлами, полученными от компиляторов с других языков, что позволяет создавать более гибкие и многофункциональные приложения. Для языка Фортран также доступно большое количество библиотек, содержащих как подпрограммы решения классических вычислительных задач (LAPACK, IMSL, BLAS), задач организации распределенных вычислений (MPI, pvm), так и задач построения графических интерфейсов (Quickwin, FORTRAN/TK) или доступа к СУБД (Oracle).

    Наследие Fortran

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

    Переносимость

    Поначалу переносимость для Fortran была весьма насущной проблемой, потому что не существовало ни одного единого стандарта и даже справочной информации от IBM. И компьютерные фирмы соперничали между собой, обеспечивая несовместимость для разных компиляторов. Исправило дело появление стандартов. Стандарт 1966 года устанавливал синтаксис и семантику, но продавцы продолжали внедрять несовместимые расширения. Осмотрительные программисты понимали, что использование несовместимых расширений вызовет проблемы переносимости и зачастую использовали программы наподобие «The PFORT Verifier» для выявления несовместимых расширений.

    Несовместимые расширения были не единственной проблемой. Существовал ряд проблем с численными вычислениями. Позже была развита и внедрена практически универсальная идея двоичной арифметики с плавающей запятой.

    Доступ к исполняемой среде (например, к командной строке, переменным среды) был весьма затруднителен, пока на это не обратили на это внимание в стандарте 2003 года.

    Сейчас относительно просто реализовать полностью переносимую программу на Fortran.

    Элементы синтаксиса:

    Комментарий до конца строки ! или * в первом символе строки
    Регистрозависимость Нет
    Регулярное выражение идентификатора переменной [_a-zA-Z0-9]{0-n}
    Присваивание значения переменной =
    Объявление переменной type:: variable
    Объявление переменной с присваиванием значения type:: variable = value
    Группировка выражений ()
    Блок do ... end do
    Равенство = или.EQ.
    Неравенство /= или.NE.
    Сравнение == < > <= >= <> или.LT. .GT. .LE. .GE.
    Вызов функции CALL f(a,b...)
    Вызов функции без параметров CALL f
    Последовательность конец строки
    Если - то if condition then ... end if
    Если - то - иначе if condition then ... else ... endif
    Цикл с постусловием DO ... WHILE (condition)
    Цикл for - next для диапазона целых чисел с инкрементом на 1 do label i = 1, 10
    Цикл for - next для диапазона целых чисел с декрементом на 1 do label i = 10, 1, -1

    Примеры:

    Hello, World!:

    Пример для версий Intel Visual Fortran 11.1 , g95 0.93 , gfortran 4.5.0

    Этот пример написан в свободном формате, поддерживаемом Fortran 90 и последующими стандартами, а также диалектом .

    Fortran 90-style comment program HelloWorld print * , "Hello, World!" end program HelloWorld

    Факториал:

    Пример для версий Intel Visual Fortran 11.1 , g95 0.93 , gfortran 4.5.0

    Используется итеративное определение факториала и свободный формат программы. Спецификации формата I и A используются для вывода чисел в десятичном формате и строк, соответственно. При вычислении факториалов 13-16 возникает арифметическое переполнение, не вызывающее ошибку, поэтому выводятся неправильные значения:

    13! = 1932053504
    14! = 1278945280
    15! = 2004310016
    16! = 2004189184

    program Factorial integer :: f , n f = 1 n = 0 do print "(I2, A, I10)" , n , "! = " , f n = n + 1 f = f * n if (n == 17 ) then exit end if end do end program Factorial

    Числа Фибоначчи:

    Пример для версий Intel Visual Fortran 11.1 , g95 0.93 , gfortran 4.5.0

    Используется итеративное определение чисел Фибоначчи. Самое сложное в этом примере — вывод вычисленных значений в нужном формате, в одну строку и без лишних пробелов. Спецификация формата (I3, A, $) означает, что вначале выводится целое число в десятичном формате, шириной ровно три символа, затем выводится строка, и наконец, $ подавляет перевод строки, используемый командой print по умолчанию, так что все выводится в одну строку. Отметим, что в диалекте спецификатор формата $ не является стандартным; программа работает, но при компиляции выводит предупреждение об этом.

    program Fibonacci integer :: f1 , f2 , f3 , i i = 1 f1 = 0 f2 = 1 do f3 = f2 + f1 f1 = f2 f2 = f3 i = i + 1 if (f1 < 10 ) then print "(I1, A, $)" , f1 , ", " elseif (f1 < 100 ) then print "(I2, A, $)" , f1 , ", " else print "(I3, A, $)" , f1 , ", " end if if (i == 17 ) then exit end if end do print * , "..." end program Fibonacci

    Квадратное уравнение:

    Пример для версий g95 0.93 , gfortran 4.5.0

    В примере используется встроенный тип данных complex . // — оператор конкатенации строк. Число перед скобками в описании формата означает количество раз, которые повторяется формат в скобках (в данном случае дважды — для первого и второго корней).

    program Quadratic integer :: a , b , c real :: d , p1 , p2 complex :: cp2 read (* , * ), a if (a == 0 ) then write (* , * ) "Not a quadratic equation" stop end if read (* , * ) b read (* , * ) c d = b * b - 4 * a * c p1 = - b / 2.0 / a if (abs (d ) < 1.0e-9 ) then write (* , "(A, F8.3)" ) "x = " , p1 elseif (d > 0 ) then p2 = sqrt (d ) / 2.0 / a write (* , "(2(A, F8.3))" ) "x1 = " , p1 + p2 , char (13 ) // char (10 ) // "x2 = " , p1 - p2 else cp2 = sqrt (cmplx (d )) / 2.0 / a write (* , "(2(A, F8.3, F8.3), A)" ) "x1 = (" , p1 + cp2 , ")" // char (13 ) // char (10 ) // "x2 = (" , p1 - cp2 , ")" end if end

    Hello, World!:

    Пример для версий f2c 20090411 , g95 0.93 , gfortran 4.5.0

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

    Первая строка дает этому фрагменту кода имя HELLO и указывает на то, что он является основной программой. Имя программы подчиняется тем же правилам, что и любые имена идентификаторов, т.е. должно начинаться с буквы и содержать не более 6 символов.

    Команда WRITE реализует вывод на печать. В скобках передается список управляющих параметров, настраивающих вывод: UNIT выбирает файл вывода (по умолчанию — консоль), FMT — формат вывода. Звездочки означают параметры по умолчанию. Имена параметров передавать не обязательно, сокращенно эта же команда выглядела бы как WRITE (*, *) ... .

    В большинстве реализаций строковая константа может заключаться как в одинарные кавычки, так и в двойные.

    A simple Hello, World! program PROGRAM HELLO WRITE (UNIT =* , FMT =* ) "Hello, World!" END

    Факториал:

    Пример для версий f2c 20090411 , g95 0.93 , gfortran 4.5.0

    Этот пример написан в фиксированном формате (стиль FORTRAN 77) и использует итеративное вычисление факториала.

    Fortran позволяет пропускать объявления переменных; в таком случае он выводит их типы сам, но, в отличие от более поздних языков, не по контексту использования переменной, а по ее имени — если первая буква названия I..N, выбирается тип INTEGER , иначе — REAL . В данном случае обе переменные целые.

    Цикл DO в данном случае соответствует циклу FOR более поздних языков: счетчик цикла N последовательно пробегает все значения от 0 до 16. Тело цикла заканчивается на строке с меткой 1 , которая указана в заголовке цикла.

    Команда PRINT использует формат вывода по умолчанию, который варьируется в зависимости от используемого компилятора.

    PROGRAM) C . Из-за этого после посимвольного заполнения строки CC , содержащей результат, остаток строки приходится заполнять пробелами вручную.

    Проверка того, что очередной символ исходной строки является буквой, слишком длинна, чтобы поместиться в одну строку (все символы строки программы, начиная с 73-ей позиции, игнорируются), поэтому ее приходится разбивать на две строки и отмечать вторую как продолжение первой (любым символом в 6 позиции).

    Операторы сравнения в FORTRAN 77 записываются как.LE. , .GE. и т.д. из-за того, что символы > и < не входят в набор символов языка; они были добавлены только в Fortran 90.

    PROGRAM CAMELC CHARACTER TEXT * 30 , CC * 30 LOGICAL LSPACE READ (* , "(A)" ) TEXT NCC = 0 LSPACE = .TRUE. DO 1 , I = 1 , LEN (TEXT ) NC = ICHAR (TEXT (I : I )) IF (NC .GE. 65 .AND. NC .LE. 90 .OR. > NC .GE. 97 .AND. NC .LE. 122 ) THEN IF (LSPACE ) THEN IF (NC .GE. 97 .AND. NC .LE. 122 ) THEN NC = NC - 32 END IF ELSE IF (NC .GE. 65 .AND. NC .LE. 90 ) THEN NC = NC + 32 END IF END IF NCC = NCC + 1 CC (NCC : NCC ) = CHAR (NC ) LSPACE = .FALSE. ELSE LSPACE = .TRUE. END IF 1 CONTINUE DO 2 , I = NCC + 1 , LEN (CC ) 2 CC (I : I ) = " " WRITE (* , * ) CC END