Fortran 编译器 f95 可编译大多数传统的 FORTRAN 77 程序,其中包括以前使用 f77 编译器编译的、使用非标准扩展的程序。
f95 可直接接受很多 FORTRAN 77 功能。其他功能要求在 FORTRAN 77 兼容性模式 (f95 -f77) 下进行编译。
本章介绍 f95 接受的 FORTRAN 77 功能,并列出了那些与 f95 不兼容的 f77 功能。有关 f77 编译器接受的任何非标准 FORTRAN 77 扩展的详细信息,请参见位于以下网址的《FORTRAN 77 Language Reference 》手册:http://docs.sun.com/source/806-3594/index.html。
有关 f95 编译器接受的其他 Fortran 语言扩展的信息,请参见第 4 章。
f95 可编译符合标准的 FORTRAN 77 程序。要确保持续的可移植性,使用非标准 FORTRAN 77 功能的程序应该迁移到符合标准的 Fortran 95/2003。使用 -ansi 选项进行编译,会标出程序中所有不符合标准的用法。
f95 可直接接受或在 -f77 兼容性模式下编译时接受 FORTRAN 77 编译器 f77 的以下非标准功能:
源代码格式
续行可以在第一列中以 ’&’ 开头。[-f77=misc]
include 文件中的第一行可以是续行。[-f77=misc]
使用 f77 制表符格式。[-f77=tab]
制表符格式可以将源代码行扩展到第 72 列以后。[ -f77=tab]
如果字符串扩展到续行上,则 f95 制表符格式不会将字符串一直填充到第 72 列。[-f77]
I/O:
在 Fortran 95 中,可以使用 ACCESS='APPEND' 打开文件。
列表式输出使用与 f77 编译器类似的格式。[-f77=output]
f95 允许对直接访问文件使用 BACKSPACE,但不允许使用 ENDFILE。
f95 允许在格式编辑描述符中隐式指定字段宽度。例如,允许使用 FORMAT(I)。
f95 可识别输出格式中的 f77 转义序列(例如, \n \t \')。[-f77=backslash.]
f95 可识别 OPEN 语句中的 FILEOPT=。
f95 允许使用 STATUS='KEEP' 来关闭 SCRATCH 文件 [-f77]。在程序退出时,不会删除临时文件。在使用 -f77 进行编译时,也可以使用 FILE=name 来打开 SCRATCH 文件。
允许对内部文件使用直接 I/O。[-f77]
f95 可识别 FORTRAN 77 格式编辑描述符 A、$ 和 SU。[-f77]
FORM='PRINT' 可以出现在 OPEN 语句中。[-f77]
f95 可识别传统的 FORTRAN 输入/输出语句 ACCEPT 和 TYPE。
使用 -f77=output 进行编译可写入 FORTRAN 77 样式的 NAMELIST 输出。
在仅指定 ERR=(没有 IOSTAT= 或 END= 分支)的情况下,当检测到 EOF 时,READ 将 ERR= 分支作为 END= 处理。[-f77]
在 OPEN 语句中,接受 VMS Fortran NAME=’filename ’。[-f77]
f95 接受 READ() 或 WRITE() 后面的一个额外逗号。[-f77]
END= 分支可以出现在具有 REC= 的直接访问 READ 中。[-f77=input]
允许使用格式编辑描述符 Ew.d.e,并将其作为 Ew.d.Ee 处理。[-f77]
可以在输入语句的 FORMAT 中使用字符串。[-f77=input]
IOSTAT= 说明符可以出现在 ENCODE/DECODE 语句中。
在 ENCODE/DECODE 语句中允许使用列表式 I/O。
在 I/O 语句中用作逻辑单元时,星号 (*) 可用于表示 STDIN 和 STDOUT。
数组可以出现在 FMT= 说明符中。[-f77=misc]
PRINT 语句接受名称列表组名称。[-f77=output]
编译器接受 FORMAT 语句中多余的逗号。
在执行 NAMELIST 输入时,如果输入问号 (?),则会以正在读取的名称列表组的名称响应。[-f77=input]
数据类型、声明和用法:
在程序单元中,IMPLICIT 语句可以放在单元中任何其他声明语句的后面。
f95 接受 IMPLICIT UNDEFINED 语句。
f95 接受 AUTOMATIC 语句(FORTRAN 77 扩展)。
f95 接受 STATIC 语句,处理方式与 SAVE 语句一样。
f95 接受 VAX STRUCTURE、UNION 和 MAP 语句。(请参见4.4 STRUCTURE 和 UNION (VAX Fortran))
LOGICAL 和 INTEGER 变量可以互换使用。[-f77=logical]
INTEGER 变量可以出现在条件表达式(如 DO WHILE)中。[-f77=logical]
Cray 指针可以出现在内部函数调用中。
f95 可接受在类型声明中使用斜杠的数据初始化。例如: REAL MHW/100.101/, ICOMX/32.223/
f95 允许将 Cray 字符指针赋值给非指针变量,以及其他非字符指针的 Cray 指针。
f95 允许将同一个 Cray 指针指向不同类型大小(例如,REAL*8 和 INTEGER*4)的项。
在将 Cray 指针声明为 POINTER 的同一程序单元中,可以将其声明为 INTEGER。INTEGER 声明将被忽略。[-f77=misc]
Cray 指针可以用于除法和乘法运算。[-f77=misc]
ASSIGN 语句中的变量可以是 INTEGER*2 类型。[-f77=misc]
交替的 RETURN 语句中的表达式可以是非整型。[-f77=misc]
具有 SAVE 属性的变量可以与 COMMON 块的元素等效。
相同数组的初始化函数可以是不同的类型。示例: REAL*8 ARR(5) /12.3 1, 3, 5.D0, 9/
名称列表项的类型声明可以放在 NAMELIST 语句后面。
f95 接受 BYTE 数据类型。
f95 允许将非整数用作数组下标。[-f77=subscript]
f95 允许将关系运算符 .EQ. 和 .NE. 用于逻辑操作数。[-f77=logical]
f95 可接受传统的 f77 VIRTUAL 语句,并将它作为 DIMENSION 语句处理。
可以采用与 f77 编译器兼容的方式,对不同的数据结构进行等效处理。[-f77=misc]
与 f77 编译器类似,f95 允许在 PARAMETER 语句的初始化表达式中出现许多内部函数。
f95 允许将整数值赋值给 CHARACTER*1 变量。[-f77=misc]
BOZ 常量可用作指数。[-f77=misc]
可以将 BOZ 常量赋值给字符变量。例如: character*8 ch ch ="12345678"X
BOZ 常量可以用作内部函数调用的参数。[-f77=misc]
可以使用 DATA 语句中的整数值来初始化字符变量。变量中的第一个字符将被设置为该整数值,而字符串的其余部分将填充空白(如果字符串多于一个字符的话)。
可以将霍尔瑞斯字符的整数数组用作格式描述符。[-f77].
如果常量折叠产生浮点异常,则在编译时不进行常量折叠。[-f77=misc]
在使用 -f77=misc 进行编译时,f95 将以 f77 编译器的方式,将赋值、数据和参数语句中的 REAL 常量自动提升为适当的种类(REAL*8 或 REAL*16)。[-f77=misc]
在赋值 GOTO 中允许使用等价变量。[-f77]
可以将非常量字符表达式赋值给数值变量。
如果使用 -f77=misc 进行编译,则允许在类型声明中将 *kind 放在变量名称后面。[-f77=misc]。 例如 REAL Y*4, X*8(21)) INTEGER FUNCTION FOO*8(J)
字符子串可以作为隐含 DO 目标出现在 DATA 语句中。[-f77=misc] 例如: DATA (a(i:i), i=1,n) /n*’+’/
括号内的整数表达式可以作为类型大小出现。例如: PARAMETER (N=2) INTEGER*(N+2) K
程序、子例程、函数和可执行语句:
f95 不要求 PROGRAM 语句具有 name。
CALL 语句可以将函数当作子例程进行调用。[-f77]
对函数不一定要定义其返回值。[-f77]
交替返回说明符(*label 或 &label)可以出现在实际参数列表中,也可以出现在不同位置上。[-f77=misc]
%VAL 可用于类型为 COMPLEX 的参数。[-f77=misc]
可以使用 %REF 和 %LOC。[-f77=misc]
子例程可以递归调用其自身,而无需使用 RECURSIVE 关键字对自身进行声明。[-f77=misc] 但是,还应该使用 -xrecursive 标志对执行间接递归(例程 A 调用例程 B,而例程 B 又调用例程 A)的程序进行编译以使其正常工作。
即使当哑元参数列表中没有交替返回列表时,也可以调用具有交替返回的子例程。
如果使用 -f77=misc 进行编译,可以使用非 INTEGER 或 REAL 类型的参数来定义语句函数;实际参数将转换为语句函数所定义的类型。[-f77=misc]
允许使用空实际参数。例如:CALL FOO(I,,,J) 在第一个 I 和最后一个 J 参数之间使用了两个空参数。
f95 将函数 %LOC() 调用作为 LOC() 调用处理。[-f77=misc]
允许在其他运算符(如 ** 或 *)后面使用一元加号和一元减号。
即使第一个参数的类型是 COMPLEX,也允许 CMPLX() 内部函数使用第二个参数。在这种情况下,使用第一个参数的实部。[-f77=misc]
允许 CHAR() 内部函数的参数超过 255,并且只生成警告而不生成错误。[-f77=misc]
允许移位计数为负,并且只生成警告而不生成错误。
在当前目录中以及 -I 选项指定的目录中搜索 INCLUDE 文件。[-f77=misc]
允许进行连续的 .NOT. 运算,例如 .NOT..NOT..NOT.(I.EQ.J)。[-f77=misc]
其他
f95 通常不会将进度消息发送到标准输出。而 f77 编译器则发送进度消息,并显示它所编译的例程的名称。在使用 -f77 兼容性标志进行编译时,保留了这一约定。
f77 编译器编译的程序并不捕获运算异常,而是在退出时自动调用 ieee_retrospective 来报告在执行过程中可能发生的任何异常。如果使用 -f77 标志进行编译,可模拟 f77 编译器的这种行为。缺省情况下,f95 编译器捕获遇到的第一个运算异常,并且不调用 ieee_retrospective。
在需要更高精度的上下文中,f77 编译器处理 REAL*4 常量的方式就好像它具有更高的精度一样。 在使用 -f77 标志进行编译时,如果将 REAL*4 常量与双精度或四精度操作数一起使用,则 f95 编译器允许该常量相应地具有双精度或四精度。
允许在循环中重新定义 DO 循环变量。[-f77=misc]
显示所编译的程序单元的名称。[-f77=misc]
允许在 DIMENSION 语句之后声明 DIMENSION 语句中使用的变量类型。示例:
SUBROUTINE FOO(ARR,G) DIMENSION ARR(G) INTEGER G RETURN END |
有关非标准语言扩展的语法和语义的详细信息,请参见位于以下网址的《FORTRAN 77 Language Reference》:http://docs.sun.com/source/806-3594/index.html。
下面列出了在使用此发行版的 f95 编译和测试传统 f77 程序时出现的已知不兼容问题。这些问题是由于 f95 中缺少相当的功能或者行为方式不同造成的。下列各项是 f77 中支持的 Fortran 77 非标准扩展,但它们在 f95 中不受支持。
源代码格式
在指定 -f77 选项时,如果名称长度超过 6 个字符,则会发出 ANSI 警告。
I/O:
f95 不允许对直接访问文件使用 ENDFILE。
f95 无法识别在直接访问 I/O 中指定记录编号时使用的 'n 格式:READ (2 ’13) X,Y,Z
f95 无法识别传统 f77 "R" 格式编辑描述符。
f95 不允许在 CLOSE 语句中使用 DISP= 说明符。
不允许在 WRITE 语句中使用位常量。
Fortran 95 NAMELIST 不允许使用长度可变的数组和字符串。
使用 RECL=1 打开的直接访问文件不能用作“流”文件。请改用 FORMAT='STREAM'。
Fortran 95 将非法 I/O 说明符报告为错误,而 f77 只发出警告。
数据类型、声明和用法:
f95 只允许 7 个数组下标;而 f77 允许 20 个。
f95 不允许在 PARAMETER 语句中使用非常量。
不能在 CHARACTER 类型声明的初始化函数中使用整数值。
REAL() 内部函数返回复数参数的实部,而不是将参数转换为 REAL*4。当参数为 DOUBLE COMPLEX 或 COMPLEX*32 时,这将产生不同的结果。
Fortran 95 不允许在数组声明之前在边界表达式中使用数组元素。例如:
subroutine s(i1,i2) integer i1(i2(1):10) dimension i2(10) ...ERROR: "I2" has been used as a function, therefore it must not be declared with the explicit-shape DIMENSION attribute. end |
程序、子例程、函数和语句:
名称的最大长度为 127 个字符。
命令行选项:
f95 不支持的 f77 库例程:
IOINIT() 库例程。
start_iostats 和 end_iostats 库例程。
f77_init() 函数。
f95 不允许通过使用相同名称定义用户自己的例程来绕过 IEEE_RETROSPECTIVE 子例程。
要混合使用 f77 和 f95 目标二进制文件,请通过 -xlang=f77 选项利用 f95 编译器进行链接。即使主程序是 f77 程序,也使用 f95 执行链接步骤。
示例: 编译使用 f77 目标文件的 f95 主程序。
demo% cat m.f95 CHARACTER*74 :: c = ’This is a test.’ CALL echo1( c ) END demo% f95 -xlang=f77 m.f95 sub77.o demo% a.out This is a test. demo% |
在 f95 程序中可以使用 FORTRAN 77 库和内部函数,《Fortran 库参考》手册中列出了这些库和内部函数。
示例: f95 主程序调用 FORTRAN 77 库中的例程。
demo% cat tdtime.f95 REAL e, dtime, t(2) e = dtime( t ) DO i = 1, 100000 as = as + cos(sqrt(float(i))) END DO e = dtime( t ) PRINT *, ’elapsed:’, e, ’, user:’, t(1), ’, sys:’, t(2) END demo% f95 tdtime.f95 demo% a.out elapsed: 0.14 , user: 0.14 , sys: 0.0E+0 demo% |
请参见 dtime(3F)。
Fortran 标准支持 FORTRAN 77 中没有的内部函数。《Fortran 库参考》手册中介绍了完整的 Fortran 内部函数集,其中包括非标准的内部函数。
如果在程序中将《Fortran 库参考》中列出的任何内部函数名称用作函数名称,则必须添加 EXTERNAL 语句才能让 f95 使用您的例程而不是内例程。
《Fortran 库参考》还列出了以前发行版的 f77 编译器能够识别的所有内部函数。f95 编译器也将这些名称识别为内部函数。
如果使用 -f77=intrinsics 进行编译,则会将编译器识别的内部函数限定为 f77 编译器识别的那些函数,而忽略 Fortran 内部函数。
floatingpoint.h 头文件替代了 f77_floatingpoint.h,在源程序中应按如下方式使用它:
#include "floatingpoint.h"
格式为 f77/ filename 的头文件引用应改为删除 f77/ 目录路径。
对于某些使用非标准别名技术(通过为数组设置过度索引,或者重叠 Cray 或 Fortran 指针)的程序,可通过使用相应的 -xalias 标志进行编译而受益。请参见3.4.108 –xalias[= keywords]。《Fortran 编程指南》中有关移植“旧式”程序的一章中举例说明了这个问题。