Fortran_95

**Fortran**，可音譯為**福傳**，源自於「公式翻譯」（英語：**For**mula **Tran**slation）的縮寫，它是通用的編譯型指令式程式語言，特別適用於數值計算和科學計算。它在 1957 年由 IBM 開發出來，是世界上第一個被正式採用並流傳至今的高階程式語言。

## 簡介

Fortran 最初由 IBM 在 1950 年代開發，用於科學和工程應用，並隨後長時間統治了科學計算程式。它已經在計算密集領域裡應用了超過六個年代，比如數值天氣預報、有限元分析、計算流體力學、地球物理學、計算物理學、晶體學和計算化學。它是高效能運算的流行語言，並被用於世界上最快超級電腦的基準測試和排名。

Fortran 有很多版本，每個都增加擴充卻在很大程度上保持與前面版本的相容性。後續版本已經增加支援了：結構化程式和基於字元資料的處理（FORTRAN 77），陣列程式、模組化程式和泛型程式（Fortran 90），高效能 Fortran (Fortran 95），物件導向程式設計（Fortran 2003），並行計算（Fortran 2008）和天然的平行計算能力（Coarray Fortran 2008/2018）。

Fortran 的設計是很多其他語言的基礎。其中最周知的是 BASIC，它基於了 FORTRAN II，具有一些語法清理，尤其是更好的邏輯結構，和其他在互動式環境中使工作更加容易的變更。

## 起源

在 1953 年後期，約翰・巴科斯（John W. Backus）向他在 IBM 的上司提交了一份提案，要為程式他們的 IBM 704 主機，而開發一種更實用的語言以替代組合語言。歷史上 Backus 的團隊包括了程式設計師 Richard Goldberg、Sheldon F. Best、Harlan Herrick、Peter Sheridan、Roy Nutt、Robert Nelson、Irving Ziller、Harold Stern、Lois Haibt 和 David Sayre。它的概念包括更容易的將方程錄入電腦，這是 J. Halcombe Laning 發展出的想法，並且在 1952 年演示於 Laning 與 Zierler 系統之中。

在 1954 年 11 月，Backus 等人完成了草案規定《IBM 數學公式轉譯系統 FORTRAN》，第一本 FORTRAN 手冊出現在 1956 年 10 月，隨後在 1957 年 4 月交付了第一個 FORTRAN 編譯器。這是第一個最佳化編譯器，因為客戶不情願使用高階程式語言，除非它的編譯器能夠生成接近於手工編碼組合語言效能的代碼。

儘管程式社群質疑新方法能否勝過手工編碼，它將操作一台機器所需的程式語句數目縮減了 20 倍，因而快速的獲得了接受。John Backus 在 1979 年與 IBM 雇員雜誌《Think》的一次訪談中說道：「我的多數工作出於懶惰。我不喜歡寫程式，所以當我工作在 IBM 701 上，為計算彈道軌跡書寫程式的時候，我開始製造一個程式系統來使得書寫程式更加容易」。

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

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

Fortran 的發展平行於編譯器技術的早期演進，在理論和編譯器設計上的進步，受到為 Fortran 程式生成高效代碼的激勵。

### FORTRAN

最早的 FORTRAN 版本應用於 IBM 704 系統上，包含了 32 個語句：

* `DIMENSION` 和 `EQUIVALENCE` 語句。
* 賦值語句。
* 三態算術 `IF` 語句。
* 檢查異常情況：`IF ACCUMULATOR OVERFLOW`、`IF QUOTIENT OVERFLOW` 和 `IF DIVIDE CHECK`；操縱感應開關和感應燈：`IF (SENSE SWITCH i)`、`SENSE LIGHT i` 和 `IF (SENSE LIGHT i)`。
* `GOTO`、計算 `GOTO`、`ASSIGN` 和賦值 `GOTO`。
* `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` 語句（為編譯器提供最佳化提示）。

## 演化

### FORTRAN II

1958 年 IBM 又推出 FORTRAN II。主要的增強是憑藉允許使用者書寫的次常式和函式，它們通過傳遞參照的形式參數來返回值，從而支援了程序式程式。`COMMON` 語句為次常式提供了存取公共（或稱全域）變數的一種方式。增加了如下 6 個新語句：

* `SUBROUTINE`、`FUNCTION` 和 `END`。
* `CALL` 和 `RETURN`。
* `COMMON`。

接下來的幾年內，FORTRAN II 又繼續支援了 `DOUBLE PRECISION` 和 `COMPLEX` 資料類型。

早期的 FORTRAN 編譯器在次常式中不支援遞迴。早期的電腦架構不支援堆疊的概念，當它們直接支援次常式呼叫的時候，返回位置經常儲存在毗鄰這個次常式代碼的一個固定位置（例如 IBM 1130），或一個特定的機器暫存器（IBM 360 系列）之中，它們只能在如下條件下允許遞迴，即由軟體來維護一個堆疊，這個返回位址要在進行呼叫之前儲存在堆疊之上，並在這個呼叫返回之後恢復。儘管沒有規定於 FORTRAN 77 之中，很多 F77 編譯器將其作為一個選項來支援遞迴，而 Burroughs 主機，設計有內建的遞迴，而將其作為預設來支援。它在 Fortran 90 中通過新關鍵字 `RECURSIVE` 而成為標準。

#### 簡單的 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」。

### FORTRAN III 至 FORTRAN IV

IBM 繼續開發 FORTRAN III，至 1958 年時已允許內建組合語言代碼以及其他一些特徵；然而這個版本卻從未作為產品推出。類似於 704 FORTRAN 和 FORTRAN II，FORTRAN III 包含了過多的機器依賴性，造成程式碼不易移植到其他機器上的問題。其他廠商提供的早期 FORTRAN 版本也經常遭受類似的困苦。

FORTRAN 被提供給 IBM 1401 電腦，通過一種創新的 63 階段編譯器，它完整的執行於只有 8000 個（六位元）字元的磁芯記憶體中。這個編譯器可以從磁帶或者從 2200 張打孔卡開始執行；它不進一步的使用磁帶或磁碟儲存。它保持程式在記憶體中並裝載覆蓋部分，就地逐步將它轉換成可執行形式，正如 Haines 描述的那樣。此文被重印編輯於兩版的《編譯器剖析》和 IBM 手冊《Fortran 規定和操作過程，IBM 1401》之中。這種可執行形式不完全是機器語言；轉而浮點數算術、下標、輸入 / 輸出和函式參照是解釋執行的，這早先於 UCSD Pascal 的 P-code 兩個年代。IBM 後來為 1400 系列電腦提供了 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 版本。

到了 1965 年，FORTRAN IV 應該已經符合了美國標準協會 X3.4.3 FORTRAN 工作群組開發的標準。在 1966 年至 1968 年之間，IBM 為其 System/360 提供了一些 FORTRAN IV 編譯器，每個都以指示了編譯器執行需要的最小記憶體量的字母來命名。字母 F、G、H 匹配 System/360 模式編號來指示記憶體大小，每個字母增長都是二倍：

* 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）。

大約在這個時候，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`（例如庫）函式。
* 賦值語句
* `GOTO`、計算 `GOTO`、`ASSIGN` 和賦值 `GOTO` 語句。
* 邏輯 `IF` 和算術（三態）`IF` 語句。
* `DO` 迴圈語句。
* `READ`、`WRITE`、`BACKSPACE`、`REWIND` 和 `ENDFILE` 語句，用以處理順序讀寫。
* `FORMAT` 語句和賦值格式。
* `CALL`、`RETURN`、`PAUSE`、`STOP` 和 `CONTINUE` 語句。
* 霍爾瑞斯常數，用於 `DATA` 和 `FORMAT` 語句，作為給子程式的實際參數。
* 最長 6 個字元的識別碼。
* 注釋行。
* `END` 行。

### FORTRAN 77

在 FORTRAN 66 標準推出之後，各家編譯器廠商不斷推出更具擴充性的標準 FORTRAN，促使 ANSI 委員會 X3J3 於 1969 年開始著手於 1966 標準版本的修訂工作，這得到了電腦商業裝置製造商協會 CBEMA（曾經的 BEMA）的贊助。這個修訂標準的最終草案於 1977 年發表，並在 1978 年 4 月被正式批准為新的 FORTRAN 標準。新標準叫做 FORTRAN 77，其官方代號是 X3.9-1978，它增加了一些重要特徵來彌補 FORTRAN 66 的許多缺點：

* 塊狀 `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），解決了在以前標準中允許但很少使用的漏洞和病態情況，少量特定功能被特意刪除了，比如：

* 霍爾瑞斯常數和霍爾瑞斯資料，例如：`GREET = 12HHELLO THERE!`。
* 在 `FORMAT` 規定中讀入 H 編輯（霍爾瑞斯欄位）描述符。
* 通過下標對陣列邊界的翻越索引，例如：
* 將控制轉移出離和回入 `DO` 迴圈的範圍（也叫做「擴充範圍」)。

### 過渡到 ANSI 標準 Fortran

開發繼 FORTRAN 77 之後的修訂標準被反覆的推遲，因為標準化過程難以跟上計算和程式實踐的快速變化。與此同時，作為「標準 FORTRAN」將近十五年，FORTRAN 77 成為了程式語言歷史上最重要的 Fortran 方言。

一個重要的 FORTRAN 77 實用擴充，是 1978 年發行的 MIL-STD-1753。這個由美國國防部制定的規範，標準化了由多數 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 系統上的呼叫。有超過一百種功能呼叫被定義在文件中。允許存取 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 中被刪除了。

### 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 提供保證的，當它們登出作用域時會被自動釋放掉，避免了記憶體流失的可能性。另外，別名也不再是最佳化陣列參照時的一個問題，可以使編譯器生成比用指標時更快的代碼。

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」，這個術語在文獻中的使用日漸增長。

### Fortran 2003

Fortran 2003 正式發表為 ISO/IEC 1539-1:2004，它是介入了很多新特徵的重大修訂版本。ISO Fortran 工作群組（ISO/IEC JTC 1/SC 22/WG5）的官方網站有關於 Fortran 2003 新特徵的詳細總結。

據該文所述，本版本的主要改進包括：

* 增強了的衍生類型：參數化衍生類型，改進的可存取性控制，改進的結構構造子和終止器。
* 支援物件導向程式設計：類型擴充和繼承，多型，動態型別分配，以及類型繫結過程，提供對抽象資料類型的完全支援。
* 改善了資料操縱：可分配的成員（結合了 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 月通過。它只是一個小改版，略微更正了 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 語言的互操作性》，它於 2012 年 5 月被提交到 ISO 並獲得批准。這個規定增加對 C 語言存取陣列描述符的支援，並允許忽略實際參數的類型和秩。

### Fortran 2018

Fortran 語言的最新修訂（Fortran 2018）早先稱為 Fortran 2015，它是一個重大的修訂並且發行於 2018 年 11 月 28 日。

Fortran 2018 結合了兩個此前出版的技術規範：

* ISO/IEC TS 29113:2012《進一步的 Fotran 同 C 語言的互操作性》。
* ISO/IEC TS 18508:2015《補充的 Fortran 並列特徵》。

此外的變更和新特徵包括支援：ISO/IEC/IEEE 60559:2011（在 IEEE 754-2019 的最新細小修訂之前的 IEEE 浮點數標準）、十六進位輸入 / 輸出、`IMPLICIT NONE` 增強和其他變更。

## 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 的寫法：

下面是 Fortran 90 的寫法：

### 最大公約數

下面的 FORTRAN 77 代碼例子，使用歐幾里德演算法計算兩個數 `A` 和 `B` 的最大公約數：

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

### Fortran 90 特色範例

下面的程式展示動態記憶體分配和基於陣列的運算，這是 Fortran 90 介入的兩個特徵。要特別注意的是在操縱陣列時，未出現 `DO` 迴圈和 `IF`/`THEN` 語句，數學運算應用於作為整體的陣列。同樣明顯的是運用了描述性變數名字和普通代碼格式，這符合當代程式風格。這個例子在互動式錄入的資料上計算平均值：

## FORTRAN 編譯器

Windows 作業系統下：

Linux 作業系統下：

## FORTRAN 數值庫

幾個著名的 Fortran 軟體套件：

## 參見

* f2c
* F2PY NumPy
* Fortran 編譯器列表
* Fortran 數值庫列表
* 矩陣表示
* 行主序和列主序

## 註解

## 參照

## 延伸閱讀

**語言標準**

* Ansi x3.9-1966. USA Standard FORTRAN (PDF). American National Standards Institute.  Informally known as FORTRAN 66.
* Ansi x3.9-1978. American National Standard – Programming Language FORTRAN (PDF). American National Standards Institute.  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.  Informally known as Fortran 90.
* ISO/IEC 1539-1:1997 (Final Draft). Information technology – Programming languages – Fortran – Part 1: Base language (PDF).  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).
* ISO/IEC 1539-1:2018 (Final Draft). Information technology – Programming languages – Fortran – Part 1: Base language (PDF).

**有關標準**

* 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.

**其他參考材料**

* ECMA Standard on FORTRAN (PDF). European Computer Manufacturers Association. April 1965.
* FORTRAN 77 4.0 Reference Manual (PDF). Sun Microsystems, Inc. 1995.
* 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.
* IBM System/360 and System/370 Fortran IV Language (PDF). IBM. May 1974.
* 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