Loading AI tools
結構化編程語言 来自维基百科,自由的百科全书
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版本應用於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 |
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]。
下面的海倫公式程式, 從磁帶盤上讀取數據,它包含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 AREA OF A TRIANGLE WITH A STANDARD SQUARE ROOT FUNCTION
C INPUT - TAPE READER UNIT 5, INTEGER INPUT
C OUTPUT - LINE PRINTER UNIT 6, REAL OUTPUT
C INPUT ERROR DISPLAY ERROR OUTPUT CODE 1 IN JOB CONTROL LISTING
READ INPUT TAPE 5, 501, IA, IB, IC
501 FORMAT(3I5)
C IA, IB, AND IC MAY NOT BE NEGATIVE OR ZERO
C FURTHERMORE, THE SUM OF TWO SIDES OF A TRIANGLE
C MUST BE GREATER THAN THE THIRD SIDE, SO WE CHECK FOR THAT, TOO
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 USING HERON'S FORMULA WE CALCULATE THE
C AREA OF THE TRIANGLE
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
IBM繼續開發FORTRAN III,至1958年時已允許內建匯編語言代碼以及其他一些特徵[24];然而這個版本卻從未作為產品推出。類似於704 FORTRAN和FORTRAN II,FORTRAN III包含了過多的機器依賴性,造成程式碼不易移植到其他機器上的問題。其他廠商提供的早期FORTRAN版本也經常遭受類似的困苦。
自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]:
數字裝置公司(DEC)在1967年至1975年之間為PDP-10維護了DECSYSTEM-10 Fortran IV(F40)[29]。
大約在這個時候,FORTRAN IV開始成為重要的教育工具和實現,比如滑鐵盧大學創造了WATFOR和WATFIV來簡化早期編譯器複雜的編譯和連結過程。
早期的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
陳述式,作為給子程式的實際參數。END
行。在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能力。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編輯(霍爾瑞斯欄位)描述符。 DIMENSION A(10,5)
Y = A(11,1)
DO
迴圈的範圍(也叫做「擴充範圍」)。開發繼FORTRAN 77之後的修訂標準被反覆的推遲,因為標準化過程難以跟上計算和程式實踐的快速變化。與此同時,作為「標準FORTRAN」將近十五年,FORTRAN 77成為了程式語言歷史上最重要的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
變體。1991年推出IEEE 1003.9 POSIX標準,為Fortran-77的程式人員提供了POSIX系統上的呼叫[32]。有超過一百種功能呼叫被定義在文件中。允許訪問POSIX相容的行程控制、訊號處理、檔案系統控制、裝置控制、過程定點,以及可移植方式下的串串流輸入/輸出。
FORTRAN 77的被嚴重推遲的後續版本,非正式名稱是Fortran 90,最終在1991年發行為ISO/IEC標準1539:1991,在1992年發行為ANSI標準。除了將官方拼寫從FORTRAN改為Fortran之外,這個重大修訂版本增加了很多特徵,用來反映自從1978年標準以來演變出的程式實踐中的重要變化:
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正式發表為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)。
作為由二十一世紀的標準定義的語言,特別是因為它結合了物件導向程式設計支援和後來的Coarray Fortran,它經常被稱為「現代Fortran」,這個術語在文獻中的使用日漸增長[34]。
Fortran 2003正式發表為ISO/IEC 1539-1:2004,它是介入了很多新特徵的重大修訂版本[35]。ISO Fortran工作群組(ISO/IEC JTC 1/SC 22/WG5)的官方網站有關於Fortran 2003新特徵的詳細總結[36]。
據該文所述,本版本的主要改進包括:
VOLATILE
特性,在陣列構造子和分配陳述式中顯式的類型指定,增強的指標,擴充的初始化表達式,增強的內部過程。FLUSH
陳述式,關鍵字的規範化,訪問錯誤資訊。對Fortran 2003的一個重要補充是ISO技術報告TR-19767:《增強的Fortran中模組設施》。這個報告提供了「子模組」,它使得Fortran模組更加類似於Modula-2模組。它們都類似於Ada私有子從單元。這允許模組的規定和實現,可以用分立的程式單元來表達,它改進了大型庫的包裝,允許儘管發佈明確介面卻保護商業機密,並防止編譯級聯。
ISO/IEC 1539-1:2010,非正式的叫做Fortran 2008,於2010年9月通過[37][38]。它只是一個小改版,略微更正了Fortran 2003的一些問題,並且合併了ISO/IEC TR 19767:2005的子模組功能。新的功能包括:
DO CONCURRENT
構造,用於沒有內部依賴性的迴圈迭代。CONTIGUOUS
特性,用來指定儲存格局限制。BLOCK
構造,它可以包含具有構造作用域的對象的聲明。對Fortran 2008的一個補充是ISO技術規定(TS)29113:2012《進一步的Fortran同C語言的互操作性》[39],它於2012年5月被提交到ISO並獲得批准。這個規定增加對C語言訪問陣列描述符的支援,並允許忽略實際參數的類型和秩。
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(ISO/IEC 1539-1:2023)發表於2023年11月,可從ISO獲得[48]。
Fortran語言的最大特徵,是接近數學公式的自然描述,在電腦里具有很高的執行效率。Fortran可以直接對矩陣和複數平行運算。其矩陣元素在記憶空間儲存次序,採用了縱列為主(Column major)次序,Matlab也承襲這點,而C語言則採用橫行為主(Row major)次序。
Fortran自誕生以來廣泛地應用於數值計算領域,特別是平行計算和高效能計算領域。很多專用的大型數值運算電腦針對Fortran做了最佳化。Fortran積累了大量高效而可靠的原始程式。Fortran 90、Fortran 95、Fortran 2003、Fortran 2008和Fortran 2018的相繼推出,使Fortran語言具備了現代高階程式語言的一些特徵。
範例一個在標準輸出裝置上輸出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
1 IF (IB.NE.0) THEN
ITEMP = IA
IA = IB
IB = MOD(ITEMP, IB)
GOTO 1
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介入的兩個特徵。要特別注意的是在操縱陣列時,未出現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
Windows作業系統下:
Linux作業系統下:
幾個著名的Fortran軟件套件:
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.