跳至內容

Fortran

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
Fortran
編程範型多重范型指令式過程式結構化面向對象陣列式泛型
設計者約翰·巴科斯
實作者約翰·巴科斯IBM
面市時間1957年,​67年前​(1957
當前版本
  • Fortran 2023(2023年11月17日)
編輯維基數據鏈接
型態系統強類型靜態
文件擴展名.f, .for, .f90
網站fortran-lang.org 編輯維基數據鏈接
主要實作產品
GFortran, Intel Fortran英語Intel Fortran Compiler, Nvidia/PGI英語The Portland Group CUDA Fortran[1], Silverfrost FTN95英語Silverfrost FTN95, Oracle f95[2], IBM XL Fortran英語IBM XL Fortran
衍生副語言
F英語F (programming language)
啟發語言
Speedcoding英語Speedcoding
影響語言
ALGOL 58, PL/I, BASIC, C, PACT I英語PACT I, MUMPS英語MUMPS, Ratfor英語Ratfor

Fortran,可音譯為福傳,源自於「公式翻譯」(英語:Formula Translation)的縮寫[3][4],它是通用的編譯型指令式編程語言,特別適用於數值計算科學計算。它在1957年由IBM開發出來[5],是世界上第一個被正式採用並流傳至今的高級編程語言

簡介

[編輯]

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,具有一些語法英語Syntax (programming languages)清理,尤其是更好的邏輯結構[9],和其他在交互式環境中使工作更加容易的變更[10]

起源

[編輯]
John Backus(1924年-2007年),他於1953年12月發起FORTRAN項目,於1977年獲得圖靈獎

在1953年後期,約翰·巴科斯(John W. Backus)向他在IBM的上司提交了一份提案,要為編程他們的IBM 704主機,而開發一種更實用的語言以替代匯編語言[11]:69。歷史上Backus的團隊包括了程序員Richard Goldberg、Sheldon F. Best、Harlan Herrick、Peter Sheridan、Roy Nutt英語Roy Nutt、Robert Nelson、Irving Ziller、Harold Stern、Lois Haibt英語Lois HaibtDavid Sayre英語David Sayre[12]。它的概念包括更容易的將方程錄入計算機,這是J. Halcombe Laning英語J. Halcombe Laning發展出的想法,並且在1952年演示於Laning與Zierler系統英語Laning and Zierler system之中[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英語IBM 701上,為計算彈道軌跡書寫程序的時候,我開始製造一個編程系統來使得書寫程序更加容易」[17]

FORTRAN語言被科學家廣泛接納,用來書寫數值計算密集程序,這鼓勵編譯器作者生產可以生成更快和更高效代碼的編譯器。在語言中包括複數數據類型英語complex data type,使得Fortran特別適合於技術應用比如電子工程[18]

到了1960年,FORTRAN版本已經可獲得於IBM 709英語IBM 709650英語IBM 6501620英語IBM 16207090計算機上。FORTRAN流行性的顯著增長,刺激了競爭計算機製造商在它們的機器上提供FORTRAN編譯器,因此到了1963年,存在了超過40個FORTRAN編譯器。故此,FORTRAN被認為是第一個廣泛使用的跨平台編程語言。

提供給IBM 1401英語IBM 1401計算機的FORTRAN,採用了一種創新的63階段編譯器,它完整的運行於只有8000個(六位元)字符的磁芯內存中。這個編譯器可以從磁帶或者從2200張打孔卡開始運行;它不進一步的使用磁帶或磁盤存儲。按照Haines的描述[19],它保持程序在內存中並裝載覆蓋部分,就地逐步將其轉換成可執行形式。此文被重印編輯於兩版的《編譯器剖析》[20]和IBM手冊《Fortran規定和操作過程,IBM 1401》[21]之中。這種可執行形式不完全是機器語言;轉而浮點數算術、下標、輸入/輸出和函數引用是解釋執行的,這早先於UCSD PascalP-code兩個年代。

Fortran的發展平行於編譯器技術的早期演進英語History of compiler construction,在理論和編譯器設計上的進步,受到為Fortran程序生成高效代碼的激勵。

FORTRAN

[編輯]
IBM 704的Fortran自動編寫代碼系統》(1956年10月15日),Fortran的第一本程序員參考手冊[15]

最早的FORTRAN版本應用於IBM 704系統上[15],包含了32個語句:

  • DIMENSIONEQUIVALENCE語句。
  • 賦值語句。
  • 三態算術IF英語Arithmetic IF語句。[註 1]
  • 檢查異常情況:IF ACCUMULATOR OVERFLOWIF QUOTIENT OVERFLOWIF DIVIDE CHECK;操縱感應開關和感應燈英語front panelSENSE LIGHTIF (SENSE LIGHT)IF (SENSE SWITCH)
  • 無條件GO TO、計算GO TOASSIGN和指派GO TO
  • DO循環。
  • 格式化輸入與輸出:FORMATREADREAD INPUT TAPEWRITE OUTPUT TAPEPRINTPUNCH
  • 非格式化輸入與輸出: READ TAPEREAD DRUMWRITE TAPEWRITE DRUM
  • 其他的輸入與輸出:END FILEREWINDBACKSPACE
  • PAUSESTOPCONTINUE
  • FREQUENCY語句(為編譯器提供優化英語Program optimization提示)。[註 2]

演化

[編輯]
Fortran語言時間線
年份 非正式名字 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發明年代的計算機,仍未使用電傳打字機或帶有陰極射線管終端,程式碼必須使用鍵盤打孔機英語Keypunch打在打孔卡上。圖中顯示卡片上表示了一行FORTRAN代碼Z(1) = Y + W(1),打孔卡的第1-5列為標號字段,第6列為接續字段,第73-80列有特殊用途。
一張Fortran代碼表,程序員準備將上面寫的代碼用打卡機轉錄到卡片上。現在已不再使用這種方式。

FORTRAN II

[編輯]

1958年IBM又推出FORTRAN II。主要的增強是憑藉允許用戶書寫的子例程和函數,它們通過傳遞引用的形式參數來返回值,從而支持了過程式編程COMMON語句為子例程提供了訪問公共(或稱全局)變量的一種方式。增加了如下6個新語句[22]

  • SUBROUTINEFUNCTIONEND
  • CALLRETURN
  • COMMON

接下來的幾年內,FORTRAN II又繼續支援了DOUBLE PRECISIONCOMPLEX數據類型。

早期的FORTRAN編譯器在子例程中不支持遞歸。早期的計算機架構不支持堆棧的概念,當它們直接支持子例程調用的時候,返回位置經常存儲在毗鄰這個子例程代碼的一個固定位置(例如IBM 1130),或一個特定的機器寄存器(IBM 360系列)之中,它們只能在如下條件下允許遞歸,即由軟件來維護一個堆棧,這個返回地址要在進行調用之前存儲在堆棧之上,並在這個調用返回之後恢復。儘管沒有規定於FORTRAN 77之中,很多F77編譯器將其作為一個選項來支持遞歸,而Burroughs主機英語Burroughs large systems,設計有內建的遞歸,而將其作為缺省來支持。它在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英語IBM 7030 Stretch(「Stretch」)計算機之上,接着又推出了IBM 7090IBM 7094版本,和後來1966年的IBM 1401英語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英語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包括了:

  • 主程序、SUBROUTINEFUNCTIONBLOCK DATA程序單元。
  • INTEGERREALDOUBLE PRECISIONCOMPLEXLOGICAL數據類型。
  • COMMONDIMENSIONEQUIVALENCE語句。
  • DATA語句,用以指定初始值。
  • 內部和EXTERNAL(例如庫)函數。
  • 賦值語句
  • 無條件GO TO、計算GO TOASSIGN和指派GO TO語句。
  • 邏輯IF和算術(三態)IF語句。
  • DO循環語句。
  • READWRITEBACKSPACEREWINDENDFILE語句,用以處理順序讀寫。
  • FORMAT語句和賦值格式。
  • CALLRETURNPAUSESTOPCONTINUE語句。
  • 霍爾瑞斯常量英語Hollerith constant,用於DATAFORMAT語句,作為給子程序的實際參數。
  • 最長6個字符的標識符。
  • 注釋行。
  • END行。

前面的FORTRAN II版本的海倫公式程序需要進行一些修改來作為FORTRAN 66程序編譯。修改包括使用更加機器無關版本的READWRITE語句,並移除不再需要的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英語International Committee for Information Technology Standards(曾經的BEMA)的贊助。這個修訂標準的最終草案於1977年發表,並在1978年4月被正式批准為新的FORTRAN標準。新標準叫做FORTRAN 77,其官方代號是X3.9-1978,它增加了一些重要特徵來彌補FORTRAN 66的許多缺點[30]

  • 塊狀IFEND IF語句,以及可選的ELSEELSE IF子句,提供改進了的對結構化編程的語言支持。
  • DO循環擴展,包括參數表達式,負數增量,和零行程計數。
  • OPENCLOSEINQUIRE語句,用以改進I/O能力。
  • 直接訪問文件I/O。
  • IMPLICIT語句,用來變更或確認對未聲明變量的隱含約定,即如果它們的名字開始於I、J、K、L、M或N則是INTEGER(否則為REAL)。
  • CHARACTER數據類型,替代了霍爾瑞斯字符串,極大地擴展了字符輸入和輸出以及對基於字符的數據進行處理的設施。
  • PARAMETER語句,用以指定常量。
  • SAVE語句,用以持久保存局部變量。
  • 內部函數的通用名稱(比如SQRT也接受其他類型的實際參數,例如COMPLEXREAL*16)。
  • 一組內部函數(LGELGTLLELLT),用於字符串的邏輯比較,它基於了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語句中的霍爾瑞斯編輯描述符替代為引述的字符串。它還使用結構化的IFEND 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標準之中。

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特性和ALLOCATEDEALLOCATE語句。
  • POINTER特性,指針賦值和NULLIFY語句,以便於創建和操作動態數據結構
  • 結構化循環構造,使用END DO語句用於循環終止,EXITCYCLE語句,用於有秩序地「跳出」正常的DO循環迭代。
  • SELECTCASE構造,用於多路選擇。
  • 用戶控制下可移植的數值精度規定。
  • 新的和增強的內部過程。

廢棄與刪除

[編輯]

不同於以前的修訂,在Fortran 90標準文本的附錄「B.1 刪除特徵」中,沒有列出任何要刪除的特徵。任何符合標準的FORTRAN 77程序,在Fortran 90之下也是符合標準的,二者標準都應當能夠定義它的行為。

在附錄「B.2 廢棄特徵」中列舉了一小組特徵,並期望在將來的標準中刪除它們。所有這些早期版本特徵的功能,都可以用較新的Fortran特徵來完成。其中一些為了簡化舊程序移植而保留,大多數在Fortran 95中被刪除了。

廢棄特徵 當前狀態
算術IF語句 刪除
非整數DO形式參數或控制變量 刪除
共享的DO循環終止或終止於END DOCONTINUE之外的語句 刪除
從塊外部分支進入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結構,用以輔助向量化。
  • 用戶定義的PUREELEMENTAL過程。
  • 派生類型成員的缺省初始化,包括指針初始化。
  • 擴展了對數據對象使用初始化表達式的能力。
  • 初始化指針至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英語Coarray Fortran,它經常被稱為「現代Fortran」,這個術語在文獻中的使用日漸增長[34]

Fortran 2003

[編輯]

Fortran 2003正式發表為ISO/IEC 1539-1:2004,它是介入了很多新特徵的重大修訂版本[35]ISO Fortran工作組(ISO/IEC JTC 1/SC 22英語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英語Coarray Fortran,它是並行執行模型。
  • DO CONCURRENT英語Scalable parallelism構造,用於沒有內部依賴性的循環迭代。
  • 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 TS 29113:2012《進一步的Fotran同C語言的互操作性》[42]
  • ISO/IEC TS 18508:2015《補充的Fortran並行特徵》[43]

此外的變更和新特徵包括支持: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可以直接對矩陣複數進行運算。其矩陣元素在記憶空間儲存次序,採用了縱列為主英語Row- and column-major order(Column major)次序,Matlab也承襲這點,而C語言則採用橫行為主英語Row- and column-major order(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代碼例子,使用歐幾里德算法計算兩個數AB最大公約數

*     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英語Intel Fortran Compiler英特爾公司開發的Fortran編譯器。惠普購買了CVF技術之後不久,將Windows平台上的從CVF 6.6.C之後Fortran編譯器相關權利全部轉售給Intel,它需要微軟Visual Studio外殼的支持才能實現Visual IDE功能。在Intel手上的版本編號從7.0開始至現在。
  • Absoft Fortran英語Absoft Fortran Compilers
  • Open Watcom
  • Silverfrost FTN95英語Silverfrost FTN95,個人用戶可免費使用的Fortran 95編譯器套件。支持編譯為Win32或.NET可執行程序,內置名為Plato的IDE,也可通過插件支持Visual Studio,調試器使用SDBG。

Linux操作系統下:

FORTRAN數值庫

[編輯]

幾個著名的Fortran軟件包:

參見

[編輯]

註解

[編輯]
  1. ^ 注意:通常人們會認為這一語句對應於IBM 704上的一個三態分支指令。但事實並非如此,704的分支指令只包含了一個目標地址(例如,TZE - 轉換AC為零,TNZ - 轉換AC為非零,TPL - 轉換AC為加,TMI - 轉換AC為減)。機器(以及它的後繼者如700/7000系列英語IBM 700/7000 series#Later scientific architecture (704/709/7090/7094))確實有一個三態跳轉指令(CAS - 比較AC與存儲),那可能是這一說法的最初起源,但是用這一指令來執行IF的話,會消耗4個指令詞,需要把常數零放入存儲中,然後執行三個機器循環,而如果使用轉換指令來實現IF的話,只需要1到3個指令詞就夠了,不需要將常數存入存儲,只需要1到3個機器循環來執行。一個優化的編譯器如FORTRAN最有可能採用的是更精簡的和通常來說更快的轉換指令,而不是比較指令(使用指換指令同時也允許FREQUENCY語句來優化IF,而如果使用比較指令的話則無法實現)。同時,比較指令還將-0和+0認為是不同的值,而轉換零和轉換非零語句將它們視為相同的值。
  2. ^ 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.」

引用

[編輯]
  1. ^ CUDA Fortran. Nvidia. [2023-02-09]. (原始內容存檔於2023-03-26). 
  2. ^ Oracle® Developer Studio 12.6: Fortran User's Guide. [2023-02-11]. (原始內容存檔於2023-02-11). 
  3. ^ FORTRAN: The Pioneering Programming Language. IBM. 7 March 2012 [2017-07-19]. (原始內容存檔於2023-05-21). 
  4. ^ FORTRAN. Encyclopedia Britannica. 14 June 2021 [2021-07-19]. (原始內容存檔於2023-10-28). 
  5. ^ 5.0 5.1 John Backus. The history of FORTRAN I, II and III (PDF). Softwarepreservation.org. [19 November 2014]. (原始內容存檔 (PDF)於2007-07-26). 
  6. ^ Eugene Loh. The Ideal HPC Programming Language. Queue. 18 June 2010, 8 (6) [2023-02-04]. (原始內容存檔於2016-03-04). 
  7. ^ HPL – A Portable Implementation of the High-Performance Linpack Benchmark for Distributed-Memory Computers. [2015-02-21]. (原始內容存檔於2015-02-15). 
  8. ^ Q13. What are the benchmarks?. Overview - CPU 2017. SPEC. [2019-11-13]. (原始內容存檔於2021-02-25). 
  9. ^ Fifty Years of BASIC. Time. 29 April 2014 [2023-02-04]. (原始內容存檔於2016-02-05). 
  10. ^ Szczepaniak, John. A basic history of BASIC on its 50th birthday. Gamasutra. 1 May 2014 [2023-02-04]. (原始內容存檔於2021-03-21). 
  11. ^ 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]
  12. ^ 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). 
  13. ^ Mindell, David. Digital Apollo. Cambridge, MA: MIT Press. 2008: 99. ISBN 978-0-262-13497-2. JSTOR j.ctt5hhn02. OCLC 228031739. 
  14. ^ 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. ^ 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)
  16. ^ 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. 
  17. ^ Claire Stegmann. Pathfinder (PDF). THINK, IBM Corporation. July/August 1979 [2023-02-10]. (原始內容存檔 (PDF)於2022-12-17). 
  18. ^ FORTRAN – The First Programming Language for Numeric Calculations. SciHi Blog. 2019-10-15 [2023-02-07]. (原始內容存檔於2021-01-04). 
  19. ^ Haines, L. H. Serial compilation and the 1401 FORTRAN compiler. IBM Systems Journal. 1965, 4 (1): 73–80. doi:10.1147/sj.41.0073. 
  20. ^ Lee, John A. N. Anatomy of a Compiler. Van Nostrand Reinhold. 1967. 
  21. ^ Fortran Specifications and Operating Procedures, IBM 1401 (PDF). IBM. C24-1455-2. (原始內容存檔 (PDF)於2017-09-23). 
  22. ^ Reference Manual, FORTRAN II for the IBM 704 Data Processing System (PDF). 1958. C28-6000-2. (原始內容存檔 (PDF)於2005-10-30). 
  23. ^ USER NOTES ON FORTRAN PROGRAMMING (UNFP). Ibiblio.org. [15 September 2014]. (原始內容存檔於2023-03-07). 
  24. ^ Irving Ziller. Description of Source Language Additions to the FORTRAN II System (PDF). 1958 [2023-02-10]. (原始內容存檔 (PDF)於2022-12-17). 
  25. ^ 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). 
  26. ^ McCracken, Daniel D. Preface需要免費註冊. A Guide to FORTRAN IV Programming. New York: Wiley. 1965: v. ISBN 978-0-471-58281-6. 
  27. ^ List of FORTRAN Implementations 1957 - 1967. IEEE Annals. 2017 [2017-10-17]. (原始內容存檔於2023-02-05). 
  28. ^ IBM System/360 Model 50 Functional Characteristics (PDF). IBM. 1967. A22-6898-1. (原始內容存檔 (PDF)於2021-10-29). 
  29. ^ Digital Equipment Corp. DECSYSTEM-10 FORTRAN IV (F40) Programmers Reference Manual (PDF). Github. Digital Equipment Corporation. [15 April 2022]. (原始內容存檔 (PDF)於2023-04-04). 
  30. ^ ANSI X3J3-1978 FORTRAN 77. 1978 [2023-02-09]. (原始內容存檔於2020-11-11). 
  31. ^ Mil-std-1753. DoD Supplement to X3.9-1978. United States Government Printing Office. [2023-02-09]. (原始內容存檔於2023-04-20). 
  32. ^ 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). 
  33. ^ Fortran 95 Reference. Gnu.Org. [10 May 2014]. (原始內容存檔於2023-03-07). 
  34. ^ 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). 
  35. ^ Fortran 2003– Last Working Draft. Gnu.Org. [10 May 2014]. (原始內容存檔於2021-02-25). 
  36. ^ 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). .
  37. ^ 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). 
  38. ^ Fortran 2008 – Last Working Draft (PDF). Gnu.Org. [10 May 2014]. (原始內容存檔 (PDF)於2014-05-12). 
  39. ^ ISO/IEC TS 29113:2012 – Information technology – Further interoperability of Fortran with C. 
  40. ^ Doctor Fortran in "Eighteen is the new Fifteen". Doctor Fortran. November 20, 2017 [2023-02-09]. (原始內容存檔於2023-02-09). 
  41. ^ Fortran 2018. ISO. [30 November 2018]. (原始內容存檔於2017-12-01). 
  42. ^ Further Interoperability of Fortran with C (PDF). ISO. [20 November 2017]. (原始內容存檔 (PDF)於2017-12-01). 
  43. ^ Additional Parallel Features in Fortran. ISO. [20 November 2017]. 
  44. ^ The New Features of Fortran 2015. ISO. [23 June 2017]. 
  45. ^ Doctor Fortran in "One Door Closes". Doctor Fortran. September 4, 2015 [2023-02-09]. (原始內容存檔於2023-02-09). 
  46. ^ Doctor Fortran Goes Dutch: Fortran 2015. Doctor Fortran. August 8, 2013 [2023-02-09]. (原始內容存檔於2023-02-09). 
  47. ^ Fortran 2018 Interpretation Document (PDF). 9 October 2018 [2023-01-31]. (原始內容存檔 (PDF)於2022-11-08). 
  48. ^ Fortran 2023. wg5-fortran.org. [November 30, 2023]. (原始內容存檔於2024-05-23). 

延伸閱讀

[編輯]
語言標準
有關標準
其他參考材料

外部連結

[編輯]