软件工程师手册/语言词典/FORTRAN
这是 维基百科条目。以下简要介绍 Fortran77。Fortran 77 是 Fortran 66 和 Fortran IV 的改进版本,但增加了一些理想的新特性。最值得注意的是CHARACTER
类型。
Fortran 是一种完整的过程式语言。
程序的主要入口点在PROGRAM
语句中。
PROGRAM XYZ
Fortran 是针对穿孔卡片设计的,因此实际的 Fortran 代码从第 7 个字符偏移开始。字符由 6 个字符前缀。字符 1 到 5 表示标签,字符 6 表示行继续。
例如
12345 PROGRAM
+HLO WLD
67890 PRINT *,
+'HELLO WORLD'
99999 END
注意:在错误的地方插入额外的字符可能会导致意外行为。比较 wikiquote:Special:Search=C._A._R._Hoare 关于 海员号太空火箭。
在本例中,PROGRAM
和 <END> 语句是可选的。
还要注意
- 从第 76 个字符开始的字符被忽略。因此,在插入长行中的字符时要小心。(IBM FORT/VS 编译器出于某些奇怪的原因会在这一列中插入行号)
- 空格字符被忽略,除非在引号中,最值得注意的是这两行被解释为相同,因此产生了与海员号坠毁相关的怀疑。
DO 19,I=1,99
DO19I=1,99
第一列中的 'C'、'*' 和有时为 'c' 字符表示注释。例如
* This is a hello world program
12345 PROGRAM
+HLO WLD
C Output Hello World
67890 PRINT *,
+'HELLO WORLD'
c all done, I'm out of here...
99999 END
在 Fortran 中,变量的类型由变量名称的第一个字母隐式定义。以字母 I 到 N 开头的变量自动被认为是 整数,而 A 到 H 和 O 到 Z 被认为是 实数。
这种行为可以通过 IMPLICIT INTEGER 声明(设置整数的字母范围)或显式声明变量并给出其类型来修改。
因此,“上帝是真实的(除非声明为整数)”。
例子
PROGRAM EG DEC
* Net line is not needed as this would be IMPLICIT INTEGER
INTEGER I,J,K
* long INTEGERs
INTEGER II*8,JJ*8,KK*8
* define some arrays
INTEGER M(2),N(3),O(4)
* Some array initialisations
INTEGER MM(2)/1,2/,NNN(3)/1,2,3/,OOOO(4)/1,2,3,4/
* Some REAL initialisations
REAL R/1.0/,S/2.0/,T/3.0/
* Some DOUBLE PRECISION (long) initialisations
REAL*8 RR/1.0D/
DOUBLE PRECISION SS/2.0D/
END
Fortran 有几种类型的FUNCTIONS/SUBROUTINES
。例子
PROGRAM P
PRINT *,'The cube of 2 is',CUBE(2.0)
PRINT *,'The square of 2 is',SQUARE(2.0)
END
FUNCTION CUBE(X)
* FILSQ is an inline Function returning the square of a value
FILSQ(X)=X*X
CUBE=FILSQ(X)*X
RETURN
ENTRY SQUARE(X)
CUBE=FILSQ(X)
END
产生
The cube of 2 is 8.
The square of 2 is 4.
请注意,在输出中,第一个字符通常是空格字符。通过在第一列中插入其他字符,您可以强制打印机进行换页,并执行其他有趣的行为。
变量的作用域严格限制在当前的 PROGRAM/SUBROUTINE 或 DATA BLOCK 中。DATA BLOCK 可以由 PROGRAM/SUBROUTINE 共享,允许程序员扩展变量的作用域。
<用文本描述条件语句并展示。>
* A one liner
IF(1 .EQ. 2)PRINT *,'Dreaming'
* A block structured
IF(1 .EQ. 1)THEN
PRINT *,'A distinct possibility'
ELIF(2 .EQ. 2)THEN
PRINT *,'Too late'
ELSE
PRINT *,'Way too late'
ENDIF
*
条件语句还包括 GOTO 语句。
I=3
GOTO(111,112,113,114)I
PRINT *,'I was not found'
GOTO 119
111 CONTINUE
print *,'I was 1'
GOTO 119
112 CONTINUE
print *,'I was 2'
GOTO 119
113 CONTINUE
print *,'I was 3'
GOTO 119
114 CONTINUE
print *,'I was 4'
GOTO 119
119 CONTINUE
FORTRAN 也有一个三路条件。
I=1
IF(I)121,122,123
121 CONTINUE
print *,'I is less then zero'
GOTO 129
122 CONTINUE
print *,'I is zero'
GOTO 129
123 CONTINUE
print *,'I is greater then zero'
GOTO 129
129 CONTINUE
FORTRAN 77 > DO / WHILE 循环
A = 1
DO WHILE (A .LT. 10)
PRINT *, 'COUNTING: ', A
A = A + 1
END DO
在较旧的 FORTRANS 中,标签和 GOTO 将用于实现相同的效果。例如
INTEGER A
IF(.NOT.(A .LT. 10))GO TO 139
PRINT *,'COUNTING: ',A
A = A + 1
* A convention is to terminate the label number with a 9
* in cases where the GOTO breaks out of a loop.
139 CONTINUE
第一个 hello world 示例
PRINT *,'Hello World'
或者
WRITE (*,*)'Hello World'
或者(标准输出通道为 6)
WRITE (6,*)'Hello World'
或者
WRITE (6,'( A)')'Hello World'
或者
WRITE (UNIT=6,FMT='( A)')'Hello World'
或者
WRITE (UNIT=6,FMT=141)'Hello World'
141 FORMAT(A)
Fortran 包括 OPEN、CLOSE、READ、WRITE 和 PRINT 语句。READ 和 WRITE 命令可以通过记录号访问文件中记录的信息,因此 Fortran 包含了随机文件访问的雏形。不幸的是,在文件 IO 上,“字”的大小是实现相关的,在 CDC 上为 6 位,在 IBM 上为 8 位,在 VAXVMS 上为 32 位。
FORTRAN 77 没有结构或类定义。最接近的例子是 COMMON 语句。
CHARACTER NAME*16, ADDRESS*64
FLOAT BALANCE*4
COMMOM /CSTREC/NAME,ADDRESS,BALANCE
EQUIVALENCE 语句允许这种 COMMON 块语句被重叠,并允许直接赋值。但这很成问题。
CHARACTER ALLREC*(16+64+4)
EQUIVALENCE(ALLREC,CUSREC)
EQUIVALENCE 还具有与 Algol68(然后是 C)语言 union 语句类似的效果。其最终效果是两个变量 ALLREC、CUSREC 共享内存中的同一位置。
仅当语言支持 FORTRAN 的子程序调用约定(并非所有 FORTRAN 都使用堆栈!)时,才能访问其他语言。 而且实际约定因机器而异。
垃圾回收不是语言的一部分,而是使用数据块单独实现的。 在 Fortran 中,程序启动时的内存是程序在终止之前可用的全部内存。(例外情况是,如果编译器支持带有局部变量的递归,但并非总是如此。)
Fortran 的 `external` 作用域规则类似于 C 编程语言中的作用域。 但是 Fortran 77 没有标准的 `INCLUDE` 语句。
- DATABLOCK EXTNM1
- EXTERNAL EXTNM2
- PROGRAM EXTNM3
- FUNCTION EXTNM3
- ENTRY EXTNM4
- SUBROUTINE EXTNM5
- DATA BLOCK
- COMMON EXTNM6
- 数组从 1 开始索引。
<列出可能会有帮助的其他书籍和文章。 请包括参考资料适合的读者级别。(初学者/中级/高级)>