跳转到内容

软件工程师手册/语言词典/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> 语句是可选的。

还要注意

  1. 从第 76 个字符开始的字符被忽略。因此,在插入长行中的字符时要小心。(IBM FORT/VS 编译器出于某些奇怪的原因会在这一列中插入行号)
  2. 空格字符被忽略,除非在引号中,最值得注意的是这两行被解释为相同,因此产生了与海员号坠毁相关的怀疑。
       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 中,变量的类型由变量名称的第一个字母隐式定义。以字母 IN 开头的变量自动被认为是 整数,而 AHOZ 被认为是 实数

这种行为可以通过 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 开始索引。

网络参考资料

[编辑 | 编辑源代码]

书籍和文章

[编辑 | 编辑源代码]

<列出可能会有帮助的其他书籍和文章。 请包括参考资料适合的读者级别。(初学者/中级/高级)>

华夏公益教科书