CONVEX FORTRAN повышает производительность выполнения программы за счет использования локальной и глобальной оптимизации, векторизации и параллелизации.
A - Z - буквы 0 - 9 - цифры пробел = + - * / ( ) ' , . : $ - специальные символы
a - z - буквы ! % & " _ < > # ; Tab - специальные символыВсе другие ASCII символы могут применяться только в символьных или холлеритовых константах. Пробелы используются для удобочитаемости программ. Они игнорируются компилятором, если не находятся внутри символьной или холлеритовой константы. Буква С или знак * в 1-ом столбце являются признаками строки комментария. Знак ! в любом столбце (кроме 6-ого) означает, что оставшаяся часть строки является комментарием. Знак ; используется для отделения двух операторов в одной строке.
Имена переменных, массивов, функций должны начинаться с буквы. Последующими символами могут быть буквы обоих регистров, цифры, символы _ или $. Компилятор преобразует строчные буквы в прописные. Например, имена 'ABC' и 'abc' идентичны. Максимальная длина имени - 42 символа.
CONVEX процессор поддерживает в качестве основных четыре формата данных типа INTEGER (с фиксированной точкой со знаком) и два формата данных типа REAL (с плавающей точкой со знаком) [ ]:
INTEGER*1 - байт (8 бит) BYTE INTEGER*2 - полуслово (16 бит) INTEGER*4 - слово (32 бита) INTEGER INTEGER*8 - длинное слово (64 бита) REAL*4 - слово (ординарная точность) REAL REAL*8 - длинное слово (двойная точность)
----------------------------------------------------------------------
Тип данных Диапазон значений Точность
представления
----------------------------------------------------------------------
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 (одно для вещественной части, другое для мнимой)
Комплексная константа 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"
Тип 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.
Обозначения типов аргументов, используемые в таблице функций преобразования типов:
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 должна быть первым оператором в программном модуле.
Пример
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 при использовании в арифметических выражениях.
Имеет следующий вид:
[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 varlist
где varlist - список переменных (разделенных запятыми), которые будут размещены в стеке.
Имеет следующий вид:
STATIC varlist
где varlist - список переменных (разделенных запятыми), которые будут размещены в статической памяти.
Имеет следующий вид:
COMMON [/[cbn]/] nlist [ [,]/[cbn]/nlist ] ...
где cbn - символическое имя COMMON-блока, nlist - список имен переменных, массивов и объявлений массивов.
Оператор имеет следующий формат:
EQUIVALENCE (list) [, (list) ] ...
где list - список из двух или более переменных, элементов массива, имен массивов или символьной подстроки, разделенных запятыми.
Оператор имеет следующий формат:
EXTERNAL n [,n] ...
где n - символьное имя пользовательской подпрограммы, подпрограммы block data или фиктивной процедуры.
Если в операторе EXTERNAL определяется имя встроенной функции в качестве имени внешней процедуры, все обращения к имени встроенной функции интерпретируются как обращения к внешней процедуре.
Пример
EXTERNAL cos
Все обращения будут к внешней процедуре cos, а не к встроенной функции cos.
Имеет следующий формат:
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 'filename'
или
#include "filename" (используется с Fortran preprocessor),
где filename - полный путь к файлу с исходным кодом.
Имеет следующий формат:
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 /nlgrpname/varlist...
где nlgrpname - символьное имя, представляющее список объектов, которые могут считываться или записываться; varlist - список переменных или имен массивов (разделенных запятыми), который будeт связан с символьным именем nlgrpname;
Оператор OPTIONS должен быть первым оператором в программном модуле. Его действие распространяется только на данный модуль.
Оператор имеет следующий формат:
OPTIONS option [option...]
Пример
OPTIONS -O2 -r8Определяет, что в данном программном модуле компиляция выполняется с уровнем оптимизации O2 и данные типа REAL размещаются в памяти как DOUBLE PRECISION.
Имеет следующий формат:
PARAMETER (name = exp[, name = exp] ...)
где name - символьное имя, exp - константа или константное выражение.
Имеет следующий формат:
PROGRAM pgm
где 'pgm' - символьное имя главной программы.
Оператор SAVE имеет следующий формат:
SAVE [n [,n]... ]
где n - имя переменной, статического массива или именованного COMMON-блока, заключенное в слэши (например, /NCOM/).
Не разрешается использовать здесь имена формальных параметров, подпрограмм, функций, автоматических или динамически размещяемых массивов, объектов из COMMON блоков. В случае использования имени COMMON блока, все переменные и массивы в COMMON блоке сохраняются.
Если оператор SAVE не содержит аргументов, то значения всех допустимых объектов сохраняются.
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 в случае конфликта.
target архитектура для компиляции
-------------------------------------
c1 CONVEX C1 серия
c2 CONVEX C2 серия
c32 CONVEX C3200 серия
c34 CONVEX C3400 серия
c38 CONVEX C8400 серия
c4 CONVEX C4600 серия
В случае задания target используются инструкции адресуемого компьютера независимо от того, на каком компьютере запущен компилятор.
p - препроцесор; c - компилятор; o - компилятор; a - ассемблер; l - загрузчик. Пример: Wl, -a,archive - вызов загрузчика для линкования с архивными библиотеками;