本页使用了标题或全文手工转换

Fortran

维基百科,自由的百科全书
(重定向自FORTRAN
跳到导航 跳到搜索
Fortran
Fortran logo.svg
编程范型多重范型指令式过程式结构化面向对象阵列式泛型
設計者約翰·巴科斯
實作者約翰·巴科斯IBM
发行时间1957年,​65年前​(1957
型態系統強类型靜態
文件扩展名.f, .for, .f90
網站fortran-lang.org 編輯維基數據鏈接
主要實作產品
Absoft英语Absoft Fortran Compilers, GFortran, G95英语G95, Intel英语Intel Fortran Compiler, Lahey/Fujitsu, Open Watcom, Pathscale, PGI英语The Portland Group, Silverfrost英语Silverfrost FTN95, Sun Studio, 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,可音譯為福傳,源自於「公式翻译」(英語:Formula Translation)的縮寫[1][2],它是通用的编译型指令式编程语言,特别适用于数值计算科学计算。它在1957年由IBM開發出来[3],是世界上第一个被正式采用並流传至今的高级编程語言

简介[编辑]

Fortran最初由IBM在1950年代开发[3],用于科学和工程应用,并随后统治了科学计算。它已经在计算密集领域里应用了超过六个年代,比如数值天气预报有限元分析计算流体力学地球物理学计算物理学晶体学计算化学。它是高性能计算的流行语言[4],并被用于世界上最快超级计算机的基准测试和排名[5][6]

Fortran有很多版本,每个都增加扩展却在很大程度上保持与前面版本的兼容性。后续版本已经增加支持了:结构化编程和基于字符数据的处理(FORTRAN 77),阵列编程模块化编程泛型编程(Fortran 90),高性能Fortran (Fortran 95),面向对象编程(Fortran 2003),并发计算(Fortran 2008)和天然的并行计算能力(Coarray Fortran 2008/2018)。

Fortran的设计是很多其他语言的基础。其中最周知的是BASIC,它基于了FORTRAN II,具有一些语法英语Syntax (programming languages)清理,尤其是更好的逻辑结构[7],和其他在交互式环境中使工作更加容易的变更[8]

起源[编辑]

一架曾由勞倫斯利佛摩國家實驗室(LLNL)操作的古老IBM 704大型主機

1953年12月,IBM公司工程師約翰·巴科斯(J. Backus)因深深體會編寫程序很困難,而寫了一份備忘錄給董事長斯伯特·赫德英语Cuthbert Hurd(Cuthbert Hurd),建議為IBM704系統設計全新的電腦語言以提升開發效率[9]。當時IBM公司的顾问冯·诺伊曼强烈反对,因為他認為不切實際而且根本不必要。但赫德批准了這項計劃。1957年,IBM公司开发出第一套FORTRAN语言,在IBM704電腦上運作[9]

歷史上第一支FORTRAN程式在馬里蘭州的西屋貝地斯核電廠試驗。1957年4月20日星期五的下午,一位IBM軟體工程師決定在電廠內編譯第一支FORTRAN程式,當程式碼輸入後,經過編譯,印表機列出一行訊息:“原始程式錯誤……右側括號後面沒有逗號”,這讓現場人員都感到訝異,修正這個錯誤後,印表機輸出了正確結果。而西屋電氣公司因此意外地成為FORTRAN的第一個商業用戶。

FORTRAN[编辑]

IBM 704的Fortran自动编写代码系统》(1956年10月15日),Fortran的第一本程序员参考手册[10]

最早的FORTRAN版本應用於IBM 704系統上[10],包含了32个语句:

  • DIMENSIONEQUIVALENCE语句。
  • 赋值语句。
  • 三态算术IF英语Arithmetic IF语句。[註 1]
  • 檢查异常情況:IF ACCUMULATOR OVERFLOWIF QUOTIENT OVERFLOWIF DIVIDE CHECK;操纵感应开关和感应灯英语front panelIF (SENSE SWITCH i)SENSE LIGHT iIF (SENSE LIGHT i)
  • GOTO、计算GOTOASSIGN和赋值GOTO
  • DO循环。
  • 格式化輸入與輸出:FORMATREADREAD INPUT TAPEWRITE OUTPUT TAPEPRINTPUNCH
  • 非格式化輸入與輸出: READ TAPEREAD DRUMWRITE TAPEWRITE DRUM
  • 其他的輸入與輸出:END FILEREWINDBACKSPACE
  • PAUSESTOPCONTINUE
  • FREQUENCY语句(为编译器提供优化英语Program optimization提示)。[註 2]

演化[编辑]

FORTRAN發明年代的计算机,仍未使用电传打字机或带有阴极射线管终端,程式碼必須使用键盘打孔机英语Keypunch打在打孔卡上。圖中顯示卡片上表示了一行FORTRAN代码Z(1) = Y + W(1),打孔卡的第1-5列为标号字段,第6列为接续字段,第73-80列有特殊用途。
一张Fortran代码表,程序员准备将上面写的代码用打卡机转录到卡片上。现在已不再使用这种方式。

FORTRAN II[编辑]

1958年IBM又推出FORTRAN II。主要的增强是凭借允许用户书写的子例程和函数,它们通过传递引用的形式参数来返回值,从而支持了过程式编程COMMON语句为子例程提供了访问公共(或称全局)变量的一种方式。增加了如下6個新語句[11]

  • SUBROUTINEFUNCTIONEND
  • CALLRETURN
  • COMMON

接下來的幾年內,FORTRAN II又繼續支援了DOUBLE PRECISIONCOMPLEX数据类型。

早期的FORTRAN编译器在子例程中不支持递归。早期的计算机架构不支持堆栈的概念,当它们直接支持子例程调用的时候,返回位置经常存储在毗邻这个子例程代码的一个固定位置(例如IBM 1130),或一个特定的机器寄存器(IBM 360系列)之中,它们只能在如下条件下允许递归,即由软件来维护一个堆栈,这个返回地址要在进行调用之前存储在堆栈之上,并在这个调用返回之后恢复。尽管没有规定于FORTRAN 77之中,很多F77编译器将其作为一个选项来支持递归,而Burroughs主机英语Burroughs large systems,设计有内建的递归,而将其作为缺省来支持。它在Fortran 90中通过新关键字RECURSIVE而成为标准[12]

简单的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 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

FORTRAN III至FORTRAN IV[编辑]

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

FORTRAN被提供给IBM 1401英语IBM 1401计算机,通过一种创新的63阶段编译器,它完整的运行于只有8000个(六位元)字符的磁芯内存中。这个编译器可以从磁带或者从2200张打孔卡开始运行;它不进一步的使用磁带或磁盘存储。它保持程序在内存中并装载覆盖部分,就地逐步将它转换成可执行形式,正如Haines描述的那样[13]。此文被重印编辑于两版的《编译器剖析》[14]和IBM手册《Fortran规定和操作过程,IBM 1401》[15]之中。这种可执行形式不完全是机器语言;转而浮点数算术、下标、输入/输出和函数引用是解释执行的,这早先于UCSD PascalP-code两个时代。IBM后来为1400系列英语IBM 1400 series计算机提供了FORTRAN IV编译器[16]

自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版本。

到了1965年,FORTRAN IV应该已经符合了美国标准协会X3.4.3 FORTRAN工作组开发的标准[17]。在1966年至1968年之间,IBM为其System/360提供了一些FORTRAN IV编译器,每个都以指示了编译器运行需要的最小内存量的字母来命名[18]。字母F、G、H匹配System/360模式编号来指示内存大小,每个字母增长都是二倍[19]

  • 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)[20]

大约在这个时候,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(例如库)函数。
  • 赋值语句
  • GOTO、计算GOTOASSIGN和赋值GOTO语句。
  • 逻辑IF和算术(三态)IF语句。
  • DO循环语句。
  • READWRITEBACKSPACEREWINDENDFILE语句,用以处理顺序读写。
  • FORMAT语句和赋值格式。
  • CALLRETURNPAUSESTOPCONTINUE语句。
  • 霍尔瑞斯常量英语Hollerith constant,用于DATAFORMAT语句,作为给子程序的实际参数。
  • 最长6个字符的标识符。
  • 注释行。
  • 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的许多缺点:

  • 块状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),解决了在以前标准中允许但很少使用的漏洞和病态情况,少量特定功能被特意删除了,比如:

  • 霍尔瑞斯常量英语Hollerith constant霍尔瑞斯数据,例如:GREET = 12HHELLO THERE!
  • FORMAT规定中读入H编辑(霍尔瑞斯字段)描述符。
  • 通过下标对数组边界的翻越索引,例如:
          DIMENSION A(10,5)
          Y = A(11,1)
    
  • 将控制转移出离和回入DO循环的范围(也叫做“扩展范围”)。

过渡到ANSI标准Fortran[编辑]

开发继FORTRAN 77之后的修订标准被反复的推迟,因为标准化过程难以跟上计算和编程实践的快速变化。与此同时,作为“标准FORTRAN”将近十五年,FORTRAN 77成为了编程语言历史上最重要的Fortran方言。

一個重要的FORTRAN 77实用扩展,是1978年发行的MIL-STD-1753[21]。這個由美國國防部制定的规范,標準化了由多数FORTRAN 77編譯器实现,却並未引入ANSI FORTRAN 77標準之中的很多特征。这些特征最終合併入Fortran 90標準之中。

1991年推出IEEE 1003.9 POSIX標準,為Fortran-77的程式人員提供了POSIX系统上的呼叫[22]。有超過一百種功能呼叫被定義在文档上。允許访问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不删除特征[23]。任何符合标准的FORTRAN 77程序,在Fortran 90之下也是符合标准的,二者标准都应当能够定义它的行为。

一小组特征被标识为“废弃”,并且期望在将来的标准中删除。所有这些早期版本特征的功能,都可以用较新的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提供保证的,当它们退出作用域时会被自动释放掉,避免了内存泄漏的可能性。另外,别名也不再是优化数组引用时的一个问题,可以使编译器生成比用指针时更快的代码[24]

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[编辑]

2007年在美国阿贡国家实验室架设的IBM蓝色基因超级计算机。

作为由二十一世纪的标准定义的语言,特别是因为它结合了面向对象编程支持和后来的Coarray Fortran英语Coarray Fortran,它经常被称为“现代Fortran”,这个术语在文献中的使用日渐增长[25]

Fortran 2003[编辑]

Fortran 2003正式发表为ISO/IEC 1539-1:2004,它是介入了很多新特征的重大修订版本[26]ISO Fortran工作组(ISO/IEC JTC 1/SC 22英语ISO/IEC JTC 1/SC 22/WG5)的官方网站有关于Fortran 2003新特征的详细总结[27]

据该文所述,本版本的主要改进包括:

  • 增强了的派生类型:参数化派生类型,改进的可访问性控制,改进的结构构造子和终止器。
  • 支持面向对象编程类型扩展和继承多态,动态类型分配,以及类型绑定过程,提供对抽象数据类型的完全支持。
  • 改善了数据操纵:可分配的成员(结合了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月通过[28][29]。它只是一個小改版,略微更正了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语言的互操作性》[30],它于2012年5月被提交到ISO并获得批准。这个规定增加对C语言访问数组描述符的支持,并允许忽略实际参数的类型和秩。

Fortran 2018[编辑]

Fortran语言的最新修订(Fortran 2018)早先称为Fortran 2015[31],它是一个重大的修订并且发行于2018年11月28日[32]

Fortran 2018结合了两个此前出版的技术规范:

  • ISO/IEC TS 29113:2012《进一步的Fotran同C语言的互操作性》[33]
  • ISO/IEC TS 18508:2015《补充的Fortran并行特征》[34]

此外的变更和新特征包括支持:ISO/IEC/IEEE 60559:2011(在IEEE 754-2019的最新细小修订之前的IEEE浮点数标准)、十六进制输入/输出、IMPLICIT NONE增强和其他变更[35][36][37][38]

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语言具备了现代高级编程语言的一些特征。

代码例子[编辑]

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
    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特色示例[编辑]

下面的程序展示动态内存分配和基于数组的运算,这是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

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英语Intel Fortran Compiler英特尔公司开发的Fortran编译器。事实上,惠普购买了Compaq的Fortran编译器技术之后不久,便留下了用于Linux/UNIX系统的相关技术,而将Windows平台上的Fortran编译器相关权利全部转售给Intel。因此从CVF 6.6.C之后,Windows平台下的Visual Fortran编译器就改由Intel生产和销售了,(需要微软Visual Studio外壳的支持才能实现Visual IDE功能,Intel只提供命令行界面的编译器内核)。在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. ^ FORTRAN: The Pioneering Programming Language. IBM. 7 March 2012 [2017-07-19]. 
  2. ^ FORTRAN. Encyclopedia Britannica. 14 June 2021 [2021-07-19]. 
  3. ^ 3.0 3.1 John Backus. The history of FORTRAN I, II and III (PDF). Softwarepreservation.org. [19 November 2014]. (原始内容存档 (PDF)于2007-07-26). 
  4. ^ Eugene Loh. The Ideal HPC Programming Language. Queue. 18 June 2010, 8 (6). 
  5. ^ HPL – A Portable Implementation of the High-Performance Linpack Benchmark for Distributed-Memory Computers. [2015-02-21]. 
  6. ^ Q13. What are the benchmarks?. Overview - CPU 2017. SPEC. [2019-11-13]. 
  7. ^ Fifty Years of BASIC. Time. 29 April 2014. 
  8. ^ Szczepaniak, John. A basic history of BASIC on its 50th birthday. Gamasutra. 1 May 2014. 
  9. ^ 9.0 9.1 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]
  10. ^ 10.0 10.1 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)
  11. ^ Reference Manual, FORTRAN II for the IBM 704 Data Processing System (PDF). 1958. C28-6000-2. (原始内容存档 (PDF)于2005-10-30). 
  12. ^ Ibibilio.org. Ibiblio.org. [15 September 2014]. 
  13. ^ Haines, L. H. Serial compilation and the 1401 FORTRAN compiler. IBM Systems Journal. 1965, 4 (1): 73–80. doi:10.1147/sj.41.0073. 
  14. ^ Lee, John A. N. Anatomy of a Compiler. Van Nostrand Reinhold. 1967. 
  15. ^ Fortran Specifications and Operating Procedures, IBM 1401 (PDF). IBM. C24-1455-2. (原始内容存档 (PDF)于2017-09-23). 
  16. ^ 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). 
  17. ^ McCracken, Daniel D. Preface需要免费注册. A Guide to FORTRAN IV Programming. New York: Wiley. 1965: v. ISBN 978-0-471-58281-6. 
  18. ^ List of FORTRAN Implementations 1957 - 1967. IEEE Annals. 2017 [2017-10-17]. 
  19. ^ IBM System/360 Model 50 Functional Characteristics (PDF). IBM. 1967. A22-6898-1. (原始内容存档 (PDF)于2021-10-29). 
  20. ^ Digital Equipment Corp. DECSYSTEM-10 FORTRAN IV (F40) Programmers Reference Manual (PDF). Github. Digital Equipment Corporation. [15 April 2022]. 
  21. ^ Mil-std-1753. DoD Supplement to X3.9-1978. United States Government Printing Office. [13 December 2007]. (原始内容存档于9 November 2007). 
  22. ^ IEEE 1003.9-1992 - IEEE Standard for InformationTechnology - POSIX(R) FORTRAN 77 Language Interfaces - Part 1: Binding for System Application Program Interface (API). IEEE. [24 November 2018]. 
  23. ^ Appendix B.1
  24. ^ Fortran 95 Reference. Gnu.Org. [10 May 2014]. 
  25. ^ 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]. 
  26. ^ Fortran 2003– Last Working Draft. Gnu.Org. [10 May 2014]. 
  27. ^ 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). .
  28. ^ 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). 
  29. ^ Fortran 2008 – Last Working Draft (PDF). Gnu.Org. [10 May 2014]. (原始内容存档 (PDF)于2014-05-12). 
  30. ^ ISO/IEC TS 29113:2012 – Information technology – Further interoperability of Fortran with C. 
  31. ^ Doctor Fortran in "Eighteen is the new Fifteen". Software.intel.com. [20 November 2017]. 
  32. ^ Fortran 2018. ISO. [30 November 2018]. 
  33. ^ Further Interoperability of Fortran with C (PDF). ISO. [20 November 2017]. (原始内容存档 (PDF)于2017-12-01). 
  34. ^ Additional Parallel Features in Fortran. ISO. [20 November 2017]. 
  35. ^ The New Features of Fortran 2015. ISO. [23 June 2017]. 
  36. ^ Doctor Fortran in "One Door Closes". Software.intel.com. [21 September 2015]. 
  37. ^ Doctor Fortran Goes Dutch: Fortran 2015. Software.intel.com. [19 November 2014]. 
  38. ^ Fortran 2018 Interpretation Document (PDF). 9 October 2018. 

延伸阅读[编辑]

语言标准
有关标准
其他参考材料

外部链接[编辑]