Основные особенности языка и руководство по использованию компилятора CONVEX FORTRAN

Илюшкин Б. И.



Введение

Язык высокого уровня CONVEX FORTRAN является расширением стандарта FORTRAN 77 (ANSI X 3.9-1978) с учетом особенностей архитектуры семейства компьютеров Convex с1, с2, с3 серий.

CONVEX FORTRAN повышает производительность выполнения программы за счет использования локальной и глобальной оптимизации, векторизации и параллелизации.

1 Основные элементы языка

Алфавит и имена переменных

Стандартный алфавит FORTRAN 77

  A - Z   -   буквы
  0 - 9   -   цифры
  пробел = + - * / ( ) ' , . : $   -  специальные символы

Расширение CONVEX FORTRAN

  a - z   -   буквы
  ! % &  " _ <  >  # ; Tab            -  специальные символы
Все другие ASCII символы могут применяться только в символьных или холлеритовых константах. Пробелы используются для удобочитаемости программ. Они игнорируются компилятором, если не находятся внутри символьной или холлеритовой константы. Буква С или знак * в 1-ом столбце являются признаками строки комментария. Знак ! в любом столбце (кроме 6-ого) означает, что оставшаяся часть строки является комментарием. Знак ; используется для отделения двух операторов в одной строке.

Имена переменных, массивов, функций должны начинаться с буквы. Последующими символами могут быть буквы обоих регистров, цифры, символы _ или $. Компилятор преобразует строчные буквы в прописные. Например, имена 'ABC' и 'abc' идентичны. Максимальная длина имени - 42 символа.

Типы данных.

CONVEX FORTRAN поддерживает пять основных типов данных стандарта ANSI FORTRAN 77: CHARACTER, COMPLEX, INTEGER, LOGICAL, REAL. Дополнительно поддерживается производный тип RECORD.

CONVEX процессор поддерживает в качестве основных четыре формата данных типа INTEGER (с фиксированной точкой со знаком) и два формата данных типа REAL (с плавающей точкой со знаком) [ ]:

   INTEGER*1      -  байт (8 бит)
   BYTE

   INTEGER*2      -  полуслово (16 бит)

   INTEGER*4      -  слово (32 бита)
   INTEGER

   INTEGER*8      -  длинное слово (64 бита)

   REAL*4         -  слово (ординарная точность)
   REAL

   REAL*8         -  длинное слово (двойная точность)

Таблица типов данных CONVEX FORTRAN

----------------------------------------------------------------------
Тип данных          Диапазон значений                    Точность
                      представления
----------------------------------------------------------------------
INTEGER*1            [-128  +127]                         3 знака
   BYTE

INTEGER*2          [-32768  +32767]                       5 знаков

INTEGER*4          [-2,147,483,648]                       7 знаков
INTEGER             +2,147,483,647]
                   [-2**31  +2**31]

INTEGER*8      [-9,223,372,036,854,775,808               15 знаков
                +9,223,372,036,854,775,807]
                   [-2**63   +2**63]

REAL             [-1,7014117*10**(+38)                    7 знаков
REAL*4            -2,9387359*10**(-39)],              (длина мантиссы
                   0,                                    23 разряда)
                  +2,9387359*10**(-39)
                  +1,7014117*10**(38) ]

REAL*8       [-8,988,465,674,311,579*10**(+307)           15 знаков
DOUBLE        -5,562,684,646,268,003*10**(-309)],     (длина мантиссы
PRECISION                   0,                            52 разряда)
              +5,562,684,646,268,003*10**(-309)
              +8,988,465,674,311,579*10**(+307)]

REAL*16   [8,405,257,857,780,233,765,656,694,543,304,390*10**(-4933)
           5,948,657,476,786,158,825,428,796,633,140,034*10**(+4931)
                                                          33 знака
                                                      (длина мантиссы
                                                        112 разрядов)

COMPLEX*8       вещественная часть как    REAL*4         7 знаков
COMPLEX         мнимая часть как          REAL*4      (вещественная)
                                                          7 знаков
                                                          (мнимая)

COMPLEX*16        вещественная часть как  REAL*8          15 знаков
DOUBLE COMPLEX    мнимая часть как        REAL*8       (вещественная)
                                                          15 знаков
                                                          (мнимая)

LOGICAL*1         .FALSE.                             (все биты нули)
LOGICAL*2
LOGICAL*4         .TRUE.                            (все биты единицы)
LOGICAL*8

CHARACTER         1 байт
CHARACTER*l       l байт
CHARACTER*(*)     произвольная
----------------------------------------------------------------------
Примечания.
COMPLEX *8       - занимает в памяти два слова  REAL*4
COMPLEX            (одно для вещественной части, другое для мнимой)

COMPLEX *16      - занимает в памяти два длинных слова  REAL*8
DOUBLE COMPLEX     (одно для вещественной части, другое для мнимой)

Константы

Константы с двойной точностью (REAL*8, DOUBLE PRECISION) и повышенной точностью (REAL*16) представляются в экспоненциальной форме. В качестве буквы экспоненты используются соответственно D и Q. Пример: 3.8D3 5.4Q4 4Q2

Комплексная константа COMPLEX*8 состоит из упорядоченной пары констант типа INTEGER*2, INTEGER*4 или REAL*4, разделенных запятой и заключенных в круглые скобки.

Комплексная константа COMPLEX*16 состоит из упорядоченной пары констант типа INTEGER*2, INTEGER*4, REAL*4 или REAL*8, разделенных запятой и заключенных в круглые скобки. Пример: (1.6405D1, -1.6405D1)

Восьмеричные константы состоят из цифр в диапазоне от 0 до 7, заключенных в апострофы с буквой O на конце. Шестнадцатиричные константы состоят из шестнадцатиричных цифр в диапазоне от 0 до 9, A,...,F (a,...,f), заключенных в апострофы с буквой X на конце. Пример: '765'O '1a6'X 'abcff'X

Логические константы принимают два значения и допускают следующие формы:

	 T       F
	.T.     .F.
	.TRUE.  .FALSE.
Строка текстовой константы может быть ограничена апострофами или кавычками. Для представления апострофа внутри текстовой константы используются два апострофа. Пример: 'two"s complement' 'final' "begin"

2 Преобразования типов данных

Неявное преобразование типов

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

Правила преобразования типов

Обозначения:

Тип LOGICAL рассматривается как тип INTEGER той же длины. Тип INTEGER преобразуется в более короткий тип INTEGER путем усечения.

Пусть имеем присвоение I = II

Если II превышает границы диапазона целой константы J типа INTEGER, принятой по умолчанию (INTEGER*4 без использования специальных опций компилятора), значение II усекается до диапазона значений J.

Если II не превышает границ диапазона J, но превышает границы диапазона переменной I, значение II усекается до диапазона I. При этом, если II не является константой, компилятор не выдает предупреждений. Если II константа, компилятор выдает предупреждение: ``Warning : integer constant too large for default length''

Усечение II производится согласно (1) или (2) путем ее увеличения (уменьшения) на величину k, кратную ширине диапазона значений типа переменной I. Величина k определяется из (3) или (4).

	I(1) = II                                 (1)
	I(k) = II - k*2**(n) , k >  1
    Условие выбора k:
	I(k-1) >  2**(n-1) - 1                     (3)
	I(k)   <  2**(n-1) -1

	I(1) = II                                 (2)
	I(k) = II + k*2**(n) , k >  1
    Условие выбора k:
	I(k-1) <  -2**(n-1)                        (4)
	I(k)   >  -2**(n-1)

	I(k) - усеченное значение II
          n  - количество бит I
Усечение для целых и вещественных чисел осуществляются по-разному.

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

Пример

	INTEGER*1 I1
	INTEGER*2 I2,J2
	I1=-260
	I2=32770
	J2=10**30+1
	PRINT *,'I1=',I1,'I2=',I2,'J2=',J2
	STOP
	END
Результат
	I1= -4     I2= -32776     J2=    1

  ( I1=-260+[127+128+1]=-4
    I2=32770-[32767+32768+1]=-32776 )
Тип INTEGER преобразуется в более длинный тип INTEGER путем расширения поля точности (числа позиций)

		II=I
Тип INTEGER преобразуется в более короткий тип REAL путем усечения младших разрядов (крайних правых), выходящих за границу диапазона точности переменной R

		R=II
Пример
	INTEGER*4 I4
	INTEGER*8 I8,J2
	REAL*4 R4,S4
	I4=82762035
	I8=9223372036854775807
	R4=I4
	S4=I8
	PRINT *,'R4=',R4,'S4=',S4
	STOP
	END
Результат
	R4= 8.2762032E+07          S4= 9.2233720E+18
Так как 82762035 выходит за границу точности REAL*4 (7 знаков), младший разряд в двоичном представлении усекается.

Тип INTEGER преобразуется в более длинный тип REAL путем расширения поля точности и заполнения нулями свободных позиций в мантиссе

		RR=I
Пример
	INTEGER*2 I2
	REAL*4 R4
	I2=-32766
	R4=I2
	....................
	....................
Результат
	R4= -32766.00
Тип REAL преобразуется в эквивалентный или более длинный тип INTEGER путем усечения до целой части числа (отбрасывания дробной части) и расширения размера поля
		I=R
		II=R
Тип REAL преобразуется в более короткий тип INTEGER путем усечения
		I=RR
Если RR константа, превышающая границы диапазона вещественной константы типа REAL, принятой по умолчанию,компилятор выдает сообщение об ошибке ``Error: Real constant either too large or too small''

Если RR константа или арифметическое выражение,не превышающие границы диапазона вещественной константы типа REAL, принятой по умолчанию, но превышающая границы диапазона переменной I, значение RR усекается до диапазона значений I.

Если RR арифметическое выражение, превышающее границы диапазона вещественной константы типа REAL, компилятор не выдает никаких сообщений. При запуске на счет выдается сообщение: ``*** Floating Point Exception: Floating point overflow: at ....''

Тип REAL преобразуется в тип REAL более низкой точности путем округления (до диапазона точности)

		R=RR
Если RR вещественная константа,превышающая границы диапазона вещественной константы типа REAL, принятой по умолчанию, компилятор выдает сообщение об ошибке ``Error: Real constant either too large or too small''

Тип REAL преобразуется в тип REAL более высокой точности путем добавления нулей в мантиссе в соответствии с типом точности переменной RR

		RR=R
При зтом точность преобразованной величины RR не увеличивается.

Пример

	REAL*4 A4,B4
	REAL*8 A8
	A8=2.345678912345679E+20
	B4=A8
	A4=2.3456789E+08
	A8=A4
	....................
	....................
Результат
	B4= 2.3456789E+20
	A8= 234567888.000000
Тип COMPLEX преобразуется в некомплексный тип путем преобразования только действительной части

		I = C
		R = C
Тип некомплексный преобразуется в тип COMPLEX путем преобразования в соответствующий тип REAL действительной части. При этом мнимой части присваивается значение 0.0 или 0.0D0

		C = I
		C = R
Тип COMPLEX преобразуется в тип COMPLEX путем преобразования отдельно действительной и мнимой частей по правилам преобразования типов REAL.

Явное преобразование типов

Явное преобразование типов осуществляется путем обращения к встроенным функциям CONVEX FORTRAN [2,D].

Обозначения типов аргументов, используемые в таблице функций преобразования типов:

	h - INTEGER*1
	i - INTEGER*2
	j - INTEGER*4
	k - INTEGER*8
	l - LOGICAL*4
	r - REAL*4
	d - REAL*8
	c - COMPLEX*8
	q - REAL*16
	z - COMPLEX*16
	s - CHARACTER*N
	v - vector

       Таблица встроенных функций преобразования типов данных
---------------------------------------------------------------
              Тип          Тип
Название   аргумента     результата      Пример
---------------------------------------------------------------
       Ближайшее целое

ININT         r            i          r=3.87
              vr           vi         ININT(r)=4
JNINT         r            j          r=4.49
              vr           vj         JNINT(r)=4
KNINT         r            k
              vr           vk
IIDNT         d            i
              vd           vi
JIDNNT        d            j
              vd           vj
KIDNNT        d            k
              vd           vk
ANINT         r            r          r=4.49
              vr           vr         ANINT(r)=4.000000
DNINT         d            d          d=4.49
              vd           vd         DNINT(d)=4.00000000000000
IIQNNT        q            i
              vq           vi
JIQNNT        q            j
              vq           vj
KIQNNT        q            k
              vq           vk
QNINT         q            q
              vq           vq

       Преобразование целых в целые
INT1          vi           vh         i=-260
              vj           vh         INT1(i)=-4
              vk           vh
INT2          vh           vi
              vj           vi
              vk           vi
INT4          vh           vj
              vi           vj
              vk           vj
INT8          vh           vk
              vi           vk
              vj           vk

       Преобразование вещественных в целые
INT1(IINT)    vr           vh         r4=-260.7
IINT,IIFIX    r            i          INT1(r4)=-4
              vr           vi
JINT,JIFIX    r            j
              vr           vj
KINT,KIFIX    r            k
              vr           vk
INT1(IIDINT)  vd           vh
IIDINT        d            i
              vd           vi
JIDINT        d            j
              vd           vj
KIDINT        d            k
              vd           vk
IIQINT        q            i
              vq           vi
JIQINT        q            j
              vq           vj
KIQINT        q            k
              vq           vk

       Преобразование REAL*4 в REAL*8
DBLE          r            d
              vr           vd

       Преобразование REAL*8 в REAL*4
SNGL          d             r         R8= 1.123456789897
              vd            vr        SNGL(R8)= 1.123457

       Преобразование REAL*4 в REAL*16
QEXT          r            q
              vr           vq

       Преобразование REAL*8 в REAL*16
QEXTD         d            q
              vd           vq

       Преобразование REAL*16 в REAL*8
DBLEQ         q            d
              vq           vd

       Преобразование REAL*16 в REAL*4
SNGLQ         q            r
              vq           vr

       Преобразование целых в вещественные
FLOATI(INT2)  vh        vr
DFLOATI(INT2) vh        vd
QFLOATI(INT2) h         q
              vh           vq
FLOATI        i         r
              vi           vr
DFLOTI        i         d
              vi           vd
QFLOTI        i         q
              vi           vq
FLOATJ        j         r
              vj           vr
DFLOTJ        j         d
              vj           vd
QFLOTJ        j         q
              vj           vq
FLOATK        k         r             K= 8223378976
              vk           vr         FLOAT(K)= 8.2233789E+09
DFLOTK        k         d
              vk           vd
QFLOTK        k         q
              vk           vq

              Целая часть вещественной
AINT          r            r          R=3.84
              vr           vr         AINT(R)=3.000000
DINT          d            d
              vd           vd
QINT          q            q
              vq           vq

              Вещественная часть комплексного
REAL,SNGL     c            c
DREAL,DBLE    z            z

              Мнимая часть комплексного
AIMAG         c            c
DIMAG         z            z
-------------------------------------------------------------------

Изменение точности типов данных

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

Задание опций в строке оператора OPTIONS распространяет их действие только на программный модуль, в котором оператор OPTIONS объявлен, при этом игнорируются опции командной строки компилятора. Строка OPTIONS должна быть первым оператором в программном модуле.

Пример

c   conversion of data types
       program t
       integer i4,j4 ; integer*8 i8,j8
       real a4,b4 ;
       i4=82762035
       i8= 9223372036854775807
       print *, 'i4= ',i4,' i8= ',i8
       i=i8 ; print *, '(i=i8) = ',i
       j8=10**30 ; print *, '(j8=10**30) = ',j8
       a4=i4 ; print *, '(a4=i4) = ',a4
       a4=i8 ; print *, '(a4=i8) = ',a4
       a4=234567891.234567891 ; print *,'a4= ',a4
       i=10**40+1 ; print *,'(i=10**40+1) =',i
       a4=2.1*(10.**40 ; print *,'(a4=2.1*(10.**40+1)) =',a4
       b4=2.1*(10**40+1) ; print *,' (b4= 2.1*(10**40+1)) =',b4
       b4=2.1E37; print *, '(b4= 2.1E37)=',b4
       stop
       end
Результат запуска программы без опции -pd8
 i4=     82762035 i8=    9223372036854775807
 (i=i8) =           -1
 (j8=10**30) =             1073741824
 (a4=i4) =   8.2762032E+07
 (a4=i8) =   9.2233720E+18
  a4=   2.3456789E+08
 (i=10**40+1) =           1
 (b4= 2.1*(10**40+1)) =   2.100000
 (b4= 2.1E37)=  2.1000000E+37

Результат запуска программы с опцией -pd8

 i4=               82762035 i8=    9223372036854775807
 (i=i8) =    9223372036854775807
 (j8=10**30) =    5076944270305263616
 (a4=i4) =    82762035.0000000
 (a4=i8) =   9.223372036854777E+018
  a4=    234567891.234568
 (i=10**40+1) =  -5047021154770878463
 (a4=2.1*(10.**40+1)) =  2.100000000000000E+040
 (b4= 2.1*(10**40+1)) = -1.059874442501884E+019
 (b4= 2.1E37)=  2.100000000000000E+037
Арифметические выражения, присваиваемые переменным a4 и b4 отличаются отсутствием точки в основании степени 10, однако результат различный за счет неявного приведения типов.

Приоритеты

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

Таблица приоритетов операций

----------------------------------------------------------------
 Логические             Арифметические         Приоритет
----------------------------------------------------------------
.NOT.                   Обращение к функции     Высший
.AND.                   **
.OR.                    * /
.EQV.,.NEQV.(.XOR.)     * -                     Низший
----------------------------------------------------------------
Круглые скобки имеют наивысший приоритет.

Таблица приоритетов типов данных

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

-------------------------------------------------------------
 Порядок          Тип  данных
-------------------------------------------------------------
1.(низший)       LOGICAL*1, *2, *4, *8
2.               INTEGER*1, *2, *4, *8
3.        REAL*4 (REAL), *8 (DOUBLE PRECISION), *16
4.(высший)       COMPLEX*8 (COMPLEX), *16 (DOUBLE COMPLEX)
-------------------------------------------------------------
Приоритеты типов данных расположены от низшего к высшему (сверху вниз и слева направо).

Выражения смешанного типа

Таблица правил преобразования смешанных выражений

-----------------------------------------------------------
 Операнды                    Результат
-----------------------------------------------------------
 LOGICAL, INTEGER            INTEGER
 REAL*4, REAL*8              REAL*8
 REAL*8, COMPLEX*8           COMPLEX*16
-----------------------------------------------------------

Тип значения выражения устанавливается по типу результата последней выполненной операции. Точность результата операции определяется наибольшей точностью одного из операндов (наиболее длинного типа). Переменные типа LOGICAL рассматриваются как INTEGER при использовании в арифметических выражениях.

3 Операторы спецификации

Операторы спецификации - невыполняемые операторы,появляющиеся до первого исполняемого оператора программного модуля.

Оператор ALLOCATABLE

Объявляет выделяемые в динамической памяти массивы.Необходимо применение опций -f90 или -cfc в случае объявления выделяемых массивов в программе.

Имеет следующий вид:

           [type arrexp]

           ALLOCATABLE (arrexp [,...])
где type - необязательное объявление типа массива, arrexp - имя массива или объявление ранга, если имя массива не было объявлено в предшествующем операторе определения типа.

Память для выделяемых массивов динамически выделяется во время запуска программы на счет после выполнения оператора ALLOCATE и освобождается после выполнения оператора DEALLOCATE.

Пример

	INTEGER A(:) , B
	ALLOCATABLE (A, B(:,:) , X(:,:,:), I(:))
	. . . . . . . . . . . . . . . . . . . . .
	. . . . . . . . . . . . . . . . . . . . .
	ALLOCATE ( A(6), B(-9:0,0:9), X(5,10,-50:-40),I(10) )
	. . . . . . . . . . . . . . . . . . . . .
	. . . . . . . . . . . . . . . . . . . . .
	DEALLOCATE ( A, B, X, I )
	. . . . . . . . . . . . . . . . . . . . .

Оператор AUTOMATIC

Сохраняет переменные из заданного списка в стеке, а не в статической памяти. Необходимо применение опции -sfc (совместимость с Sun-Fortran).

Имеет следующий вид:

           AUTOMATIC varlist
где varlist - список переменных (разделенных запятыми), которые будут размещены в стеке.

Оператор STATIC

Сохраняет переменные из заданного списка в статической памяти, а не в стеке. Необходимо применение опции -sfc (совместимость с Sun-Fortran).

Имеет следующий вид:

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

Оператор COMMON

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

Имеет следующий вид:

           COMMON [/[cbn]/]  nlist  [  [,]/[cbn]/nlist  ]  ...
где cbn - символическое имя COMMON-блока, nlist - список имен переменных, массивов и объявлений массивов.

Оператор EQUIVALENCE

Определяет двум или более объектам в программном модуле ту же самую область памяти. Таким образом, на одну и ту же область памяти может ссылаться более чем одно имя.

Оператор имеет следующий формат:

           EQUIVALENCE (list) [, (list) ] ...
где list - список из двух или более переменных, элементов массива, имен массивов или символьной подстроки, разделенных запятыми.

Оператор EXTERNAL

Определяет символьное имя как имя пустой (фиктивной) процедуры или процедуры, определенной внешне. Указывает, что данное имя является именем подпрограммы,а не переменной или массива. Оператор EXTERNAL необходимо использовать для определения имен подпрограмм или фиктивных процедур, используемых в качестве фактических параметров при вызове функций или в операторе CALL.

Оператор имеет следующий формат:

           EXTERNAL n [,n] ...
где n - символьное имя пользовательской подпрограммы, подпрограммы block data или фиктивной процедуры.

Если в операторе EXTERNAL определяется имя встроенной функции в качестве имени внешней процедуры, все обращения к имени встроенной функции интерпретируются как обращения к внешней процедуре.

Пример

	EXTERNAL cos

Все обращения будут к внешней процедуре cos, а не к встроенной функции cos.

Оператор IMPLICIT

Отвергает неявные определения типов данных символьных имен в программном модуле.

Имеет следующий формат:

           IMPLICIT typ (a[,a]...) ...
или
           IMPLICIT NONE
где typ - INTEGER[*len], REAL[*len], DOUBLE PRECISION, DOUBLE COMPLEX, \break COMPLEX[*len], LOGICAL[*len], CHARACTER[*len] типы данных;

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

Оператор INCLUDE

Вставляет исходный код из заданного файла в компилируемую программу. Содержимое файла вставляется в то место, где объявляется оператор INCLUDE.

Оператор имеет следующий формат:

     INCLUDE 'filename'
или
     #include "filename"  (используется с Fortran preprocessor),
где filename - полный путь к файлу с исходным кодом.

Оператор INTRINSIC

Позволяет использовать имя вcтроенной функции в качестве фактического параметра.

Имеет следующий формат:

           INTRINSIC intrname [, intrname] ...
где intrname - одна из встроенных функций Fortran.

Следующие категории встроенных функций не могут быть использованы в качестве фактических параметров: преобразование типов (INT, IFIX, IDINT, REAL, FLOAT, SNGL, DBLE, СMPLX, ICHAR, CHAR); значения максимума-минимума (MAX, MAX0, AMAX1, AMAX0, MAX1, MIN, MIN0, AMIN1, DMIN1, AMIN0 и MIN1).

Оператор NAMELIST

Связывыает единственное уникальное имя со списком имен переменных или массивов. Это имя определяет список объектов, которые могут быть изменены (считаны) или переданы (записаны). Оператор имеет следующий формат:

           NAMELIST /nlgrpname/varlist...
где nlgrpname - символьное имя, представляющее список объектов, которые могут считываться или записываться; varlist - список переменных или имен массивов (разделенных запятыми), который будeт связан с символьным именем nlgrpname;

Оператор OPTIONS

Включение опций не указанных в командной строке компилятора или подавление опций указанных в командной строке компилятора. Опции в операторе OPTIONS игнорируют опции,заданные в командной строке вызова компилятора fc.

Оператор OPTIONS должен быть первым оператором в программном модуле. Его действие распространяется только на данный модуль.

Оператор имеет следующий формат:

           OPTIONS option [option...]
Пример
	OPTIONS  -O2  -r8
Определяет, что в данном программном модуле компиляция выполняется с уровнем оптимизации O2 и данные типа REAL размещаются в памяти как DOUBLE PRECISION.

Оператор PARAMETER

Присвоение символьного имени константе, используемой в программном модуле.

Имеет следующий формат:

        PARAMETER (name = exp[, name = exp] ...)
где name - символьное имя, exp - константа или константное выражение.

Оператор PROGRAM

Присвоение имени главной программе. Его использование не обязательно.

Имеет следующий формат:

           PROGRAM pgm
где 'pgm' - символьное имя главной программы.

Оператор SAVE

Сохранение значений указанных переменных и массивов в подпрограмме или функции после выполнения операторов RETURN или END. Описанные в операторе SAVE переменные и массивы не становятся неопределенными после завершения выполнения подпрограммы или функции. При следующем вызове подпрограммы или функции сохраненные объекты имеют прежние значения.

Оператор SAVE имеет следующий формат:

           SAVE [n [,n]... ]
где n - имя переменной, статического массива или именованного COMMON-блока, заключенное в слэши (например, /NCOM/).

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

Если оператор SAVE не содержит аргументов, то значения всех допустимых объектов сохраняются.

4 Компиляция и отладка

Опции компиляции

Команда fc для компиляции исходного текста CONVEX FORTRAN имеет следующий формат:

        fc [< options> ] < files> 
где < options> - одна или более опций компилятора, < files> - один или более исходных файлов CONVEX FORTRAN, объектных файлов, символьных файлов на ассемблере или библиотек.

Опции загрузчика задаются с помощью опции компилятора -W.

Опции компиляции можно задавать тремя способами: в командной строке компилятора fc, через переменную окружения FCOPTIONS и посредством оператора OPTIONS внутри программного FORTRAN модуля.

Переменная окружения FCOPTIONS используется для задания по умолчанию fc опций при каждом вызове компилятора. В оболочке csh FCOPTIONS могут быть инициализированы в .cshrc файле.

Пример:

	setenv  FCOPTIONS  " -nv -O3 "
Все программы будут компилироваться fc с использованием уровня оптимизации -O3 и все диагностические предупреждения будут подавляться.

Текущие значения переменных окружения данной shell-оболочки можно вывести при помощи следующей команды:

	printenv  FCOPTIONS

В случае конфликта между установленными опциями FCOPTIONS и опциями строки компилятора fc выдается предупреждение о противоречивых опциях и указывается какая опция выбирается окончательно (опция fc).

Опции оператора OPTIONS указываются в первой строке программного модуля FORTRAN и игнорируют опции строки компилятора fc и переменных окружения FCOPTIONS в случае конфликта.

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

Данные опции обеспечивают поддержку компилятором различных особенностей версий FORTRAN компиляторов:

Опции генерации кода

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

Опции отладки и профилирования

Опции данного раздела позволяют использовать исполняемые модули CONVEX FORTRAN совместно со средствами разработки программ:

Опции управления выдачей сообщений и листингов

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

Опции препроцессора

Опции, приведенные в этом разделе, касаются использования препроцессора:

Смешанные опции

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

p - препроцесор; c - компилятор; o - компилятор; a - ассемблер; l - загрузчик. Пример: Wl, -a,archive - вызов загрузчика для линкования с архивными библиотеками;

Литература


The file was converted from TeX source by FunnyTeX utility by Mike Krutikov