跳轉到內容

軟體工程師手冊/語言詞典/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 開始索引。

網路參考資料

[編輯 | 編輯原始碼]

書籍和文章

[編輯 | 編輯原始碼]

<列出可能會有幫助的其他書籍和文章。 請包括參考資料適合的讀者級別。(初學者/中級/高階)>

華夏公益教科書