Fortran
Fortran,可音譯為福傳,源自於「公式翻譯」(英語:Formula Translation)的縮寫[3][4],它是通用的編譯型指令式編程語言,特別適用於數值計算和科學計算。它在1957年由IBM開發出來[5],是世界上第一個被正式採用並流傳至今的高級編程語言。
編程範型 | 多重范型:指令式、過程式、結構化、面向對象、陣列式、泛型 |
---|---|
設計者 | 約翰·巴科斯 |
實作者 | 約翰·巴科斯與IBM |
面市時間 | 1957年 |
當前版本 |
|
型態系統 | 強類型、靜態 |
文件擴展名 | .f , .for , .f90 |
網站 | fortran-lang |
主要實作產品 | |
GFortran, Intel Fortran, Nvidia/PGI CUDA Fortran[1], Silverfrost FTN95, Oracle f95[2], IBM XL Fortran等 | |
衍生副語言 | |
F | |
啟發語言 | |
Speedcoding | |
影響語言 | |
ALGOL 58, PL/I, BASIC, C, PACT I, MUMPS, Ratfor |
簡介
Fortran最初由IBM在1950年代開發[5],用於科學和工程應用,並隨後長時間統治了科學計算編程。它已經在計算密集領域裡應用了超過六個年代,比如數值天氣預報、有限元分析、計算流體力學、地球物理學、計算物理學、晶體學和計算化學。它是高性能計算的流行語言[6],並被用於世界上最快超級計算機的基準測試和排名[7][8]。
Fortran有很多版本,每個都增加擴展卻在很大程度上保持與前面版本的兼容性。後續版本已經增加支持了:結構化編程和基於字符數據的處理(FORTRAN 77),陣列編程、模塊化編程和泛型編程(Fortran 90),高性能Fortran (Fortran 95),面向對象編程(Fortran 2003),並發計算(Fortran 2008)和天然的並行計算能力(Coarray Fortran 2008/2018)。
Fortran的設計是很多其他語言的基礎。其中最周知的是在1964年推出的BASIC,它基於了FORTRAN II,具有一些語法清理,尤其是更好的邏輯結構[9],和其他在交互式環境中使工作更加容易的變更[10]。
起源
在1953年後期,約翰·巴科斯(John W. Backus)向他在IBM的上司提交了一份提案,要為編程他們的IBM 704主機,而開發一種更實用的語言以替代匯編語言[11]:69。歷史上Backus的團隊包括了程序員Richard Goldberg、Sheldon F. Best、Harlan Herrick、Peter Sheridan、Roy Nutt、Robert Nelson、Irving Ziller、Harold Stern、Lois Haibt和David Sayre[12]。它的概念包括更容易的將方程錄入計算機,這是J. Halcombe Laning發展出的想法,並且在1952年演示於Laning與Zierler系統之中[13]。
在1954年11月,Backus等人完成了草案規定《IBM數學公式轉譯系統FORTRAN》[14],第一本FORTRAN手冊出現在1956年10月[15][11]:72,隨後在1957年4月交付了第一個FORTRAN編譯器[11]:75。這是第一個優化編譯器,因為客戶不情願使用高級編程語言,除非它的編譯器能夠生成接近於手工編碼匯編語言性能的代碼[16]。
儘管編程社區質疑新方法能否勝過手工編碼,它將操作一台機器所需的編程語句數目縮減了20倍,因而快速的獲得了接受。John Backus在1979年與IBM 雇員雜誌《Think》的一次訪談中說道:「我的多數工作出於懶惰。我不喜歡寫程序,所以當我工作在IBM 701上,為計算彈道軌跡書寫程序的時候,我開始製造一個編程系統來使得書寫程序更加容易」[17]。
FORTRAN語言被科學家廣泛接納,用來書寫數值計算密集程序,這鼓勵編譯器作者生產可以生成更快和更高效代碼的編譯器。在語言中包括複數數據類型,使得Fortran特別適合於技術應用比如電子工程[18]。
到了1960年,FORTRAN版本已經可獲得於IBM 709、650、1620和7090計算機上。FORTRAN流行性的顯著增長,刺激了競爭計算機製造商在它們的機器上提供FORTRAN編譯器,因此到了1963年,存在了超過40個FORTRAN編譯器。故此,FORTRAN被認為是第一個廣泛使用的跨平台編程語言。
提供給IBM 1401計算機的FORTRAN,採用了一種創新的63階段編譯器,它完整的運行於只有8000個(六位元)字符的磁芯內存中。這個編譯器可以從磁帶或者從2200張打孔卡開始運行;它不進一步的使用磁帶或磁盤存儲。按照Haines的描述[19],它保持程序在內存中並裝載覆蓋部分,就地逐步將其轉換成可執行形式。此文被重印編輯於兩版的《編譯器剖析》[20]和IBM手冊《Fortran規定和操作過程,IBM 1401》[21]之中。這種可執行形式不完全是機器語言;轉而浮點數算術、下標、輸入/輸出和函數引用是解釋執行的,這早先於UCSD Pascal的P-code兩個年代。
Fortran的發展平行於編譯器技術的早期演進,在理論和編譯器設計上的進步,受到為Fortran程序生成高效代碼的激勵。
FORTRAN
最早的FORTRAN版本應用於IBM 704系統上[15],包含了32個語句:
DIMENSION
和EQUIVALENCE
語句。- 賦值語句。
- 三態算術
IF
語句。[註 1] - 檢查異常情況:
IF ACCUMULATOR OVERFLOW
、IF QUOTIENT OVERFLOW
和IF DIVIDE CHECK
;操縱感應開關和感應燈:SENSE LIGHT
、IF (SENSE LIGHT)
和IF (SENSE SWITCH)
。 - 無條件
GO TO
、計算GO TO
、ASSIGN
和指派GO TO
。 DO
循環。- 格式化輸入與輸出:
FORMAT
、READ
、READ INPUT TAPE
、WRITE OUTPUT TAPE
、PRINT
和PUNCH
。 - 非格式化輸入與輸出:
READ TAPE
、READ DRUM
、WRITE TAPE
和WRITE DRUM
。 - 其他的輸入與輸出:
END FILE
、REWIND
和BACKSPACE
。 PAUSE
、STOP
和CONTINUE
。FREQUENCY
語句(為編譯器提供優化提示)。[註 2]
演化
年份 | 非正式名字 | ANSI標準 | ISO/IEC標準 |
---|---|---|---|
1957 | FORTRAN | — | — |
1958 | FORTRAN II | — | — |
1958 | FORTRAN III | — | — |
1961 | FORTRAN IV | — | — |
1966 | FORTRAN 66 | X3.9-1966 | — |
1978 | FORTRAN 77 | X3.9-1978 | — |
1991 | Fortran 90 | X3.198-1992 | 1539:1991 |
1997 | Fortran 95 | — | 1539-1:1997 |
2004 | Fortran 2003 | — | 1539-1:2004 |
2010 | Fortran 2008 | — | 1539-1:2010 |
2018 | Fortran 2018 | — | 1539-1:2018 |
2023 | Fortran 2023 | — | 1539-1:2023 |
FORTRAN II
1958年IBM又推出FORTRAN II。主要的增強是憑藉允許用戶書寫的子例程和函數,它們通過傳遞引用的形式參數來返回值,從而支持了過程式編程。COMMON
語句為子例程提供了訪問公共(或稱全局)變量的一種方式。增加了如下6個新語句[22]:
SUBROUTINE
、FUNCTION
和END
。CALL
和RETURN
。COMMON
。
接下來的幾年內,FORTRAN II又繼續支援了DOUBLE PRECISION
和COMPLEX
數據類型。
早期的FORTRAN編譯器在子例程中不支持遞歸。早期的計算機架構不支持堆棧的概念,當它們直接支持子例程調用的時候,返回位置經常存儲在毗鄰這個子例程代碼的一個固定位置(例如IBM 1130),或一個特定的機器寄存器(IBM 360系列)之中,它們只能在如下條件下允許遞歸,即由軟件來維護一個堆棧,這個返回地址要在進行調用之前存儲在堆棧之上,並在這個調用返回之後恢復。儘管沒有規定於FORTRAN 77之中,很多F77編譯器將其作為一個選項來支持遞歸,而Burroughs主機,設計有內建的遞歸,而將其作為缺省來支持。它在Fortran 90中通過新關鍵字RECURSIVE
而成為標準[23]。
簡單的FORTRAN II程序
下面的海倫公式程序, 從磁帶盤上讀取數據,它包含3個5位整數A、B和C作為輸入。這裡沒有「類型」聲明可用:名字開始於I、J、K、L、M或N的變量是「定點數」(就是整數),其他的是浮點數。因為這個例子要處理整數,變量的名字開始於字母「I」。在FORTRAN II中變量名字必須開始於字母,並可以後續着字母和數字二者,直到達到六個字符的限制。如果A、B和C不能表示在平面幾何中一個三角形的邊,程序將結束執行,STOP
給出錯誤代碼「1」。否則輸出一行來顯示A、B和C的輸入值,隨後是計算出的作為浮點數的三角形的面積AREA,它占據輸出行的10個空位,並顯示小數點後2位,這指定於標號603的FORMAT
語句中的「F10.2」。
C 通过标准的平方根函数计算三角形面积
C 输入 - 磁带读写器单元5,整数输入
C 输出 - 行式打印机,实数输出
C 输入错误 - 输出错误信息并显示错误代码1于作业控制列表中
READ INPUT TAPE 5, 901, IA, IB, IC
901 FORMAT (3I5)
C IA、IB和IC不可以是负数或零
C 一个三角形的两条边的总和必须大于第三边
IF (IA) 110, 110, 101
101 IF (IB) 110, 110, 102
102 IF (IC) 110, 110, 103
103 IF (IA+IB-IC) 120, 120, 104
104 IF (IA+IC-IB) 120, 120, 105
105 IF (IB+IC-IA) 120, 120, 199
110 PRINT 902
902 FORMAT (42H IA, IB, AND IC MUST BE GREATER THAN ZERO.)
STOP 1
120 PRINT 903
903 FORMAT (50H SUM OF TWO SIDES MUST BE GREATER THAN THIRD SIDE.)
STOP 1
199 CONTINUE
C 使用海伦公式计算三角形的面积
S = FLOATF (IA + IB + IC) / 2.0
AREA = SQRTF(S * (S - FLOATF(IA)) * (S - FLOATF(IB)) *
+ (S - FLOATF(IC)))
PRINT 904, IA, IB, IC, AREA
904 FORMAT (4H A= ,I5,5H B= ,I5,5H C= ,I5,8H AREA= ,F10.2,
+ 13H SQUARE UNITS)
STOP
END
FORTRAN III
IBM繼續開發FORTRAN III,至1958年時已允許內建組合語言代碼以及其他一些特徵[24];然而這個版本卻從未作為產品推出。類似於704 FORTRAN和FORTRAN II,FORTRAN III包含了過多的機器依賴性,造成程式碼不易移植到其他機器上的問題。其他廠商提供的早期FORTRAN版本也經常遭受類似的困苦。
FORTRAN IV
自1961年開始,由於客戶的強烈要求,IBM開始發展FORTRAN IV,目的在於移除一些FORTRAN II中過於依賴機器本身的程式碼(例如:READ INPUT TAPE
),同時新增一些新特徵,比如LOGICAL
資料型別(TRUE或者FALSE)、布爾表達式和取代了算術IF語句的邏輯IF語句。FORTRAN IV於1962年推出,最早應用於IBM 7030(「Stretch」)計算機之上,接着又推出了IBM 7090和IBM 7094版本,和後來1966年的IBM 1401版本[25]。
到了1965年,FORTRAN IV應該已經符合了美國標準協會X3.4.3 FORTRAN工作組開發的標準[26]。在1966年至1968年之間,IBM為其System/360提供了一些FORTRAN IV編譯器,每個都以指示了編譯器運行需要的最小內存量的字母來命名[27]。字母F、G、H匹配System/360模式編號來指示內存大小,每個字母增長都是二倍[28]:
- 1966 : FORTRAN IV F for DOS/360(64K字節)
- 1966 : FORTRAN IV G for OS/360(128K字節)
- 1968 : FORTRAN IV H for OS/360(256K字節)
數字設備公司(DEC)在1967年至1975年之間為PDP-10維護了DECSYSTEM-10 Fortran IV(F40)[29]。
大約在這個時候,FORTRAN IV開始成為重要的教育工具和實現,比如滑鐵盧大學創造了WATFOR和WATFIV來簡化早期編譯器複雜的編譯和鏈接過程。
FORTRAN 66
早期的FORTRAN語言發展史上最重要的一件大事,也許是美國標準協會(即今日的美國國家標準協會ANSI)的委員們,開始為FORTRAN制定標準規格,它名為「美國標準FORTRAN」。1966年委員會推出兩套FORTRAN標準版本,分別定義成FORTRAN(基於FORTRAN IV,它已經充任了事實標準),和Basic FORTRAN(基於FORTRAN II,並移除其機器依賴性)。由第一套標準定義的FORTRAN,官方代號為X3.9-1966,後來被稱為FORTRAN 66(仍有很多人習慣稱之為FORTRAN IV)。FORTRAN 66有效的成為第一套FORTRAN的工業標準版本。FORTRAN 66包括了:
- 主程序、
SUBROUTINE
、FUNCTION
和BLOCK DATA
程序單元。 INTEGER
、REAL
、DOUBLE PRECISION
、COMPLEX
和LOGICAL
數據類型。COMMON
、DIMENSION
和EQUIVALENCE
語句。DATA
語句,用以指定初始值。- 內部和
EXTERNAL
(例如庫)函數。 - 賦值語句
- 無條件
GO TO
、計算GO TO
、ASSIGN
和指派GO TO
語句。 - 邏輯
IF
和算術(三態)IF
語句。 DO
循環語句。READ
、WRITE
、BACKSPACE
、REWIND
和ENDFILE
語句,用以處理順序讀寫。FORMAT
語句和賦值格式。CALL
、RETURN
、PAUSE
、STOP
和CONTINUE
語句。- 霍爾瑞斯常量,用於
DATA
和FORMAT
語句,作為給子程序的實際參數。 - 最長6個字符的標識符。
- 注釋行。
END
行。
前面的FORTRAN II版本的海倫公式程序需要進行一些修改來作為FORTRAN 66程序編譯。修改包括使用更加機器無關版本的READ
和WRITE
語句,並移除不再需要的FLOATF
類型轉換函數。儘管不是必須的,算術IF
語句被重寫為使用邏輯IF
語句,並以更加結構化的方式來表示。
C 通过标准的平方根函数计算三角形面积
C 输入 - 单元5的磁带读取器,整数输入
C 输出 - 单元6的行式打印机,实数输出
C 输入错误 - 输出错误信息并显示错误代码1于作业控制列表中
READ (5, 901) IA, IB, IC
901 FORMAT (3I5)
C IA、IB和IC不可以是负数或零
IF (IA .GT. 0 .AND. IB .GT. 0 .AND. IC .GT. 0) GOTO 110
WRITE (6, 902)
902 FORMAT (42H IA, IB, AND IC MUST BE GREATER THAN ZERO.)
STOP 1
110 CONTINUE
C 一个三角形的两条边的总和必须大于第三边
IF (IA+IB-IC .GT. 0 .AND.
+ IA+IC-IB .GT. 0 .AND.
+ IB+IC-IA .GT. 0) GOTO 120
WRITE (6, 903)
903 FORMAT (50H SUM OF TWO SIDES MUST BE GREATER THAN THIRD SIDE.)
STOP 1
120 CONTINUE
C 使用海伦公式计算三角形的面积
S = (IA + IB + IC) / 2.0
AREA = SQRT ( S * (S - IA) * (S - IB) * (S - IC))
WRITE (6, 904) IA, IB, IC, AREA
904 FORMAT (4H A= ,I5,5H B= ,I5,5H C= ,I5,8H AREA= ,F10.2,
+ 13H SQUARE UNITS)
STOP
END
FORTRAN 77
在FORTRAN 66標準推出之後,各家編譯器廠商不斷推出更具擴充性的標準FORTRAN,促使ANSI委員會X3J3於1969年開始著手於1966標準版本的修訂工作,這得到了計算機商業設備製造商協會CBEMA(曾經的BEMA)的贊助。這個修訂標準的最終草案於1977年發表,並在1978年4月被正式批准為新的FORTRAN標準。新標準叫做FORTRAN 77,其官方代號是X3.9-1978,它增加了一些重要特徵來彌補FORTRAN 66的許多缺點[30]:
- 塊狀
IF
和END IF
語句,以及可選的ELSE
和ELSE IF
子句,提供改進了的對結構化編程的語言支持。 DO
循環擴展,包括參數表達式,負數增量,和零行程計數。OPEN
、CLOSE
和INQUIRE
語句,用以改進I/O能力。- 直接訪問文件I/O。
IMPLICIT
語句,用來變更或確認對未聲明變量的隱含約定,即如果它們的名字開始於I、J、K、L、M或N則是INTEGER
(否則為REAL
)。CHARACTER
數據類型,替代了霍爾瑞斯字符串,極大地擴展了字符輸入和輸出以及對基於字符的數據進行處理的設施。PARAMETER
語句,用以指定常量。SAVE
語句,用以持久保存局部變量。- 內部函數的通用名稱(比如
SQRT
也接受其他類型的實際參數,例如COMPLEX
或REAL*16
)。 - 一組內部函數(
LGE
、LGT
、LLE
和LLT
),用於字符串的邏輯比較,它基於了ASCII定序順序。
在這次標準修訂中,一些特徵被刪除或以使曾經符合標準的程序失效的方式而更改了。儘管在衝突列表的24個項目中的大多數(參見X3.9-1978的附錄A2),解決了在以前標準中允許但很少使用的漏洞和病態情況,少量特定功能被特意刪除了,比如:
DIMENSION A(10,5)
Y = A(11,1)
- 將控制轉移出離和回入
DO
循環的範圍(也叫做「擴展範圍」)。
開發繼FORTRAN 77之後的修訂標準被反覆的推遲,因為標準化過程難以跟上計算和編程實踐的快速變化。與此同時,作為「標準FORTRAN」將近十五年,FORTRAN 77成為了編程語言歷史上最重要的Fortran方言。
FORTRAN 77版本的海倫公式程序不必需對FORTRAN 66版本程序進行修改。下面的例子展示額外的I/O語句清理,包括使用列表指導(list-directed)的I/O,並將在FORMAT
語句中的霍爾瑞斯編輯描述符替代為引述的字符串。它還使用結構化的IF
和END IF
語句,取代GOTO
/CONTINUE
語句。
PROGRAM HERON
C 通过标准的平方根函数计算三角形面积
C 输入 - 默认标准输入单元,整数输入
C 输出 - 默认标准输出单元,实数输出
C 输入错误 - 输出错误信息并显示错误代码1于作业控制列表中
READ (*, *) IA, IB, IC
C IA、IB和IC不可以是负数或零
IF (IA .LE. 0 .OR. IB .LE. 0 .OR. IC .LE. 0) THEN
WRITE (*, *) 'IA, IB, and IC must be greater than zero.'
STOP 1
END IF
C 一个三角形的两条边的总和必须大于第三边
IF (IA+IB-IC .LE. 0 .OR.
+ IA+IC-IB .LE. 0 .OR.
+ IB+IC-IA .LE. 0) THEN
WRITE (*, *) 'Sum of two sides must be greater than third side.'
STOP 1
END IF
C 使用海伦公式计算三角形的面积
S = (IA + IB + IC) / 2.0
AREA = SQRT ( S * (S - IA) * (S - IB) * (S - IC))
WRITE (*, 901) IA, IB, IC, AREA
901 FORMAT (' A= ', I5, ' B= ', I5, ' C= ', I5, ' AREA= ', F10.2,
+ ' square units')
STOP
END
ANSI標準Fortran的擴展
一個重要的FORTRAN 77實用擴展,是1978年發行的MIL-STD-1753[31]。這個由美國國防部制定的規範,標準化了由多數FORTRAN 77編譯器實現,卻並未引入ANSI FORTRAN 77標準之中的很多特徵。這些特徵最終合併入Fortran 90標準之中。
DO WHILE
、EXIT
、CYCLE
和END DO
語句。INCLUDE
語句。IMPLICIT
語句的IMPLICIT NONE
變體。- 位操縱內部函數,基於了包含在工業實時Fortran(ANSI/ISA S61.1 (1976))中的類似的函數。
1991年推出IEEE 1003.9 POSIX標準,為Fortran-77的程式人員提供了POSIX系統上的呼叫[32]。有超過一百種功能呼叫被定義在文檔中。允許訪問POSIX相容的進程控制、信號處理、檔案系統控制、設備控制、過程定點,以及可移植方式下的串流式輸入/輸出。
Fortran 90
FORTRAN 77的被嚴重推遲的後續版本,非正式名稱是Fortran 90,最終在1991年發行為ISO/IEC標準1539:1991,在1992年發行為ANSI標準。除了將官方拼寫從FORTRAN改為Fortran之外,這個重大修訂版本增加了很多特徵,用來反映自從1978年標準以來演變出的編程實踐中的重要變化:
- 自由格式源代碼輸入,不再需要在鍵入語句之前越過前6個字符位置。
- 小寫的Fortran關鍵字。
- 最長31個字符的標識符(在以前的標準中為6個字符)。
- 行內注釋。
- 能夠按整體操作數組(或數組節),由此極大地簡化了數學和工程計算。
WHERE
語句用於選擇性數組賦值。- 數組值的常量和表達式。
- 整體、部分和遮掩的數組賦值和數組表達式,比如
X(1:N)=R(1:N)*COS(A(1:N))
。 - 用戶定義的數組值的函數和數組構造子。
RECURSIVE
過程。- 模塊,將有關聯的過程和數據組合在一起,使它們可以被其它程序單元調用,包括限制只允許訪問模塊的特定部分的能力。
- 極大地改善了參數傳遞機制,允許在編譯時檢查接口。
- 用戶書寫的泛型過程的接口。
- 運算子多載。
- 派生(結構化)數據類型。
- 新的數據類型定義語法,以指定數據類型和變量的其它特性。
- 動態內存分配,通過
ALLOCATABLE
特性和ALLOCATE
和DEALLOCATE
語句。 POINTER
特性,指針賦值和NULLIFY
語句,以便於創建和操作動態數據結構。- 結構化循環構造,使用
END DO
語句用於循環終止,EXIT
和CYCLE
語句,用於有秩序地「跳出」正常的DO
循環迭代。 SELECT
…CASE
構造,用於多路選擇。- 用戶控制下可移植的數值精度規定。
- 新的和增強的內部過程。
廢棄與刪除
不同於以前的修訂,在Fortran 90標準文本的附錄「B.1 刪除特徵」中,沒有列出任何要刪除的特徵。任何符合標準的FORTRAN 77程序,在Fortran 90之下也是符合標準的,二者標準都應當能夠定義它的行為。
在附錄「B.2 廢棄特徵」中列舉了一小組特徵,並期望在將來的標準中刪除它們。所有這些早期版本特徵的功能,都可以用較新的Fortran特徵來完成。其中一些為了簡化舊程序移植而保留,大多數在Fortran 95中被刪除了。
廢棄特徵 | 當前狀態 |
---|---|
算術IF 語句
|
刪除 |
非整數DO 形式參數或控制變量
|
刪除 |
共享的DO 循環終止或終止於END DO 或CONTINUE 之外的語句
|
刪除 |
從塊外部分支進入END IF
|
刪除 |
PAUSE 語句
|
刪除 |
ASSIGN 語句和指派GO TO 語句
|
刪除 |
賦值的語句編號和FORMAT 指定符
|
刪除 |
H編輯描述符 | 刪除 |
替代返回 | 廢棄 |
計算GO TO 語句
|
廢棄 |
語句函數 | 廢棄 |
在可執行語句之間的DATA 語句
|
廢棄 |
CHARACTER* 形式的CHARACTER 聲明
|
廢棄 |
假定字符長度的函數 | 廢棄 |
固定形式的源代碼 | 廢棄 |
Fortran 95
Fortran 95正式發表為ISO/IEC 1539-1:1997,它僅是一個小改版,其大部份是修正Fortran 90標準的一些較為顯著的問題。雖然如此,Fortran 95仍有不少的擴充,尤其是對高性能Fortran的規定:
FOR ALL
和嵌套的WHERE
結構,用以輔助向量化。- 用戶定義的
PURE
和ELEMENTAL
過程。 - 派生類型成員的缺省初始化,包括指針初始化。
- 擴展了對數據對象使用初始化表達式的能力。
- 初始化指針至
NULL()
。 - 明確了
ALLOCATABLE
數組的定義,即它們在出離了作用域的時候自動的被釋放。
Fortran 95的一個重要補充是ISO技術報告TR-15581:《增強的數據類型設施》,非正式名稱是「可分配TR」。這一標準定義了ALLOCATABLE
數組的增強的應用,先於完全與Fortran 2003兼容的Fortran編譯器而投入使用。這些使用包括將ALLOCATABLE
數組作為派生類型成員、用在過程偽參數列表中以及作為函數返回值。
ALLOCATABLE
數組比基於POINTER
的數組更受歡迎,因為ALLOCATABLE
數組是由Fortran 95提供保證的,當它們退出作用域時會被自動釋放掉,避免了內存泄漏的可能性。另外,別名也不再是優化數組引用時的一個問題,可以使編譯器生成比用指針時更快的代碼[33]。
Fortran 95的第二個補充是ISO技術報告TR-15580:《浮點異常處理》,非正式名稱是「IEEE TR」。這一標準定義了對IEEE浮點算術和浮點異常處理的支持。
條件編譯和變長字符串
除了強制性的「基礎語言」(定義於ISO/IEC 1539-1 : 1997)Fortran 95語言還包括兩個可選的模塊:
- 變長字符串(ISO/IEC 1539-2 : 2000)。
- 條件編譯(ISO/IEC 1539-3 : 1998)。
它們一起構成了多部分的國際標準(ISO/IEC 1539)。
現代Fortran
作為由二十一世紀的標準定義的語言,特別是因為它結合了面向對象編程支持和後來的Coarray Fortran,它經常被稱為「現代Fortran」,這個術語在文獻中的使用日漸增長[34]。
Fortran 2003
Fortran 2003正式發表為ISO/IEC 1539-1:2004,它是介入了很多新特徵的重大修訂版本[35]。ISO Fortran工作組(ISO/IEC JTC 1/SC 22/WG5)的官方網站有關於Fortran 2003新特徵的詳細總結[36]。
據該文所述,本版本的主要改進包括:
- 增強了的派生類型:參數化派生類型,改進的可訪問性控制,改進的結構構造子和終止器。
- 支持面向對象編程:類型擴展和繼承,多態,動態類型分配,以及類型綁定過程,提供對抽象數據類型的完全支持。
- 改善了數據操縱:可分配的成員(結合了IEEE TR 15581),延遲類型形式參數,
VOLATILE
特性,在數組構造子和分配語句中顯式的類型指定,增強的指針,擴展的初始化表達式,增強的內部過程。 - 增強的輸入/輸出:異步傳輸,串流訪問,用戶指定的派生類型的傳輸操作,用戶指定的在格式轉換時的捨入控制,預連接單元的命名常量,
FLUSH
語句,關鍵字的規範化,訪問錯誤信息。 - 過程指針。
- 支持IEEE浮點算法和浮點異常處理(結合了IEEE TR 15580)。
- 與C語言的交互性。
- 支持國際化:訪問ISO 10646四字節字符,在數值格式化輸入/輸出中選擇小數點或者逗號。
- 增強與宿主操作系統的集成:訪問命令行參數、環境變量和處理器錯誤信息。
對Fortran 2003的一個重要補充是ISO技術報告TR-19767:《增強的Fortran中模塊設施》。這個報告提供了「子模塊」,它使得Fortran模塊更加類似於Modula-2模塊。它們都類似於Ada私有子從單元。這允許模塊的規定和實現,可以用分立的程序單元來表達,它改進了大型庫的包裝,允許儘管發布明確接口卻保護商業機密,並防止編譯級聯。
Fortran 2008
ISO/IEC 1539-1:2010,非正式的叫做Fortran 2008,於2010年9月通過[37][38]。它只是一個小改版,略微更正了Fortran 2003的一些問題,並且合併了ISO/IEC TR 19767:2005的子模塊功能。新的功能包括:
- 子模塊,它是用於模塊的補充的結構設施;取代了ISO/IEC TR 19767:2005。
- Coarray Fortran,它是並行執行模型。
DO CONCURRENT
構造,用於沒有內部依賴性的循環迭代。CONTIGUOUS
特性,用來指定存儲格局限制。BLOCK
構造,它可以包含具有構造作用域的對象的聲明。- 遞歸可分配成員,作為在派生類型中遞歸指針的替代者。
對Fortran 2008的一個補充是ISO技術規定(TS)29113:2012《進一步的Fortran同C語言的互操作性》[39],它於2012年5月被提交到ISO並獲得批准。這個規定增加對C語言訪問數組描述符的支持,並允許忽略實際參數的類型和秩。
Fortran 2018
Fortran語言的2018年修訂版(Fortran 2018)早先稱為Fortran 2015[40],它是一個重大的修訂並且發行於2018年11月28日[41]。
Fortran 2018結合了兩個此前出版的技術規範:
此外的變更和新特徵包括支持:ISO/IEC/IEEE 60559:2011(在IEEE 754-2019的最新細小修訂之前的IEEE浮點數標準)、十六進制輸入/輸出、IMPLICIT NONE
增強和其他變更[44][45][46][47]。
Fortran 2023
Fortran 2023(ISO/IEC 1539-1:2023)發表於2023年11月,可從ISO獲得[48]。
Fortran的特徵
Fortran語言的最大特徵,是接近數學公式的自然描述,在計算機里具有很高的執行效率。Fortran可以直接對矩陣和複數進行運算。其矩陣元素在記憶空間儲存次序,採用了縱列為主(Column major)次序,Matlab也承襲這點,而C語言則採用橫行為主(Row major)次序。
Fortran自誕生以來廣泛地應用於數值計算領域,特別是並行計算和高性能計算領域。很多專用的大型數值運算計算機針對Fortran做了優化。Fortran積累了大量高效而可靠的源程序。Fortran 90、Fortran 95、Fortran 2003、Fortran 2008和Fortran 2018的相繼推出,使Fortran語言具備了現代高級編程語言的一些特徵。
代碼例子
Hello World
示例一個在標準輸出設備上輸出Hello World的簡單程序,這種程序通常作為開始學習編程語言時的第一個程序,下面是FORTRAN 77的寫法:
PROGRAM HELLO
C PRINT语句类似WRITE,
C 但是打印到标准输出单元
PRINT '(A)', 'Hello, world'
STOP
END
下面是Fortran 90的寫法:
program HelloWorld
write (*,*) 'Hello, world!' ! 这是个行内注释
end program HelloWorld
最大公約數
下面的FORTRAN 77代碼例子,使用歐幾里德算法計算兩個數A
和B
的最大公約數:
* euclid.f (FORTRAN 77)
* 使用欧几里德算法找到最大公约数
PROGRAM EUCLID
PRINT *, 'A?'
READ *, NA
IF (NA.LE.0) THEN
PRINT *, 'A must be a positive integer.'
STOP
END IF
PRINT *, 'B?'
READ *, NB
IF (NB.LE.0) THEN
PRINT *, 'B must be a positive integer.'
STOP
END IF
PRINT *, 'The GCD of', NA, ' and', NB, ' is', NGCD(NA, NB), '.'
STOP
END
FUNCTION NGCD(NA, NB)
IA = NA
IB = NB
10 IF (IB.NE.0) THEN
ITEMP = IA
IA = IB
IB = MOD(ITEMP, IB)
GOTO 10
END IF
NGCD = IA
RETURN
END
下面展示編譯和運行這個程序的結果:
$ f77 -o euclid euclid.f
$ ./euclid
A?
24
B?
36
The GCD of 24 and 36 is 12 .
Fortran 90特色示例
下面的程序展示動態內存分配和基於數組的運算,這是Fortran 90介入的兩個特徵。要特別注意的是在操縱數組時,未出現DO
循環和IF
/THEN
語句,數學運算應用於作為整體的數組。同樣明顯的是運用了描述性變量名字和普通代碼格式,這符合當代編程風格。這個例子在交互式錄入的數據上計算平均值:
program average
! 读取一些数值并取其平均
! 如下所写,如果没有数据点,返回均值为零
! 尽管这可能不是预期行为,它保持例子简单
implicit none
real, dimension(:), allocatable :: points
integer :: number_of_points
real :: average_points, positive_average, negative_average
average_points = 0.0
positive_average = 0.0; negative_average = 0.0
write (*,*) "Input number of points to average:"
read (*,*) number_of_points
allocate (points(number_of_points))
write (*,*) "Enter the points to average:"
read (*,*) points
! 通过总和诸点并除以点数来取平均
if (number_of_points > 0) average_points = sum(points) / number_of_points
! 现在分别只在正数和负数上取平均
if (count(points > 0.) > 0) &
positive_average = sum(points, points > 0.) / count(points > 0.)
if (count(points < 0.) > 0) &
negative_average = sum(points, points < 0.) / count(points < 0.)
! 打印结果到终端标准输出单元6
write (*,'(a,g12.4)') 'Average = ', average_points
write (*,'(a,g12.4)') 'Average of positive points = ', positive_average
write (*,'(a,g12.4)') 'Average of negative points = ', negative_average
deallocate (points) ! 释放内存
end program average
下面展示編譯和運行這個程序的結果:
$ gfortran -o average average.f90
$ ./average
Input number of points to average:
8
Enter the points to average:
0 1 -1 2 -2 3 -3 4
Average = 0.5000
Average of positive points = 2.500
Average of negative points = -2.000
FORTRAN編譯器
Windows操作系統下:
- Fortran Power Station 4.0(FPS 4.0),微軟公司開發的Fortran編譯器。1997年3月轉讓給DEC公司。
- Digital Visual Fortran(DVF),Fortran Power Station的DEC公司版本,版本號為5.0.x ~ 6.0.x。
- Compaq Visual Fortran(CVF),1998年1月,DEC公司被康柏公司收購,Digital Visual Fortran更名為Compaq Visual Fortran,版本號為6.5.x ~ 6.6.B。2002年5月康柏公司已併入惠普公司,但CVF並未改名,版本號升級到6.6.C。
- Intel Fortran,英特爾公司開發的Fortran編譯器。惠普購買了CVF技術之後不久,將Windows平台上的從CVF 6.6.C之後Fortran編譯器相關權利全部轉售給Intel,它需要微軟Visual Studio外殼的支持才能實現Visual IDE功能。在Intel手上的版本編號從7.0開始至現在。
- Absoft Fortran
- Open Watcom
- Silverfrost FTN95,個人用戶可免費使用的Fortran 95編譯器套件。支持編譯為Win32或.NET可執行程序,內置名為Plato的IDE,也可通過插件支持Visual Studio,調試器使用SDBG。
Linux操作系統下:
- PGI Fortran,現已被Nvidia收購。
- g77,GNU的Fortran 77編譯器,集成在GCC中。
- gfortran,GNU的最新的Fortran編譯器,集成在GCC 4.x及以上版本中,目前支持全部Fortran 95、大部分Fortran 2003和Fortran 2008的功能,以替代g77。
- Intel Fortran,它支持Linux操作系統。
- Absoft Fortran
- G95,開放源代碼的Fortran 95編譯器。
- Sun Studio
- Open64編譯器
FORTRAN數值庫
幾個著名的Fortran軟件包:
參見
- f2c
- NumPy提供的F2PY
- Fortran編譯器列表
- Fortran數值庫列表
- 矩陣表示
- 行主序和列主序
註解
- ^ 注意:通常人們會認為這一語句對應於IBM 704上的一個三態分支指令。但事實並非如此,704的分支指令只包含了一個目標地址(例如,TZE - 轉換AC為零,TNZ - 轉換AC為非零,TPL - 轉換AC為加,TMI - 轉換AC為減)。機器(以及它的後繼者如700/7000系列)確實有一個三態跳轉指令(CAS - 比較AC與存儲),那可能是這一說法的最初起源,但是用這一指令來執行
IF
的話,會消耗4個指令詞,需要把常數零放入存儲中,然後執行三個機器循環,而如果使用轉換指令來實現IF
的話,只需要1到3個指令詞就夠了,不需要將常數存入存儲,只需要1到3個機器循環來執行。一個優化的編譯器如FORTRAN最有可能採用的是更精簡的和通常來說更快的轉換指令,而不是比較指令(使用指換指令同時也允許FREQUENCY
語句來優化IF
,而如果使用比較指令的話則無法實現)。同時,比較指令還將-0和+0認為是不同的值,而轉換零和轉換非零語句將它們視為相同的值。 - ^ FORTRAN中的FREQUENCY最初是被用來給算術IF語句的三種分支狀態給出可能性的,以供選擇代碼生成的方式以及生成的代碼的基本塊的順序,在全局優化時,會在內存中安排以便於優化。第一個FORTRAN編譯器使用這一權重法來在編譯時作運行時生成代碼的蒙特卡洛模擬。在當時來說是非常複雜的。這一技術最初記載於1957年的一篇關於第一個FORTRAN編譯器實現的文章中,作者是J. Backus等人。許多年之後,FREQUENCY語句對代碼已經沒有作用了,就被作為注釋語句對待了,因為編譯器不再作這種編譯時模擬了。
以下摘自1957的論文:"FORTRAN自動編碼系統",作者:Backus等人,FREQUENCY語句和它在編譯時蒙特卡洛模擬運行時的用法,以優化生成的代碼。引文:「 The fundamental unit of program is the basic block; a basic block is a stretch of program which has a single entry point and a single exit point. The purpose of section 4 is to prepare for section 5 a table of predecessors (PRED table) which enumerates the basic blocks and lists for every basic block each of the basic blocks which can be its immediate predecessor in flow, together with the absolute frequency of each such basic block link. This table is obtained by an actual "execution" of the program in Monte-Carlo fashion, in which the outcome of conditional transfers arising out of IF-type statements and computed GO TO'S is determined by a random number generator suitably weighted according to whatever FREQUENCY statements have been provided.」
引用
- ^ CUDA Fortran. Nvidia. [2023-02-09]. (原始內容存檔於2023-03-26).
- ^ Oracle® Developer Studio 12.6: Fortran User's Guide. [2023-02-11]. (原始內容存檔於2023-02-11).
- ^ FORTRAN: The Pioneering Programming Language. IBM. 7 March 2012 [2017-07-19]. (原始內容存檔於2023-05-21).
- ^ FORTRAN. Encyclopedia Britannica. 14 June 2021 [2021-07-19]. (原始內容存檔於2023-10-28).
- ^ 5.0 5.1 John Backus. The history of FORTRAN I, II and III (PDF). Softwarepreservation.org. [19 November 2014]. (原始內容存檔 (PDF)於2007-07-26).
- ^ Eugene Loh. The Ideal HPC Programming Language. Queue. 18 June 2010, 8 (6) [2023-02-04]. (原始內容存檔於2016-03-04).
- ^ HPL – A Portable Implementation of the High-Performance Linpack Benchmark for Distributed-Memory Computers. [2015-02-21]. (原始內容存檔於2015-02-15).
- ^ Q13. What are the benchmarks?. Overview - CPU 2017. SPEC. [2019-11-13]. (原始內容存檔於2021-02-25).
- ^ Fifty Years of BASIC. Time. 29 April 2014 [2023-02-04]. (原始內容存檔於2016-02-05).
- ^ Szczepaniak, John. A basic history of BASIC on its 50th birthday. Gamasutra. 1 May 2014 [2023-02-04]. (原始內容存檔於2021-03-21).
- ^ 11.0 11.1 11.2 Backus, John. The History of Fortran I, II, and III (PDF). IEEE Annals of the History of Computing. October–December 1998, 20 (4): 68–78 [2020-06-17]. doi:10.1109/85.728232. (原始內容存檔 (PDF)於3 March 2016). [1][2]
- ^ J. W. Backus; R. J. Beeber; S. Best; R. Goldberg; L. M. Haibt; H. L. Herrick; R. A. Nelson; D. Sayre; P. B. Sheridan; H. Stern; L. Ziller; R. A. Hughes; R. Nutt. The FORTRAN Automatic Coding System (PDF). Western Joint Computer Conference: 188–198. February 1957 [2023-02-07]. doi:10.1145/1455567.1455599. (原始內容存檔 (PDF)於2023-02-07).
- ^ Mindell, David. Digital Apollo. Cambridge, MA: MIT Press. 2008: 99. ISBN 978-0-262-13497-2. JSTOR j.ctt5hhn02. OCLC 228031739.
- ^ J.W. Backus, H. Herrick, I. Ziller. Preliminary Report : Specifications for the IBM Mathematical FORmula TRANSlating System, FORTRAN (PDF). Programming Research Group, Applied Science Division, International Business Machines Corporation. November 10, 1954 [2023-02-09]. (原始內容存檔 (PDF)於2023-03-06).
- ^ 15.0 15.1 15.2 Backus, John Warner; Beeber, R. J.; Best, Sheldon F.; Goldberg, Richard; Herrick, Harlan L.; Hughes, R. A.; Mitchell, L. B.; Nelson, Robert A.; Nutt, Roy; Sayre, David; Sheridan, Peter B.; Stern, Harold; Ziller, Irving. Sayre, David , 編. The FORTRAN Automatic Coding System for the IBM 704 EDPM: Programmer's Reference Manual (PDF). New York, USA: Applied Science Division and Programming Research Department, International Business Machines Corporation. 1956-10-15: 2, 19–20 [2022-07-04]. (原始內容存檔 (PDF)於2022-07-04). (2+51+1 pages)
- ^ Padua, David. The Fortran I Compiler (PDF). Computing in Science and Engineering (CiSE). the Top Algorithms (University of Illinois: IEEE). January–February 2000, 2 (1): 70–75. Bibcode:2000CSE.....2a..70P. doi:10.1109/5992.814661. (原始內容 (PDF)存檔於2020-06-17).
The Fortran I compiler was the first major project in code optimization. It tackled problems of crucial importance whose general solution was an important research focus in compiler technology for several decades. Many classical techniques for compiler analysis and optimization can trace their origins and inspiration to the Fortran I compiler.
- ^ Claire Stegmann. Pathfinder (PDF). THINK, IBM Corporation. July/August 1979 [2023-02-10]. (原始內容存檔 (PDF)於2022-12-17).
- ^ FORTRAN – The First Programming Language for Numeric Calculations. SciHi Blog. 2019-10-15 [2023-02-07]. (原始內容存檔於2021-01-04).
- ^ Haines, L. H. Serial compilation and the 1401 FORTRAN compiler. IBM Systems Journal. 1965, 4 (1): 73–80. doi:10.1147/sj.41.0073.
- ^ Lee, John A. N. Anatomy of a Compiler. Van Nostrand Reinhold. 1967.
- ^ Fortran Specifications and Operating Procedures, IBM 1401 (PDF). IBM. C24-1455-2. (原始內容存檔 (PDF)於2017-09-23).
- ^ Reference Manual, FORTRAN II for the IBM 704 Data Processing System (PDF). 1958. C28-6000-2. (原始內容存檔 (PDF)於2005-10-30).
- ^ USER NOTES ON FORTRAN PROGRAMMING (UNFP). Ibiblio.org. [15 September 2014]. (原始內容存檔於2023-03-07).
- ^ Irving Ziller. Description of Source Language Additions to the FORTRAN II System (PDF). 1958 [2023-02-10]. (原始內容存檔 (PDF)於2022-12-17).
- ^ Fortran IV Language Specifications, Program Specifications, and Operating Procedures, IBM 1401, 1440, and 1460 (PDF). IBM. April 1966. C24-3322-2. (原始內容存檔 (PDF)於2017-09-23).
- ^ McCracken, Daniel D. Preface . A Guide to FORTRAN IV Programming. New York: Wiley. 1965: v. ISBN 978-0-471-58281-6.
- ^ List of FORTRAN Implementations 1957 - 1967. IEEE Annals. 2017 [2017-10-17]. (原始內容存檔於2023-02-05).
- ^ IBM System/360 Model 50 Functional Characteristics (PDF). IBM. 1967. A22-6898-1. (原始內容存檔 (PDF)於2021-10-29).
- ^ Digital Equipment Corp. DECSYSTEM-10 FORTRAN IV (F40) Programmers Reference Manual (PDF). Github. Digital Equipment Corporation. [15 April 2022]. (原始內容存檔 (PDF)於2023-04-04).
- ^ ANSI X3J3-1978 FORTRAN 77. 1978 [2023-02-09]. (原始內容存檔於2020-11-11).
- ^ Mil-std-1753. DoD Supplement to X3.9-1978. United States Government Printing Office. [2023-02-09]. (原始內容存檔於2023-04-20).
- ^ IEEE 1003.9-1992 - IEEE Standard for InformationTechnology - POSIX(R) FORTRAN 77 Language Interfaces - Part 1: Binding for System Application Program Interface (API) (PDF). IEEE. [2023-02-09]. (原始內容存檔 (PDF)於2012-10-05).
- ^ Fortran 95 Reference. Gnu.Org. [10 May 2014]. (原始內容存檔於2023-03-07).
- ^ Lionel, Steve. Doctor Fortran in "It's a Modern Fortran World". Intel (was DEC) Fortran forum discussion group. Intel. 30 December 2013 [11 April 2022]. (原始內容存檔於2023-03-07).
- ^ Fortran 2003– Last Working Draft. Gnu.Org. [10 May 2014]. (原始內容存檔於2021-02-25).
- ^ WG5 completes processing Fortran 2003 and the TR. nag.co.uk. 2004-05-14. 原始內容存檔於2004-08-05.. It may also be downloaded as a PDF file at The New Features of Fortran 2003 (PDF). (原始內容存檔 (PDF)於2018-01-15)..
- ^ N1836, Summary of Voting/Table of Replies on ISO/IEC FDIS 1539-1, Information technology – Programming languages – Fortran – Part 1: Base language (PDF). (原始內容存檔 (PDF)於2018-01-15).
- ^ Fortran 2008 – Last Working Draft (PDF). Gnu.Org. [10 May 2014]. (原始內容存檔 (PDF)於2014-05-12).
- ^ ISO/IEC TS 29113:2012 – Information technology – Further interoperability of Fortran with C.
- ^ Doctor Fortran in "Eighteen is the new Fifteen". Doctor Fortran. November 20, 2017 [2023-02-09]. (原始內容存檔於2023-02-09).
- ^ Fortran 2018. ISO. [30 November 2018]. (原始內容存檔於2017-12-01).
- ^ Further Interoperability of Fortran with C (PDF). ISO. [20 November 2017]. (原始內容存檔 (PDF)於2017-12-01).
- ^ Additional Parallel Features in Fortran. ISO. [20 November 2017].
- ^ The New Features of Fortran 2015. ISO. [23 June 2017].
- ^ Doctor Fortran in "One Door Closes". Doctor Fortran. September 4, 2015 [2023-02-09]. (原始內容存檔於2023-02-09).
- ^ Doctor Fortran Goes Dutch: Fortran 2015. Doctor Fortran. August 8, 2013 [2023-02-09]. (原始內容存檔於2023-02-09).
- ^ Fortran 2018 Interpretation Document (PDF). 9 October 2018 [2023-01-31]. (原始內容存檔 (PDF)於2022-11-08).
- ^ Fortran 2023. wg5-fortran.org. [November 30, 2023]. (原始內容存檔於2024-05-23).
延伸閱讀
- 語言標準
- Ansi x3.9-1966. USA Standard FORTRAN (PDF). American National Standards Institute. [2023-02-02]. (原始內容存檔 (PDF)於2020-11-01). Informally known as FORTRAN 66.
- Ansi x3.9-1978. American National Standard – Programming Language FORTRAN (PDF). American National Standards Institute. [2023-02-02]. (原始內容存檔 (PDF)於2021-12-29). Also known as ISO 1539–1980, informally known as FORTRAN 77.
- ANSI X3.198-1992 (R1997) / ISO/IEC 1539:1991. American National Standard – Programming Language Fortran Extended (PDF). American National Standards Institute / ISO/IEC. [2023-02-02]. (原始內容存檔 (PDF)於2020-11-05). Informally known as Fortran 90.
- ISO/IEC 1539-1:1997 (Final Draft). Information technology – Programming languages – Fortran – Part 1: Base language (PDF). [2023-02-02]. (原始內容存檔 (PDF)於2021-07-01). Informally known as Fortran 95. There are a further two parts to this standard. Part 1 has been formally adopted by ANSI.
- ISO/IEC 1539-1:2004. Information technology – Programming languages – Fortran – Part 1: Base language (PDF). Informally known as Fortran 2003.
- ISO/IEC 1539-1:2010 (Final Draft). Information technology – Programming languages – Fortran – Part 1: Base language (PDF). [2023-02-02]. (原始內容存檔 (PDF)於2023-02-03).
- ISO/IEC 1539-1:2018 (Final Draft). Information technology – Programming languages – Fortran – Part 1: Base language (PDF). [2023-02-02]. (原始內容存檔 (PDF)於2022-12-25).
- 有關標準
- Kneis, Wilfried. Draft standard Industrial Real-Time FORTRAN. ACM SIGPLAN Notices. October 1981, 16 (7): 45–60. ISSN 0362-1340. S2CID 8662381. doi:10.1145/947864.947868 .
- ISO 8651-1:1988 Information processing systems – Computer graphics – Graphical Kernel System (GKS) language bindings – Part 1: FORTRAN. Geneva, Switzerland: ISO. 1988 [2023-02-02]. (原始內容存檔於2016-03-31).
- 其他參考材料
- ECMA Standard on FORTRAN (PDF). European Computer Manufacturers Association. April 1965 [2023-02-05]. (原始內容存檔 (PDF)於2023-02-05).
- FORTRAN 77 4.0 Reference Manual (PDF). Sun Microsystems, Inc. 1995 [2023-02-05]. (原始內容存檔 (PDF)於2022-01-20).
- FORTRAN Coding Form (PDF). IBM. [2014-11-17]. (原始內容 (PDF)存檔於8 June 2015).
- Grace E. Mitchell. The FORTRAN Automatic Coding System for the IBM 704 EDPM : Programmer's Primer (PDF). IBM. 1957 [2023-02-09]. (原始內容存檔 (PDF)於2022-12-17).
- IBM System/360 and System/370 Fortran IV Language (PDF). IBM. May 1974 [2023-02-05]. (原始內容存檔 (PDF)於2017-01-18).
- Michael Goerz. Modern Fortran Reference Card (PDF). 2014 [2014-12-14]. (原始內容存檔 (PDF)於2014-12-14).
外部連結
- ISO/IEC JTC1/SC22/WG5 (頁面存檔備份,存於網際網路檔案館)—the official home of Fortran standards
- Fortran Standards Documents (頁面存檔備份,存於網際網路檔案館)—GFortran standards
- fortran-lang.org (頁面存檔備份,存於網際網路檔案館) (2020).
- History of FORTRAN and Fortran II (頁面存檔備份,存於網際網路檔案館)—Computer History Museum
- Valmer Norrod, et al.: A self-study course in FORTRAN programing—Volume I—textbook (頁面存檔備份,存於網際網路檔案館), Computer Science Corporation El Segundo, California (April 1970). NASA (N70-25287).
- Valmer Norrod, Sheldom Blecher, and Martha Horton: A self-study course in FORTRAN programing—Volume II—workbook (頁面存檔備份,存於網際網路檔案館), NASA CR-1478 (April 1970), NASA (N70-25288).
- An introduction to the Fortran programming language, by Reinhold Bader, Nisarg Patel, Leibniz Supercomputing Centre (頁面存檔備份,存於網際網路檔案館).
- A coarray tutorial (頁面存檔備份,存於網際網路檔案館)