Параллельные вычисления в ИММ УрО РАН
 
 

Кратко о Фортране для программировавших на С

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

Рассмотрим основные характеристики языка.

1.     Программа имеет линейную структуру (программные единицы - подпрограммы и функции). Каждая программная единица должна иметь свое уникальное имя. Необходимо учитывать и имена программных единиц в присоединяемых библиотеках. Вызов программной единицы осуществляется оператором вызова CALL для подпрограмм или указателем функции для подпрограмм-функций.

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

В подпрограмму возможны дополнительные входы (оператор ENTRY)

2.     Каждый оператор начинается на отдельной строке. Возможно продолжение оператора на нескольких строках. Фиксирована структура оператора с меткой и позицией символа продолжения.

 

 

 

 

 

 

R

E

A

L

 

X

,

Y

 

 

 

 

 

 

 

.

 

 

 

 

 

 

 

G

O

T

O

 

5

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

5

 

X

=

7

7

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

1

2

3

 

Y

=

X

+

5

0

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

*

-

4

5

 

 

 

 

 

 

 

 

 

 

 

 

.

 

3.     Есть операторы описания (невыполняемые) и выполняемые операторы. Невыполняемые операторы в программной единице предшествуют выполняемым. Выполняемые операторы могут быть снабжены меткой (целое число).

4.     Описания задают имена и типы данных, их структуру. Возможны разные способы описания одних и тех же свойств данных.

Возможно не задавать явно типы данных. При отсутствии явного описания типа, система определяет его сама в соответствии с соглашениями об обозначениях для типов INTEGER и REAL.

Массив может описываться по разному.

Первый вариант

 

REAL X

 

DIMENSION X(100)

 

DO 2 I=1,100

 

X(I)=I**2

2

CONTINUE

 

Второй вариант

 

REAL X (100)

 

DO 2 I=1,100

 

X(I)=I**2

2

CONTINUE

 

Элементы массива располагаются по столбцам в отличие от других языков программирования.

5.     Данные и метки локализуются в программной единице

6. Ввод-вывод связывается с информационным каналом и файлом. Имеются возможности последовательного и прямого доступа к файлам.

Для ввода и вывода должен быть указан способ (формат) преобразования данных из символьной формы на вводе и в символьную форму на выводе.

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

I2 -целые из 2 позиций

F5.2 -вещественное из 5 символов, 2 цифры дробной части.

А5 - 5 алфавитных позиций

/ - переход на новую строку

И т.д.

7.     Большой набор встроенных функций и подпрограмм.

Среди функций имеются варианты для одинаковых действий с переменными разного типа, например

MAX, MAX0, AMAX1, AMAX0, DMAX1-поиск максимального для разных типов real*1 и integer*1 с результатом того же типа, для integer с результатом типа integer, для real*4 с результатом типа real*4, для integer с результатом типа real*4 и т.д.

Имеются функции преобразования из одного типа в другой

 

8. Примеры программ

Пример 1. Программа переводит по схеме Горнера целое число из символьного представления в двоичную систему счисления. Используется функция ICHAR.

 

INTEGER*4 s, n, is

 

CHARACTER*1 symb (12)

1

FORMAT (12A1)

5

FORMAT ('введите число: '\)

 

s = 0

 

PRINT 5

 

READ (5, 1) symb

 

IF (symb(1) .EQ. '-') THEN

 

is =-1

 

n = 2

 

ELSE IF (symb (1) .EQ. '+') THEN

 

is = 1

 

n = 1

 

ELSE

 

is = 1

 

n =1

 

END IF

3

IF (symb(n) .NE. ' ') THEN

 

s = s*10 + (ichar(symb(n))-ichar('0'))

 

n = n + 1

 

GOTO 3

 

ENDIF

2

PRINT * , ' целое число равно ', s+is

 

STOP

 

END

Пример 2.

 

REAL x, y

 

WRITE (6, '('' Вывод на устройство 6'')')

C

 далее открытие файла с предварительным созданием

 

OPEN (UNIT=6, FILE='SINUS', STATUS='NEW')

C

в операторе цикла указывается метка последнего оператора

 

DO 200 X=.6, 6.3, .1

 

Y=SIN(x)

 

WRITE (6, 100) X, Y

C

 далее формат, указывающий представление записываемых

C

 данных на носителе, при последующем чтении требуется его

C

соблюдение - представление первого числа занимает 3 символьных

C

 позиции на носителе, из них 1 - на изображение дробной части

100

FORMAT (F3.1,F5.2)

200

CONTINUE

 

CLOSE (6, , STATUS='KEEP')

C

 далее бесформатный вывод на консоль

 

WRITE (6, '(''Вывод значений функции в файл SINUS завершен'')')

 

STOP

 

END

9. Область действия имен

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

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

10. Оператор-функция

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

FF(X,Y)= X**2+Y**2

11. Имеются типы LOGICAL, COMPLEX, DOUBLE PRECISION:

LOGICAL для операций с логическими переменными, COMPLEX для операций с комплексными переменными,, DOUBLE PRECISION для операций с вещественными переменными, представляемыми с повышенной точностью по сравнению с типом REAL.

 

12. Операторы DATA, COMMON, EQUIVALENCE

Можно влиять на распределение памяти с помощью операторов COMMON, EQUIVALENCE. Оператор DATA устанавливает исходные данные.

Оператор DATA задает (рассылает) исходные значения данных сразу после загрузки программы в память до начала выполнения программы

INTEGER filen, fict, symb, coeff(100)

REAL list(4), eps(2), num (5), y (5, 5)

CHARACTER * 18, sos

DATA filen /0/, fict /3/

DATA symb /'A'/

DATA list /7.1,2*4.2, 7.1/, eps(1)/.00001/

C Инициализируются элементы матрицы у, раположенные ниже

С главной диагонали.

DATA ((y(j,i),i=1,j),j=1,5)/15*0/

DATA num/5*72.6475/

DATA coeff /100*0/

DATA sos (1:6), sos(7:12), sos(13:18)/3*'SOS!!!'/

Опратор COMMON задает общие для нескольких программных единиц блоки памяти. Каждая из подпрограмм размещает в этой памяти вообще говоря свой информационный материал, и тогда это способ экономии памяти. При необходимости можно авторам разных подпрограмм договориться о совместной обработке некоторых данных. Тогда COMMON будет служить средством передачи данных от одной подпрограммы к другой.

PROGRAM PROG

COMMON m, n, x, j(20)

COMMON /COM/ p(4)

:

END

SUBROUTINE SUB

COMMON mm, nn, xx, jdim(20)

COMMON /COM/ q(4)

:

END

Оператор EQUIVALENCE предписывает компилятору размещение объявленных данных в одной и той же памяти. Он может служить как средством экономии памяти, так и средством согласования обозначений в разных фрагментах программы.

CHARACTER*1 ch(6)

INTEGER*4 a,b,c

EQUIVALENCE (a,ch(1)),(b, c))

13. Передача параметров

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

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

14. Раздельная трансляция

Линейная структура программы обеспечивает возможность раздельной трансляции программных единиц. Загрузчик занимается согласованием местоположения в памяти программных единиц и блоков COMMON. В силу этого компилятор при обработке операторов вызова подпрограмм и функций не знает ни типов, ни количества параметров, ни размерности и размеров массивов. Поэтому отладка взаимодействия программных единиц затрудняется в Фортране по сравнению с таким языком как ПАСКАЛЬ, например.

15. Достоинства Фортрана 77

1.     Фортран хорош для программ с большими массивами и большим числом данных.

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

3.     Имеется большое количество библиотек подпрограмм численных методов для вычислительных задач

4.     Компиляторы Фотрана дают хорошее качество объектной программы благодаря простоте языка.

5.     В силу большого распространения Фортрана в системах программирования обычно оговорены связи с подпрограммами на других языках.

16. Главные проблемы в Фортран-программировании (до Fortran 77) :

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

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

 17. Информация о Фортране

Книг по Фортрану много (см. )

Фортран развивается, есть Фортран 90, Фортран HPF, Фортран 95 и будет дальнейшее развитие. Он живет с 1954 года.

Описание Фортрана 90 и описание Опций фортрана 77 для МВС имеются на сайте ИММ al1 в разделе информации о МВС.

Опции, управляющие работой компилятора F77 и редактора связей

Управление INCLUDE

Управление загрузчиком

Управление набором выходных данных

Управление памятью

Управление динамическим стеком

Управление представлением переменных

Управление границами слов

Управление выбором библиотек

Оптимизации

Общие опции

Управление компиляцией вызова

Отладка

Ловля ошибок

Профилирование

Управление Листингом

Например опции для отладки

-check_bounds

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

-check overflow

Генерирует код с проверкой переполнения целого.

-check power

Проверяет динамические ошибки операции возведения в степень для случаев 0.0**0.0 и <отрицательное значение>**<целое значение типа real > таким образом, что 0.0**0.0 есть 1.0 и (-3.0)**3.0 есть -27.0. При этом вызываются во время выполнения фатальные ошибки для этих случаев.

-check underflow

Включает контроль потери значимости и выдачу сообщения во время выполнения. При этом результат заменяется нулем 0, если Вы не определяете опцию -fpe3 или -fpe4 (см. опции).