]]> ]]>

f2c

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

f2c — конвертер программ из FORTRAN 77 в C, созданный в Bell Laboratories. Написан на C. Сгенерированный код строго совместим с f77, который также написан на C; это позволяет обеспечить хорошую переносимость кода.

Использование f2c удобно в случаях, когда нужно использовать уже написанную программу на Fortran в отсутствие компилятора, или скомбинировать части программы на Fortran и C (например, когда определенные элементы гораздо проще реализовать на одном из языков). Преимуществами этого конвертера являются его доступность (распространяется бесплатно как свободное ПО), отлаженность и генерация достаточно качественного кода.

Код на С, полученный в результате использования f2c, может выглядеть несколько необычно, хотя авторы конвертера старались сделать его как можно более удобочитаемым. Например, ввод-вывод выполняется через библиотеку libf2c и выглядит очень громоздко. При компиляции этого кода в исполняемый файл следует подключать эту библиотеку при помощи опции -lf2c -lm.

f2cpp

Для повышения читаемости кода, сгенерированного f2c, Эдуардом Фоминым был создан проект f2cpp. Он дополняет f2c скриптом c2cpp, написанным на Python, который выносит повторяющиеся определения в коде в f2cpp.h и приводит код, в том числе процедуры ввода-вывода данных, к более простому виду. f2cpp распространяется под лицензией GNU GPL.

Примеры:

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

]]>

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