不再提供单独的 Fortran 77 编译器。Solaris Studio Fortran 编译器 f95 可编译大多数的旧版 FORTRAN 77 程序,其中包括采用以前由 Sun WorkShop f77 编译器编译的非标准扩展的程序。
f95 可直接接受很多 FORTRAN 77 功能。其他功能要求在 FORTRAN 77 兼容性模式 (f95 -f77) 下进行编译。
本章介绍 f95 接受的 FORTRAN 77 功能,并列出了那些与 f95 不兼容的 f77 功能。有关 Sun WorkShop f77 编译器所接受的任何非标准 FORTRAN 77 扩展的详细信息,请参见 http://docs.sun.com/source/806-3594/index.html 上的旧版《FORTRAN 77 Language Reference》手册。
有关 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 |
有关旧版 Sun WorkShop FORTRAN 77 编译器所接受的非标准语言扩展语法和语义的详细信息,请参见 http://docs.sun.com/source/806-3594/index.html 上归档的《FORTRAN 77 Language Reference》。
下面列出了在使用此发行版的 f95 编译和测试传统 f77 程序时出现的已知不兼容问题。这些问题是由于 f95 中缺少相当的功能或者行为方式不同造成的。这些项目是旧版 Sun WorkShop FORTRAN 77 编译器支持的 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 不支持 FORTRAN 77 库例程:
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 编程指南》中有关移植“旧式”程序的一章中举例说明了这个问题。
Solaris Studio 软件不再包括单独的 FORTRAN 77 编译器 f77。最新的发行版已将许多 FORTRAN 77 功能迁移到 Fortran 95 编译器 f95 中。现在,Fortran 95 编译器中提供了旧版 FORTRAN 77 编译器的许多功能。当前 Solaris Studio 编译器发行版提供一个 f77 脚本,它用一组适当的缺省选项调用 f95 编译器。调用 f77 相当于:
f95 -f77 -ftrap=%none |
如果需要链接使用先前发行的 f77 编译器编译的库例程,请将 -xlang=f77 添加到命令行中。但如果在单独的步骤中进行编译和链接,并显式指定 -xlang=f77、-lM77、-lF77 或 -lsunmath,则必须使用 f95(或 f77 脚本)进行链接,而不能使用 cc 或 CC。如果还使用 -fast 标志进行编译,应将 -ftrap=%none 添加到 -fast 之后,以保留 FORTRAN 77 对运算异常的捕获行为,因为 -fast 将捕获模式设置为 "common"。
f77 -fast -ftrap=%none |
如果调用 f77 脚本,将发出消息,警示您正在 -f77 兼容模式下使用 f95 编译器。您可以在命令行中添加 -errtags=INVOKE 来禁用此消息。有关更多信息,请参见3.4.23 –f77[= list]。