本頁使用了標題或全文手工轉換

Fortran

維基百科,自由的百科全書
跳至導覽 跳至搜尋
Fortran
Fortran acs cover.jpeg
編程範型 多重範式程序化命令式結構化物件導向
設計者 約翰·巴科斯
實作者 約翰·巴科斯IBM
釋出時間 1957
最近釋出日期 Fortran 2008(ISO/IEC 1539-1:2010)(2010年)
型態系統 強類型靜態
常用副檔名 .f, .for, .f90, .f95

福傳英語:Fortran),源自於「公式翻譯」(英語:Formula Translation)的縮寫,是一種程式語言。1957年由IBM開發出,是世界上第一個被正式採用並流傳至今的高階程式語言

歷史[編輯]

一架曾由勞倫斯利佛摩國家實驗室(Lawrence Livermore National Laboratory,LLNL)操作的古老IBM 704大型主機
FORTRAN發明的年代還沒有鍵盤與螢幕,程式碼必須使用打卡機打在打孔卡(punch card)上。圖中顯示卡片上的1-5行、第6行與73-80行被使用過。

Fortran語言是為了滿足數值計算的需求而發展出來的。1953年12月,IBM公司工程師約翰·巴科斯(J. Backus)因深深體會編寫程式很困難,而寫了一份備忘錄給董事長斯伯特·赫德英語Cuthbert Hurd(Cuthbert Hurd),建議為IBM704系統設計全新的電腦語言以提升開發效率。當時IBM公司的顧問馮·紐曼強烈反對,因為他認為不切實際而且根本不必要。但赫德批准了這項計劃。1957年,IBM公司開發出第一套FORTRAN語言,在IBM704電腦上運作。歷史上第一支FORTRAN程式在馬利蘭州的西屋貝地斯核電廠試驗。1957年4月20日星期五的下午,一位IBM軟件工程師決定在電廠內編譯第一支FORTRAN程式,當程式碼輸入後,經過編譯,印表機列出一行訊息:「原始程式錯誤……右側括號後面沒有逗號」,這讓現場人員都感到訝異,修正這個錯誤後,印表機輸出了正確結果。而西屋電氣公司因此意外地成為FORTRAN的第一個商業用戶。1958年推出FORTRAN Ⅱ,幾年後又推出FORTRAN Ⅲ,1962年推出FORTRAN Ⅳ後,開始廣泛被使用。

1966年,美國標準化協會制定了Fortran(x3.9-1966,也就是Fortran 66)和Fortran(x3.10-1966)標準。這時Fortran語言還不是結構化的程式語言。

1976年,美國標準化協會重新對Fortran(x3.9-1966)進行了評估,公佈了新的Fortran標準,也就是Fortran 77。Fortran 77是具有結構化特性的程式語言。Fortran77在短時間內取得了巨大的成功,廣泛地應用於科學和工程計算,幾乎統治了數值計算領域。

1980年,Fortran 77被ISO接納為國際標準。

1991年發佈的Fortran 90大幅改進了舊版Fortran的型式,加入了物件導向的觀念與提供指標,並同時加強陣列的功能。

Fortran後來又陸續推出Fortran 95、Fortran 2003等更新版本。

FORTRAN[編輯]

最早的FORTRAN版本應用於IBM 704系統上,包含了32種陳述式,包括:

  • DIMENSIONEQUIVALENCE陳述式
  • 賦值陳述式
  • 三態算術IF陳述式。[註 1]
  • IF這個陳述式檢查例外情況(ACCUMULATOR OVERFLOW, QUOTIENT OVERFLOWDIVIDE CHECK);IF陳述式以處理判斷開關和判斷指示燈
  • GOTO,計算的GOTOASSIGN,和賦值GOTO
  • DO迴圈
  • 格式化的輸入與輸出(Formatted I/O): FORMAT, READ, READ INPUT TAPE, WRITE, WRITE OUTPUT TAPE, PRINTPUNCH
  • 非格式化的輸入與輸出(Unformatted I/O): READ TAPE, READ DRUM, WRITE TAPEWRITE DRUM
  • 其他的輸入與輸出:END FILE, REWIND,和BACKSPACE
  • PAUSE, STOP,和CONTINUE
  • FREQUENCY陳述式(為編譯器提供最佳化幫助)[註 2]

FORTRAN II[編輯]

1958年IBM又推出FORTRAN II.支援使用者撰寫副程式(subroutines)以及函數(functions)。有六個新陳述如下:

  • SUBROUTINE, FUNCTION,和END
  • CALLRETURN
  • COMMON

接下來的幾年內,FORTRAN II繼續又支援DOUBLE PRECISIONCOMPLEX等數據型態(data types)。

FORTRAN III[編輯]

IBM繼續開發FORTRAN III至1958年時已可以內建匯編語言碼並新增其它功能;然而這個版本卻從未推出。有如704 FORTRAN和FORTRAN II、FORTRAN III等的開發過程包含了過多的機器相依性(machine-dependent),造成程式碼不易移植到其他機器上的問題。早期提供FORTRAN版本的廠商經常為此所苦

一張Fortran代碼表,程式設計師準備將上面寫的代碼用打卡機轉錄到卡片上。現在已不再使用這種方式。

FORTRAN IV[編輯]

自1961年開始,由於客戶的強烈要求,IBM開始發展FORTRAN IV,目的在於移除一些FORTRAN II中過於依賴機器本身的程式碼(例如:READ INPUT TAPE)同時新增一些新的功能,如LOGICAL數據型別。布林類型(TRUE或者FALSE)與邏輯IF陳述式則取代了算術IF陳述式。FORTRAN IV於1962年推出,最早應用於IBM 7030("Stretch")電腦之上,以及其接續的IBM 7090IBM 7094版本。

FORTRAN 66[編輯]

早期的FORTRAN語言發展史上最重要的一件大事也許是美國標準協會American Standards Association,即今日的ANSI)的委員們開始為FORTRAN制定標準規格,名為"American Standard Fortran." 1966年委員會推出兩套FORTRAN標準版本,分別定義成FORTRAN(基於FORTRAN IV,用來應付de facto標準)和Basic FORTRAN(基於FORTRAN II,並且移除其平台依賴性)。FORTRAN第一套標準後來被稱為FORTRAN 66(大家仍習慣稱之為FORTRAN IV)。FORTRAN 66有效的成功第一套工業標準版的FORTRAN。其功能如下:

  • 主程式,SUBROUTINEFUNCTIONBLOCK DATA程式單元
  • INTEGER, REAL, DOUBLE PRECISION, COMPLEXLOGICAL數據類型
  • COMMON, DIMENSIONEQUIVALENCE陳述式
  • DATA陳述式用以指定初始值
  • 內部和EXTERNAL例如庫)函數
  • 賦值陳述式
  • GOTO,賦值GOTO和計算GOTO陳述式
  • 邏輯IF和算術(三態)IF陳述式
  • DO迴圈
  • READ, WRITE, BACKSPACE, REWINDENDFILE陳述式以處理順序讀寫
  • FORMAT陳述式
  • CALL, RETURN, PAUSESTOP陳述式
  • DATAFORMAT陳述式中的霍爾瑞斯常數,作為子程式的實際參數
  • 最長六個字母的識別元
  • 注釋行

FORTRAN 77[編輯]

在FORTRAN 66標準推出之後,各家編譯器廠商不斷推出更具擴充性的標準FORTRAN("Standard Fortran"),這使得ANSI於1969年開始着手於1966標準版本的修正工作。最後定稿於1977年,1978年四月正式推出FORTRAN。新的標準規格也就是著名的FORTRAN 77,這個版本是基於FORTRAN 66之上新增許多功能,彌補過去的缺點:

  • CHARACTER數據類型,極大地擴充功能了的字元輸入和輸出以及對基於字元的數據進行處理的工具
  • IMPLICIT陳述式
  • IF陳述式塊,以及可選的ELSEELSE IF從句,提供改進了的對結構化程式的語言支援。
  • OPENCLOSEINQUIRE陳述式以改進I/O能力
  • 直接存取檔案I/O
  • PARAMETER陳述式以指定常數
  • SAVE陳述式以儲存本地變數
  • 內部函數的通用名稱

1978年推出了一個重要的版本FORTRAN 77是為MIL-STD-1753 Release版。這個規格由美國國防部制定,這個標準化的FORTRAN 77編譯器並未引入ANSI FORTRAN 77標準。一些新功能最終合併到Fortran 90標準版。

1991年推出IEEE 1003.9 POSIX標準版,為Fortran-77的程式人員提供了POSIX system上的呼叫。有超過一百種功能呼叫被定義在檔案上。允許存取POSIX-相容的行程控制(process control)、訊號取得(signal handling)、檔案系統控制(file system control)、裝置控制(device control)、程式指定(procedure pointing),以及數據流的輸入與輸出(stream I/O)。

由於成功的修正了FORTRAN 77發展流程,使得原本過於緩慢重複的程式設計可以順利的應付電腦領域迅速的變化。同時,作為將近15年的「標準FORTRAN」,FORTRAN 77成為歷史上最重要的一套電腦語言。

Fortran 90[編輯]

FORTRAN 77的被嚴重推遲的後續版本,非正式名稱是Fortran 90,最終於1992年作為ANSI標準發表。這一大版本添加了許多新特性以反映自1978年標準以來發展的在程式方面顯著的變化:

  • 自由格式原始碼輸入,以及小寫的Fortran關鍵字
  • 模組,將有關聯的過程和數據組合在一起,使它們可以被其它程式單元呼叫,包括允許限制一些模組的特定部分存取。
  • RECURSIVE過程
  • 極大地改善了參數傳遞機制,允許在編譯時檢查介面
  • 通用過程的用戶自訂介面
  • 運算子多載
  • 衍生/抽象數據類型
  • 新的數據類型定義語法,以指定數據類型和變數的其它屬性
  • 可以在運算式和賦值陳述式中按整體運算元組(或陣列節),由此極大地簡化了數學和工程計算。這些特性包括整體、部分和通配的陣列賦值(比如用WHERE陳述式作選擇性賦值),陣列常數和運算式,用戶定義的陣列函數和陣列構造。
  • 動態記憶體分配通過ALLOCATABLE屬性和ALLOCATEDEALLOCATE陳述式
  • POINTER屬性,指標賦值和NULLIFY陳述式以便於建立和操作動態數據結構
  • CASE結構以用於多路選擇
  • EXITCYCLE陳述式以用於在按順序地"跳出"正常的DO迴圈重複
  • 最長31個字元的識別元
  • 行內注釋
  • 用戶可控制的可定義的數字精度
  • 新的和增強的內部過程

Fortran 95[編輯]

Fortran 95僅是一個小改版,大部份修正了Fortran 90 standard一些較為顯著的問題。雖然如此,Fortran 95仍有不少的擴充,尤其是在High Performance Fortran的規格:

  • FOR ALL和巢狀的WHERE結構以幫助向量化
  • 用戶定義的PUREELEMENTAL過程

Fortran 95的一個重要補充是ISO技術報告TR-15581:增強的數據類型工具[失效連結],非正式名稱是可分配的TR。這一標準定義了ALLOCATABLE陣列的增強的應用,先於與完全的Fortran 2003相容的Fortran編譯器,以供使用。這些使用包括在過程偽參數列中以及將函數返回值使用ALLOCATABLE陣列作為衍生的類型元件。(ALLOCATABLE陣列比基於POINTER的陣列更受歡迎,因為ALLOCATABLE陣列是由Fortran 95保證的,當它們退出範圍時會被自動釋放掉,避免了記憶體溢位的可能性。另外,別名也不再是最佳化陣列參考時的一個問題,可以使編譯器生成比用指標時更快的代碼。)

Fortran 95的第二個補充是ISO技術報告TR-15580:浮點例外處理[失效連結],非正式名稱是IEEE TR。這一標準定義了對IEEE浮點算術浮點例外處理的支援。

Fortran 2003[編輯]

Fortran 2003有着更大幅度的改版。ISO Fortran Working Group (WG5)的官方網站有關於Fortran 2003新特性的詳細總結,並有PDF檔案PDF或者压缩PostScript檔案[失效連結]可供直接下載。

據該文所述,本版本的主要改進包括:

  • 增強了衍生類型:帶參數的衍生類型,改善了控制的可操作性,改善了結構化的建立和釋放。
  • 支援物件導向程式設計擴充功能類型和繼承多型,動態型別分配,以及類型繫結過程。
  • 改善了數據操作:可分配的元件(編入IEEE TR 15581),延期的類型參數,VOLATILE屬性,在陣列構造和分配陳述式中顯式定義類型,增強的指標,擴充功能的初始化運算式,增強的內部過程。
  • 增強的輸入/輸出:異步傳輸,流存取,用戶指定衍生類型的傳輸操作,用戶在格式轉換時指定捨入控制,為連線前單元指定常數,FLUSH陳述式,關鍵字的規範,存取錯誤資訊。
  • 過程指標
  • 支援IEEE浮點演算法浮點例外處理(編入IEEE TR 15580)。
  • C語言的互動性
  • 支援國際化:存取ISO 106464位元組字元和在格式化的數字輸入/輸出中選擇數字或者逗號。
  • 與宿主作業系統增強的整合:存取命令列參數,環境變數和處理器錯誤資訊。

Fortran 2008[編輯]

Fortran 2003之後的下一個版本是Fortran 2008.一如Fortran 95,這只是一個小改版,略微更正了Fortran 2003的一些問題,並且合併了TR-19767的語言功能。

如同February 2007,新的功能包括了[註 3]

2007年8月,數據型態BIT被刪除了。2008年2月,Coarrays的計劃已縮小,僅有Parallel I/O,而研發團隊也被裁員了。

FORTRAN的特性[編輯]

  • Fortran語言的最大特性是接近數學公式的自然描述,在電腦里具有很高的執行效率。
  • 易學,語法嚴謹。
  • 可以直接對矩陣複數平行運算,這點Matlab有繼承。
  • 自誕生以來廣泛地應用於數值計算領域,積累了大量高效而可靠的原始程式
  • 很多專用的大型數值運算電腦針對Fortran做了最佳化。
  • 廣泛地應用於平行計算高效能計算領域。
  • Fortran 90,Fortran 95,Fortran 2003的相繼推出使Fortran語言具備了現代高階程式語言的一些特性。
  • 其矩陣元素在記憶空間儲存順序是採用列優先(Column first),Matlab也承襲這點,目前最多使用的C語言則採用行優先(Row first)。

FORTRAN的Hello World程式[編輯]

下面是一個在標準輸出裝置上輸出Hello World的簡單程式,這種程式通常作為開始學習程式語言時的第一個程式:

以Fortran 90/95自由格式的寫法為例

! 驚嘆號之後是註解
program main ! 這行可以省略,但是寫大程式的時候會發生混亂
    write (*,*) "hello, world!" ! 第一個* 表示輸出縮排使用內定值,第二個* 表示不指定輸出格式
    write (unit = *, fmt = * ) "hello, world!" ! 做和上一行一樣的事
    stop ! 這行代表程式結束,可以省略
end program main ! end之後的program main也可以省略,但寫上是比較嚴謹

FORTRAN編譯器[編輯]

  • Windows作業系統下:
    • Visual Fortran系列
      • 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。1998年1月,DEC公司被康柏公司收購,Digital Visual Fortran更名為Compaq Visual Fortran。
      • Compaq Visual Fortran(CVF),上述DVF的進一步發展,版本號6.5.x ~ 6.6.B。2002年5月康柏公司已併入惠普公司,但仍然稱為Compaq Visual Fortran,版本號升級到6.6.C。
      • Intel Fortran英特爾公司開發的Fortran編譯器。事實上,惠普購買了Compaq的Fortran編譯器技術之後不久,便留下了用於LinuxUNIX系統的相關技術,而將Windows平台上的Fortran編譯器相關權利全部轉售給Intel。因此從CVF 6.6.C之後,Windows平台下的Visual Fortran編譯器就改由Intel生產和銷售了,(需要微軟Visual Studio外殼的支援才能實現Visual IDE功能,Intel只提供命令列介面的編譯器內核)。在Intel手上的版本編號從7.0開始至現在。
    • Lahey Fortran
    • Absoft Fortran
    • OpenWatcom
    • Silverfrost FTN95,個人用戶可免費使用的Fortran 95編譯器套件。支援編譯為Win32或.NET可執行程式,內建名為Plato的IDE,也可通過外掛模組支援Visual Studio,偵錯程式使用SDBG。
  • Linux作業系統下:
    • PGI Fortran
    • g77,GNU的Fortran 77編譯器,整合在GCC中。
    • gfortran,GNU的最新的Fortran編譯器,整合在GCC 4.x及以上版本中,目前支援全部Fortran 95、大部分Fortran 2003和Fortran 2008的功能,以替代G77。
    • Intel Fortran
    • Absoft Fortran
    • g95,跟GFORTRAN同為開放源碼的Fortran 95編譯器。
    • Sun Studio
    • Open64編譯器

FORTRAN的套件[編輯]

幾個著名的Fortran Package:

  • IMSL--國際數學和統計連結庫
  • MKL--Intel數學核心庫
  • NAG--NAG數學庫
  • BLAS--Basic Linear Algebra Subroutines
  • LAPACK--Linear Algebra PACKage

註解[編輯]

  1. ^ 注意:通常人們會認為這一陳述式對應於IBM 704上的一個三態分支指令。但事實並非如此,704的分支指令只包含了一個目標地址(例如,TZE - 轉換AC為零,TNZ - 轉換AC為非零,TPL - 轉換AC為加,TMI - 轉換AC為減)。機器(以及它的後繼者如700/7000系列)確實有一個三態跳轉指令(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.

  3. ^ 這份報告中有一個完整列表,可查閱於http://www.fortran.bcs.org/2006/ukfortran06.pdfPDF (24.2 KB).

外部連結[編輯]

參見[編輯]