Fortran

結構化編程語言

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

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最初由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位,這指定於標號601的FORMAT陳述式中的「F10.2」。

C     通过标准的平方根函数计算三角形面积
C     输入 - 磁带读取器单元5,整数输入
C     输出 - 行式打印机单元6,实数输出
C     输入错误 - 显示错误输出代码1于作业控制列表中
      READ INPUT TAPE 5, 501, IA, IB, IC
  501 FORMAT(3I5)
C     IA、IB和IC不可以是负数或零
C     再进一步,一个三角形的两条边的总和
C     必须大于第三边,所以我们也做此检查
      IF (IA) 777, 777, 701
  701 IF (IB) 777, 777, 702
  702 IF (IC) 777, 777, 703
  703 IF (IA+IB-IC) 777, 777, 704
  704 IF (IA+IC-IB) 777, 777, 705
  705 IF (IB+IC-IA) 777, 777, 799
  777 STOP 1
C     我们使用海伦公式
C     计算三角形的面积
  799 S = FLOATF (IA + IB + IC) / 2.0
      AREA = SQRTF(S * (S - FLOATF(IA)) * (S - FLOATF(IB)) *
     +             (S - FLOATF(IC)))
      WRITE OUTPUT TAPE 6, 601, IA, IB, IC, AREA
  601 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陳述式,並配合上CONTINUE以更加結構化的方式來表示。

C     通过标准的平方根函数计算三角形面积
C     输入 - 磁带读取器单元5,整数输入
C     输出 - 行式打印机单元6,实数输出
C     输入错误 - 显示错误输出代码1于作业控制列表中
      READ (5, 501) IA, IB, IC
  501 FORMAT (3I5)
C     IA、IB和IC不可以是负数或零
C     再进一步,一个三角形的两条边的总和
C     必须大于第三边,所以我们也做此检查
      IF (IA .GT. 0 .AND. IB .GT. 0 .AND. IC .GT. 0) GOTO 10
        WRITE (6, 602)
  602   FORMAT (42H IA, IB, AND IC MUST BE GREATER THAN ZERO.)
        STOP 1
   10 CONTINUE
      IF (IA+IB-IC .GT. 0
     +    .AND. IA+IC-IB .GT. 0
     +    .AND. IB+IC-IA .GT. 0) GOTO 20
        WRITE (6, 603)
  603   FORMAT (50H SUM OF TWO SIDES MUST BE GREATER THAN THIRD SIDE.)
        STOP 1
   20 CONTINUE
C     我们使用海伦公式
C     计算三角形的面积
      S = (IA + IB + IC) / 2.0
      AREA = SQRT ( S * (S - IA) * (S - IB) * (S - IC))
      WRITE (6, 601) IA, IB, IC, AREA
  601 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不可以是负数或零
C     再进一步,一个三角形的两条边的总和
C     必须大于第三边,所以我们也做此检查
      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
      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     我们使用海伦公式
C     计算三角形的面积
      S = (IA + IB + IC) / 2.0
      AREA = SQRT ( S * (S - IA) * (S - IB) * (S - IC))
      WRITE (*, 601) IA, IB, IC, AREA
  601 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

下面展示編譯和執行這個程式的結果:

$ g77 -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). 

延伸閱讀

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

外部連結

編輯