Fortran

Fortran，可音譯為福傳，源自於「公式翻譯」的縮寫，它是通用的編譯型指令式程式語言，特別適用於數值計算和科學計算。它在1957年由IBM開發出來，是世界上第一個被正式採用並流傳至今的高階程式語言。簡介.Fortran最初由IBM在1950年代開發，用於科學和工程應用，並隨後長時間統治了科學計算程式設計。它已經在計算密集領域裡應用了超過六個年代，比如數值天氣預報、有限元分析、計算流體力學、地球物理學、計算物理學、晶體學和計算化學。它是高效能計算的流行語言，並被用於世界上最快超級計算機的基準測試和排名。Fortran有很多版本，每個都增加擴充套件卻在很大程度上保持與前面版本的相容性。後續版本已經增加支援了：結構化程式設計和基於字元資料的處理。Fortran的設計是很多其他語言的基礎。其中最周知的是BASIC，它基於了FORTRAN II，具有一些清理，尤其是更好的邏輯結構，和其他在互動式環境中使工作更加容易的變更。起源.在1953年後期，約翰·巴科斯向他在IBM的上司提交了一份提案，要為程式設計他們的IBM 704主機，而開發一種更實用的語言以替代組合語言:69。歷史上Backus的團隊包括了程式設計師Richard Goldberg、Sheldon F. Best、Harlan Herrick、Peter Sheridan、、Robert Nelson、Irving Ziller、Harold Stern、和。它的概念包括更容易的將方程錄入計算機，這是發展出的想法，並且在1952年演示於之中。在1954年11月，Backus等人完成了草案規定《IBM數學公式轉譯系統FORTRAN》，第一本FORTRAN手冊出現在1956年10月:72，隨後在1957年4月交付了第一個FORTRAN編譯器:75。這是第一個最佳化編譯器，因為客戶不情願使用高階程式語言，除非它的編譯器能夠生成接近於手工編碼組合語言效能的程式碼。儘管程式設計社群質疑新方法能否勝過手工編碼，它將操作一臺機器所需的程式設計語句數目縮減了20倍，因而快速的獲得了接受。John Backus在1979年與IBM 僱員雜誌《Think》的一次訪談中說道：“我的多數工作出於懶惰。我不喜歡寫程式，所以當我工作在上，為計算彈道軌跡書寫程式的時候，我開始製造一個程式設計系統來使得書寫程式更加容易”。FORTRAN語言被科學家廣泛接納，用來書寫數值計算密集程式，這鼓勵編譯器作者生產可以生成更快和更高效程式碼的編譯器。在語言中包括，使得Fortran特別適合於技術應用比如電子工程。到了1960年，FORTRAN版本已經可獲得於、、和7090計算機上。FORTRAN流行性的顯著增長，刺激了競爭計算機制造商在它們的機器上提供FORTRAN編譯器，因此到了1963年，存在了超過40個FORTRAN編譯器。故此，FORTRAN被認為是第一個廣泛使用的跨平臺程式語言。Fortran的發展平行於，在理論和編譯器設計上的進步，受到為Fortran程式生成高效程式碼的激勵。FORTRAN.最早的FORTRAN版本應用於IBM 704系統上，包含了32個語句：演化.FORTRAN II.1958年IBM又推出FORTRAN II。主要的增強是憑藉允許使用者書寫的子例程和函式，它們透過傳遞引用的形式引數來返回值，從而支援了程序式程式設計。codice_31語句為子例程提供了訪問公共變數的一種方式。增加了如下6個新語句：接下來的幾年內，FORTRAN II又繼續支援了codice_38和codice_39資料型別。早期的FORTRAN編譯器在子例程中不支援遞迴。早期的計算機架構不支援堆疊的概念，當它們直接支援子例程呼叫的時候，返回位置經常儲存在毗鄰這個子例程程式碼的一個固定位置之中，它們只能在如下條件下允許遞迴，即由軟體來維護一個堆疊，這個返回地址要在進行呼叫之前儲存在堆疊之上，並在這個呼叫返回之後恢復。儘管沒有規定於FORTRAN 77之中，很多F77編譯器將其作為一個選項來支援遞迴，而，設計有內建的遞迴，而將其作為預設來支援。它在Fortran 90中透過新關鍵字codice_40而成為標準。簡單的FORTRAN II程式.下面的海倫公式程式, 從磁帶盤上讀取資料，它包含3個5位整數A、B和C作為輸入。這裡沒有“型別”宣告可用：名字開始於I、J、K、L、M或N的變數是“定點數”，其他的是浮點數。因為這個例子要處理整數，變數的名字開始於字母“I”。在FORTRAN II中變數名字必須開始於字母，並可以後續著字母和數字二者，直到達到六個字元的限制。如果A、B和C不能表示在平面幾何中一個三角形的邊，程式將結束執行，codice_28給出錯誤程式碼“1”。否則列印輸出行來顯示A、B和C的輸入值，隨後是計算出的作為浮點數的三角形的面積AREA，它佔據輸出行的10個空位，並顯示小數點後2位，這指定於標號601的codice_14語句中的“F10.2”。C AREA OF A TRIANGLE WITH A STANDARD SQUARE ROOT FUNCTIONC INPUT - TAPE READER UNIT 5, INTEGER INPUTC OUTPUT - LINE PRINTER UNIT 6, REAL OUTPUTC INPUT ERROR DISPLAY ERROR OUTPUT CODE 1 IN JOB CONTROL LISTINGREAD INPUT TAPE 5, 501, IA, IB, IC501 FORMAT(3I5)C IA, IB, AND IC MAY NOT BE NEGATIVE OR ZEROC FURTHERMORE, THE SUM OF TWO SIDES OF A TRIANGLEC MUST BE GREATER THAN THE THIRD SIDE, SO WE CHECK FOR THAT, TOOIF (IA) 777, 777, 701701 IF (IB) 777, 777, 702702 IF (IC) 777, 777, 703703 IF (IA+IB-IC) 777, 777, 704704 IF (IA+IC-IB) 777, 777, 705705 IF (IB+IC-IA) 777, 777, 799777 STOP 1C USING HERON'S FORMULA WE CALCULATE THEC AREA OF THE TRIANGLE799 S = FLOATF (IA + IB + IC) / 2.0AREA = SQRTF(S * (S - FLOATF(IA)) * (S - FLOATF(IB)) *+ (S - FLOATF(IC)))WRITE OUTPUT TAPE 6, 601, IA, IB, IC, AREA601 FORMAT(4H A= ,I5,5H B= ,I5,5H C= ,I5,8H AREA= ,F10.2,+ 13H SQUARE UNITS)STOPENDFORTRAN III至FORTRAN IV.IBM繼續開發FORTRAN III，至1958年時已允許內建組合語言程式碼以及其他一些特徵；然而這個版本卻從未作為產品推出。類似於704 FORTRAN和FORTRAN II，FORTRAN III包含了過多的機器依賴性，造成程式碼不易移植到其他機器上的問題。其他廠商提供的早期FORTRAN版本也經常遭受類似的困苦。FORTRAN被提供給計算機，透過一種創新的63階段編譯器，它完整的運行於只有8000個字元的磁芯記憶體中。這個編譯器可以從磁帶或者從2200張打孔卡開始執行；它不進一步的使用磁帶或磁碟儲存。它保持程式在記憶體中並裝載覆蓋部分，就地逐步將它轉換成可執行形式，正如Haines描述的那樣。此文被重印編輯於兩版的《編譯器剖析》和IBM手冊《Fortran規定和操作過程，IBM 1401》之中。這種可執行形式不完全是機器語言；轉而浮點數算術、下標、輸入/輸出和函式引用是解釋執行的，這早先於UCSD Pascal的P-code兩個年代。IBM後來為計算機提供了FORTRAN IV編譯器。自1961年開始，由於客戶的強烈要求，IBM開始發展FORTRAN IV，目的在於移除一些FORTRAN II中過於依賴機器本身的程式碼計算機之上，接著又推出了IBM 7090和IBM 7094版本，和後來1966年的版本。到了1965年，FORTRAN IV應該已經符合了美國標準協會X3.4.3 FORTRAN工作組開發的標準。在1966年至1968年之間，IBM為其System/360提供了一些FORTRAN IV編譯器，每個都以指示了編譯器執行需要的最小記憶體量的字母來命名。字母F、G、H匹配System/360模式編號來指示記憶體大小，每個字母增長都是二倍：數字裝置公司。大約在這個時候，FORTRAN IV開始成為重要的教育工具和實現，比如滑鐵盧大學創造了WATFOR和來簡化早期編譯器複雜的編譯和連結過程。FORTRAN 66.早期的FORTRAN語言發展史上最重要的一件大事，也許是美國標準協會。FORTRAN 66有效的成為第一套FORTRAN的工業標準版本。FORTRAN 66包括了：FORTRAN 77.在FORTRAN 66標準推出之後，各家編譯器廠商不斷推出更具擴充性的標準FORTRAN，促使ANSI委員會X3J3於1969年開始著手於1966標準版本的修訂工作，這得到了計算機商業裝置製造商協會的贊助。這個修訂標準的最終草案於1977年發表，並在1978年4月被正式批准為新的FORTRAN標準。新標準叫做FORTRAN 77，其官方代號是X3.9-1978，它增加了一些重要特徵來彌補FORTRAN 66的許多缺點：在這次標準修訂中，一些特徵被刪除或以使曾經符合標準的程式失效的方式而更改了。儘管在衝突列表的24個專案中的大多數，解決了在以前標準中允許但很少使用的漏洞和病態情況，少量特定功能被特意刪除了，比如：DIMENSION A(10,5)Y = A(11,1)過渡到ANSI標準Fortran.開發繼FORTRAN 77之後的修訂標準被反覆的推遲，因為標準化過程難以跟上計算和程式設計實踐的快速變化。與此同時，作為“標準FORTRAN”將近十五年，FORTRAN 77成為了程式語言歷史上最重要的Fortran方言。一個重要的FORTRAN 77實用擴充套件，是1978年發行的MIL-STD-1753。這個由美國國防部制定的規範，標準化了由多數FORTRAN 77編譯器實現，卻並未引入ANSI FORTRAN 77標準之中的很多特徵。這些特徵最終合併入Fortran 90標準之中。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年標準以來演變出的程式設計實踐中的重要變化：廢棄與刪除.不同於以前的修訂，在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的規定：Fortran 95的一個重要補充是ISO技術報告TR-15581：《增強的資料型別設施》，非正式名稱是“可分配TR”。這一標準定義了codice_112陣列的增強的應用，先於完全與Fortran 2003相容的Fortran編譯器而投入使用。這些使用包括將codice_112陣列作為派生型別成員、用在過程偽引數列表中以及作為函式返回值。codice_112陣列比基於codice_115的陣列更受歡迎，因為codice_112陣列是由Fortran 95提供保證的，當它們退出作用域時會被自動釋放掉，避免了記憶體洩漏的可能性。另外，別名也不再是最佳化陣列引用時的一個問題，可以使編譯器生成比用指標時更快的程式碼。Fortran 95的第二個補充是ISO技術報告TR-15580：《浮點異常處理》，非正式名稱是“IEEE TR”。這一標準定義了對IEEE浮點算術和浮點異常處理的支援。條件編譯和變長字串.除了強制性的“基礎語言”Fortran 95語言還包括兩個可選的模組：它們一起構成了多部分的國際標準。現代Fortran.作為由二十一世紀的標準定義的語言，特別是因為它結合了面向物件程式設計支援和後來的，它經常被稱為“現代Fortran”，這個術語在的使用日漸增長。Fortran 2003.Fortran 2003正式發表為ISO/IEC 1539-1:2004，它是介入了很多新特徵的重大修訂版本。ISO Fortran工作組的官方網站有關於Fortran 2003新特徵的詳細總結。據該文所述，本版本的主要改進包括：對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的子模組功能。新的功能包括：對Fortran 2008的一個補充是ISO技術規定29113:2012《進一步的Fortran同C語言的互操作性》，它於2012年5月被提交到ISO並獲得批准。這個規定增加對C語言訪問陣列描述符的支援，並允許忽略實際引數的型別和秩。Fortran 2018.Fortran語言的最新修訂早先稱為Fortran 2015，它是一個重大的修訂並且發行於2018年11月28日。Fortran 2018結合了兩個此前出版的技術規範：此外的變更和新特徵包括支援：ISO/IEC/IEEE 60559:2011、十六進位制輸入/輸出、codice_109增強和其他變更。Fortran的特徵.Fortran語言的最大特徵，是接近數學公式的自然描述，在計算機裡具有很高的執行效率。Fortran可以直接對矩陣和複數進行運算。其矩陣元素在記憶空間儲存次序，採用了次序。Fortran自誕生以來廣泛地應用於數值計算領域，特別是平行計算和高效能運算領域。很多專用的大型數值運算計算機針對Fortran做了最佳化。Fortran積累了大量高效而可靠的源程式。Fortran 90、Fortran 95、Fortran 2003、Fortran 2008和Fortran 2018的相繼推出，使Fortran語言具備了現代高階程式語言的一些特徵。程式碼例子.Hello World.示例一個在標準輸出裝置上輸出Hello World的簡單程式，這種程式通常作為開始學習程式語言時的第一個程式，下面是FORTRAN 77的寫法：PROGRAM HELLOC PRINT語句類似WRITE，C 但是列印到標準輸出單元PRINT '(A)', 'Hello, world'STOPEND下面是Fortran 90的寫法：program HelloWorldwrite (*,*) 'Hello, world!' ! 這是個行內註釋end program HelloWorld最大公約數.下面的FORTRAN 77程式碼例子，使用歐幾里德演算法計算兩個數codice_139和codice_140的最大公約數：PROGRAM EUCLIDPRINT *, 'A?'READ *, NAIF (NA.LE.0) THENPRINT *, 'A must be a positive integer.'STOPEND IFPRINT *, 'B?'READ *, NBIF (NB.LE.0) THENPRINT *, 'B must be a positive integer.'STOPEND IFPRINT *, 'The GCD of', NA, ' and', NB, ' is', NGCD(NA, NB), '.'STOPENDFUNCTION NGCD(NA, NB)IA = NAIB = NB1 IF (IB.NE.0) THENITEMP = IAIA = IBIB = MOD(ITEMP, IB)GOTO 1END IFNGCD = IARETURNEND下面展示編譯和執行這個程式的結果：$ g77 -o euclid euclid.f$ ./euclidA?24B?36The GCD of 24 and 36 is 12.Fortran 90特色示例.下面的程式展示動態記憶體分配和基於陣列的運算，這是Fortran 90介入的兩個特徵。要特別注意的是在操縱陣列時，未出現迴圈和/語句，數學運算應用於作為整體的陣列。同樣明顯的是運用了描述性變數名字和普通程式碼格式，這符合當代程式設計風格。這個例子在互動式錄入的資料上計算平均值：program average! 讀取一些數值並取其平均! 如下所寫，如果沒有資料點，返回均值為零! 儘管這可能不是預期行為，它保持例子簡單implicit nonereal, dimension(:), allocatable :: pointsinteger :: number_of_pointsreal :: average_points, positive_average, negative_averageaverage_points = 0.0positive_average = 0.0negative_average = 0.0write (*,*) "Input number of points to average:"read (*,*) number_of_pointsallocate (points(number_of_points))write (*,*) "Enter the points to average:"read (*,*) points! 透過總和諸點併除以點數來取平均if (number_of_points &gt; 0) average_points = sum(points) / number_of_points! 現在分別只在正數和負數上取平均if (count(points &gt; 0.) &gt; 0) positive_average = sum(points, points &gt; 0.) / count(points &gt; 0.)if (count(points  0) negative_average = sum(points, points &lt; 0.) / count(points &lt; 0.)! 列印結果到終端標準輸出單元6write (*,'(a,g12.4)') 'Average = ', average_pointswrite (*,'(a,g12.4)') 'Average of positive points = ', positive_averagewrite (*,'(a,g12.4)') 'Average of negative points = ', negative_averagedeallocate (points) ! 釋放記憶體end program average下面展示編譯和執行這個程式的結果：$ gfortran -o average average.f90$ ./averageInput number of points to average:8Enter the points to average:0 1 -1 2 -2 3 -3 4Average = 0.5000Average of positive points = 2.500Average of negative points = -2.000FORTRAN編譯器.Windows作業系統下：Linux作業系統下：FORTRAN數值庫.幾個著名的Fortran軟體包：