]]> ]]>

FORTRAN 77

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

После выпуска стандарта FORTRAN 66 разработчики компиляторов дополняли свои реализации языка новыми возможностями. В свою очередь, это привело к пересмотру стандарта в 1977 году, и в апреле 1978 был принят новый стандарт языка, известный как FORTRAN 77. Он добавил многие существенные возможности и устранил ряд недостатков FORTRAN 66:

  • блок оператора IF ... END IF был расширен поддержкой ELSE и ELSE IF для улучшения стиля структурного программирования;
  • расширен цикл DO;
  • введены операторы OPEN, CLOSE, INQUIRE для улучшения ввода/вывода;
  • прямой доступ для операций файлового ввода/вывода;
  • введен оператор IMPLICIT, позволяющий изменить правила вывода типа переменной по ее названию;
  • расширены возможности типа CHARACTER;
  • введен оператор PARAMETER для определения именованных констант;
  • введен ряд встроенных средств для сравнения ASCII строк.

Достоинства FORTRAN 77:

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

Главные проблемы до FORTRAN 77:

  • коллизии согласования имен данных и подпрограмм при линейной структуре программы;
  • статическое распределение памяти;
  • отсутствие возможности создания новых типов.

Формально устаревшие много лет назад компиляторы FORTRAN 77 до сих пор используются, главным образом для компилирования унаследованного кода.

Следующий стандарт Fortran 90 был издан спустя много лет, что способствовало развитию других языков программирования. Например, за это время языки C и C++ стали очень популярными в традиционной области FORTRAN: научных и технических вычислениях.

Типичная структура программы на FORTRAN 77

    PROGRAM NAME1

    CALL NAME2

    END

    SUBROUTINE NAME2

    COMMON /SS/x,y,z

    END

    :.

    SUBROUTINE NAMEn

    COMMON /SS/a,b,c

    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 FACTOR
        NF = 1
        DO 1,N = 0,16
          PRINT *, N, "! =", NF
1         NF = NF * (N + 1)
      END

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

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

Этот пример демонстрирует использование массивов в Fortran. Индексация элементов начинается с 1.

      PROGRAM FIBONACCI
        INTEGER FIB(20)
        FIB(1) = 0
        FIB(2) = 1
        DO 1,N = 2,17
          PRINT "(I3, A, $)", FIB(N), ", "
1         FIB(N + 1) = FIB(N) + FIB(N - 1)
        PRINT *, "..."
      END

CamelCase:

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

Строки в Fortran имеют фиксированную длину, задаваемую при объявлении строки. Если длина фактического содержимого строки меньше, чем размер строки, ее остаток дополняется пробелами или “мусорными” символами. Кроме того, в Fortran нет символа “конца строки”, как в 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

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам