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
]]>