Fortran(/ˈfɔːrtræn/;前身为FORTRAN,源自公式翻译[1])是一种通用编译命令式编程语言,特别适用于数值计算和科学计算。
FORTRAN最初是由IBM[2]在20世纪50年代为科学和工程应用程序而开发的,在早期就主导了编程领域,并在计算密集型领域(如数值天气预测、有限元分析、计算流体动力学、计算物理学、结晶学和计算化学)持续使用了60多年。它是高性能计算的流行语言[3] ,用于对世界上最快的超级计算机进行基准测试和排名的程序。[4]
Fortran包含一系列版本,每个版本都经过演化,在保持与以前版本兼容性的同时向语言添加扩展。后续版本增加了对结构化编程和基于字符的数据处理的支持(FORTRAN 77)、数组编程、模块化编程和通用编程(Fortran 90)、高性能Fortran (Fortran 95)、面向对象编程(Fortran 2003)和并发编程(Fortran 2008)。
Fortran的设计是许多其他编程语言的基础。其中最著名的是BASIC,它基于FORTRAN II 并进行了一系列语法清理,特别是更好的逻辑结构[5] 以及其他更改,使其更容易地在交互式环境中工作。[6]
FORTRAN 77的早期版本的语言名称通常都是用全大写字母拼写的(FORTRAN 77是最后一个在关键字中使用小写字母的版本,严格来说是非标准版本)。在引用以Fortran 90开头的新版本时,大写字母已被删除。官方语言标准现在将这种语言称为“Fortran”,而不是全大写的“FORTRAN”。
1953年末,约翰·W·巴克斯(John W. Backus)向他在IBM的上司提交了一份提案,为他们的IBM 704大型计算机开发一种更实用的汇编语言替代程序。[7] 巴克斯(Backus)著名的FORTRAN团队由程序员理查德·戈德堡(Richard Goldberg)、谢尔登·贝斯特(Sheldon F. Best)、哈兰·赫里克(Harlan Herrick)、彼得·谢里丹(Peter Sheridan)、罗伊·纳特(Roy Nutt)、罗伯特·纳尔逊(Robert Nelson)、欧文·齐勒(Irving Ziller)、露易丝·海比特(Lois Haibt)和大卫·塞尔(David Sayre)组成。[8] 它的概念包括将方程更容易地输入计算机,这个想法是由哈尔科姆·兰宁( J. Halcombe Laning)提出的,并在1952年的兰宁(Laning)和泽尔(Zierler)系统中得到证明。[9]
到1954年11月,IBM数学公式翻译系统的规范草案已经完成。[7] FORTRAN的第一本手册于1956年10月出版,[7] 第一个FORTRAN编译器于1957年4月交付。[7] 这是第一个优化编译器,因为客户不愿意使用高级编程语言,除非其编译器能够生成性能与手工编码汇编语言相当的代码。[10]
虽然社区对这种新方法是否可能优于手工编码表示怀疑,但它将操作机器所需的编程语句数量减少了20倍,并很快获得了认可。约翰·巴科斯(John Backus)在1979年接受IBM员工杂志Think的采访时说,“我的大部分工作都来自懒惰。我不喜欢编写程序,所以,当我在IBM 701上工作,编写计算导弹轨迹的程序时,我开始开发一个编程系统,以便更容易编写程序。”[11]
科学家们广泛采用这种语言来编写数字密集型程序,这鼓励编译器编写者产生能够生成更快、更高效代码的编译器。在语言中包含复数数据类型使得Fortran特别适用于电气工程等技术应用。
到1960年,FORTRAN的版本已经可用于IBM 709、650、1620和7090计算机。值得注意的是,FORTRAN语言的日益普及促使竞争对手的计算机制造商为他们的机器提供FORTRAN编译器,因此到1963年,已经有超过40个FORTRAN编译器存在。由于这些原因,FORTRAN被认为是第一种广泛使用的跨平台编程语言。
Fortran的发展与早期编译器技术的发展是同步的,编译器理论和设计方面的许多进步都是由为Fortran程序生成高效代码的需要特别推动的。
针对IBM 704的FORTRAN的初始版本包含32条语句,包括:
DIMENSION
和等价 EQUIVALENCE
语句IF
语句,根据算术语句的结果是负、零还是正,将控制传递给程序中的三个位置之一IF
语句(累加器溢出ACCUMULATOR OVERFLOW
, 商溢出QUOTIENT OVERFLOW
,和除法检查 DIVIDE CHECK
);以及用于操纵感应开关和感应灯的IF
语句GO TO
,经过计算的跳转转到,分配 ASSIGN
和带分配跳转DO
循环FORMAT
,读取 READ
,读取输入磁带 READ INPUT TAPE
,写入 WRITE
,写入输出磁带 WRITE OUTPUT TAPE
,打印 PRINT
,和打孔 PUNCH
READ TAPE
,读磁鼓 READ DRUM
,写磁带 WRITE TAPE
,和写磁鼓 WRITE DRUM
END FILE
,倒带 REWIND
,和退格 BACKSPACE
PAUSE
,停止 STOP
,和继续 CONTINUE
FREQUENCY
语句(用于向编译器提供优化提示)。算术 IF
语句让人想起(但不容易实现)704上可用的三路比较指令(CAS-比较累加器和存储器)。该声明提供了比较数字的唯一方法——通过测试它们的差异,并伴随溢出的风险。后来FORTRAN IV中引入的“逻辑”设施克服了这一缺陷。
FREQUENCY
语句最初(可选地)用于给出算术IF语句的三种分支情况的分支概率。第一个FORTRAN编译器使用这个权重在编译时对生成的代码进行蒙特卡罗(Monte Carlo)模拟,其结果被用来优化内存中基本块的放置——这是对其时间的一个非常复杂的优化。巴克斯(Backus)等人在关于这个原始实现的文章“FORTRAN自动编码系统”中记录了蒙特卡罗(Monte Carlo)技术:
程序的基本单位是基本块;基本块是一段程序,有一个入口点和一个出口点。第4节的目的是为第5节准备一个前置任务表(PRED表),该表列举了基本块和每个基本块的列表,每个基本块可以是它在流程中的直接前置任务,以及每个这样的基本块链路的绝对频率。该表是通过以蒙特卡罗方式运行程序一次获得的,在蒙特卡罗方式中,由IF类型语句产生的条件转移的结果和计算的GO TO由随机数发生器确定,该随机数发生器根据所提供的任何FREQUENCY(频率)语句适当加权。[8]
许多年后,这个 FREQUENCY
语句对代码没有影响,并被视为注释语句,因为编译器不再进行这种编译时模拟。类似的命运也降临在其他几种编程语言的编译器提示上;例如C的 register
(寄存器)关键词。
第一个FORTRAN编译器通过在发现错误时停止程序并在其控制台上输出错误代码来报告诊断信息。程序员可以在操作手册的错误信息表中查找该代码,为他们提供问题的简要描述。[12][13]
固定布局和穿孔卡
在开发磁盘文件、文本编辑器和终端之前,程序通常是通过键盘输入到80列穿孔卡片上,每张卡片一行。得到的一副卡片将被输入读卡器进行编译。穿孔卡片代码不包含小写字母或许多特殊字符,并且提供了能够正确打印FORTRAN中使用的重新指定的特殊字符的特殊版本的IBM 026击键。
借鉴穿孔卡片输入设计,Fortran程序最初是以固定列格式编写的,前72列被读入12个36位字。
第1列中的字母“C”导致整张卡片被视为注释,并被编译器忽略。否则,卡的列被分成四个字段:
因此,列73至80可用于识别信息,例如打孔序列号或文本,如果一叠卡片掉落,可用于重新排序卡片;尽管实际上这是为稳定的生产项目保留的。IBM 519可以用来复制程序库和添加序列号。一些早期的编译器,如IBM 650,由于读卡器的限制,有额外的限制。[15] 按键可以被编程为跳转到第7列,并在第72列之后跳出来。后来编译器放宽了大多数固定格式的限制,在Fortran 90标准中取消了这一要求。
在语句字段中,文本文字外的空白字符(空白)被忽略。为了简洁起见,这允许省略标记之间的空格,或者为了清晰起见,允许在标识符中包含空格。例如, AVG OF X
是一个有效的标识符,相当于 AVGOFX
,而 101010DO101I=1,101
是一个有效的语句,相当于10101 DO 101 I = 1, 101
因为第6列中的零被视为空格(!),而 101010DO101I=1.101
则改为 10101 DO101I = 1.101
,将1.101赋值给一个名为 DO101I
的变量。请注意逗号和句点之间的细微视觉差异。
霍尔瑞斯(Hollerith)字符串最初只允许在FORMAT和DATA语句中使用,前缀是字符计数和字母H(例如,26这是字母数字数据),允许空格保留在字符串中。计算错误是个问题。
IBM的FORTRAN出现于1958年。主要的增强功能是通过允许用户编写的子程序和返回值的函数来支持过程编程,参数通过引用传递。COMMONAL语句为子程序提供了一种访问公共(或全局)变量的方法。介绍了六项新的声明:[16]
SUBROUTINE
, 函数FUNCTION
,和结束 END
CALL
并gni返回 RETURN
COMMON
在接下来的几年里,FORTRAN II还将增加对双精度和复杂数据类型的支持。
早期FORTRAN编译器不支持子程序递归。早期的计算机体系结构不支持堆栈的概念,并且当它们确实直接支持子程序调用时,返回位置通常存储在子程序代码(例如,IBM 1130)或特定机器寄存器(IBM 360等)附近的一个固定位置,这仅在堆栈由软件维护并且返回地址在调用之前存储在堆栈上并且在调用返回之后恢复时才允许递归。尽管FORTRAN 77中没有指定,但许多F77编译器支持递归作为选项,而内置递归的Burroughs大型机默认情况下支持递归。它通过新的关键字RECURSIVE成为Fortran 90的标准。[17]
简单FORTRAN II 程序
这个程序根据赫伦(Heron)公式,读取包含三个5位整数作为输入的磁带盘上的数据。没有可用的“类型”声明:名称以“1”、“J”、“K”、“L”、“M”或“N”开头的变量是“定点”(即整数),否则是浮点型的。由于在本例中要处理整数,变量的名称以字母“1”开头。变量的名称必须以字母开头,并且可以以字母和数字继续,FORTRAN II中最多6个字符。如果甲、乙、丙不能代表平面几何中三角形的边,那么程序的执行将以错误代码“停止1”结束。否则,将打印一条输出线,显示A、B和C的输入值,然后是三角形的计算面积,作为一个浮点数,沿输出线占据10个空格,并在小数点后显示2位数字,即带有标签601的FORMAT语句F10.2中的. 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还在1958年开发了FORTRAN III,它允许内嵌汇编代码和其他特性;然而,这个版本从未作为产品发布。像704 FORTRAN和FORTRAN II一样,FORTRAN III包含了与机器相关的特性,使得在其中编写的代码无法从一台机器移植到另一台机器。[7] 其他供应商提供的FORTRAN早期版本也有同样的缺点。
FORTRAN是由一个创新的63阶段编译器为IBM 1401计算机提供的,它完全运行在只有8000(6位)字符的核心内存中。编译器可以从磁带上运行,也可以从2200 card-desk上运行;正如海恩斯(Haines)所描述的那样[18],它不再使用磁带或磁盘存储。它将程序保存在内存中,并加载覆盖层,逐渐将程序转化为可执行的形式。这篇文章在《编译器剖析》[19]的两个版本和IBM手册《Fortran规范和操作程序,IBM 1401》中都有转载和编辑。[20]可执行形式不完全是机器语言;相反,浮点运算、子脚本、输入/输出和函数引用被解释,比UCSD帕斯卡P代码早了二十年。
IBM后来为1400系列计算机提供了FORTRAN编译器。[21]
从1961年开始,由于客户的需求,IBM开始开发FORTRAN IV,去掉FORTRAN II的机器相关特性(如读输入带),同时增加了逻辑数据类型、逻辑布尔表达式和逻辑IF语句等新特性,作为算术IF语句的替代。FORTRAN最终于1962年发布,先是用于IBM 7030(“Stretch “)计算机,随后是用于IBM 7090、7094的版本,后来是用于1966年的IBM 1401。
到1965年,FORTRAN IV被认为应该符合美国标准协会X3.4.3 FORTRAN工作组正在开发的标准。[22]
1966年至1968年间,IBM为其System/360提供了几个FORTRAN IV编译器,每个编译器都以字母命名,表示编译器需要运行的最小内存量。[23]字母(F、G、H)与系统/360型号的代码相匹配,以指示内存大小,每个字母增量是两个更大的因子:[24]
大约在这个时候,FORTRAN IV已经开始成为一个重要的教育工具,滑铁卢大学的WATFOR和WATFIV就是为了简化早期编译器复杂的编译和链接过程而创建的。
FORTRAN早期历史上最重要的发展也许是美国标准协会(现在的美国国家标准协会(ANSI))决定成立一个由商业设备制造商协会BEMA赞助的委员会,以开发美国标准Fortran。由此产生的两种标准于1966年3月获得批准,定义了两种语言,FORTRAN(基于FORTRAN IV,这是一种事实上的标准)和Basic FORTRAN(基于FORTRAN II,但去掉了它与机器相关的特性)。由第一个标准定义的FORTRAN,正式命名为X3.9-1966,被称为FORTRAN 66(尽管许多人继续称之为FORTRANⅳ,这是该标准主要基于的语言)。FORTRAN 66实际上成为FORTRAN的第一个行业标准版本。FORTRAN 66包括:
FORTRAN 66标准发布后,编译器供应商引入了对标准FORTRAN的几个扩展,促使ANSI委员会X3J3在1969年开始在计算机商业设备制造商协会(前BEMA)CBEMA的赞助下修订1966标准。该修订标准的最终草案于1977年分发,导致1978年4月正式批准新的FORTRAN标准。名为FORTRAN 77的新标准正式命名为X3.9-1978,它增加了许多重要特性来解决FORTRAN 66的许多缺点:
在本标准修订版中,许多功能被删除或改变,这可能使以前符合标准的程序失效。(移除是当时X3J3唯一允许的替代方案,因为ANSI标准还没有“折旧(deprecation)”的概念。)虽然冲突列表中的24个项目(见X3.9-1978附录A2)中的大部分解决了先前标准允许但很少使用的漏洞或有问题的情况,但少数特定功能被故意删除,例如:
DIMENSION A(10,5)
Y= A(11,1)
变体:明尼苏达(Minnesota )FORTRAN
控制数据公司Control Data Corporation的计算机有另一个版本的FORTRAN 77,叫做明尼苏达(Minnesota )FORTRAN (MNF),专门为学生使用而设计,具有不同的输出结构、code和Data语句的特殊用途、编译的优化代码级别、详细的错误列表、大量的警告消息和调试。[25]
随着标准化过程难以跟上计算和编程实践的快速变化,FORTRAN 77修订标准的开发将一再推迟。同时,作为近十五年来的“标准FORTRAN”,FORTRAN 77将成为历史上最重要的语言。
FORTRAN 77的一个重要的实际扩展是1978年MIL-STD-1753的发布。[26] 该规范由美国国防部开发,标准化了大多数FORTRAN 77编译器实现的一些功能,但不包括在ANSI FORTRAN 77标准中。这些特性最终将被纳入Fortran 90标准。
1991年发布的IEEE 1003.9 POSIX标准为FORTRAN 77程序员发布POSEX系统调用提供了一种简单的方法。[27] 文档中定义了超过100个调用,允许以可移植的方式访问POSIX兼容的过程控制、信号处理、文件系统控制、设备控制、过程指向和流输入/输出。
FORTRAN 77的后继者,非正式地称为Fortran 90(在此之前,Fortran 8X),最终在1991年作为国际标准化组织/国际电工委员会标准1539:1991发布,并在1992年作为美国国家标准协会标准发布。除了将FORTRAN的正式拼写改为Fortran之外,这一重大修订还增加了许多新功能,以反映自1978年标准以来编程实践的重大变化:
过时和删除
与之前的版本不同,Fortran 90没有删除任何功能。(附录B.1称,“本标准中删除的特征列表为空。”)任何符合标准的FORTRAN 77程序在Fortran 90下也是符合标准的,任何一个标准都应该可以用来定义它的行为。
一小部分功能被确定为“过时”,并有望在未来的标准中删除。这些早期版本特性的所有功能都由新的Fortran 95特性执行。保留一些是为了简化旧程序的移植,但最终可能会被删除。
过时的特征 | 例子 | Fortran 95中的状态/命运 |
---|---|---|
算术IF语句 |
|
反对 |
非整数DO参数或控制变量 |
|
删除 |
共享DO环路终端或 用声明终止 结束操作或继续操作除外 |
|
反对 |
从代码块之外的分支到结束IF |
|
删除 |
交错返回 |
|
反对 |
暂停语句 |
|
删除 |
赋值语句 并分配到“转到”语句 |
|
删除 |
分配的语句编号和FORMAT说明符 |
|
删除 |
编辑描述符 |
|
删除 |
计算GO TO语句 |
|
(过时) |
语句函数 |
|
(过时) |
在可执行语句中的数据语句 |
|
(过时) |
字符*字符声明的形式 |
|
(过时) |
假设字符长度函数 |
|
(过时)[28] |
固定形式源代码 | Column 1 contains C or * or ! for comments. Columns 1 through 5 for statement numbers Any character in column 6 for continuation. Columns 73 and up ignored |
(过时) |
“你好世界”的例子
program helloworld
print *, "Hello world!"
end program helloworld
作为国际标准化组织/国际电工委员会(ISO/IEC)1539-1:1997正式出版的Fortran 95是一个小版本,主要是为了解决Fortran 90标准中的一些悬而未决的问题。然而,Fortran 95也增加了许多扩展,特别是来自高性能Fortran规范的扩展:
Fortran 90中提到的几个“过时”的特性已从Fortran 95中删除:
对Fortran 95的一个重要补充是国际标准化组织(ISO)的技术报告TR-15581:增强型数据类型设施,非正式地称为Allocatable TR。在完全兼容Fortran 2003的Fortran编译器可用之前,该规范定义了可分配数组的增强使用。这种用途包括可分配数组作为派生类型组件、过程伪参数列表和函数返回值。(ALLOCABLE数组优于基于指针的数组,因为Fortran 95保证当ALLOCABLE数组超出范围时会自动解除分配,从而消除内存泄漏的可能性。此外,可分配数组的元素是连续的,别名对于数组引用的优化来说不是问题,这使得编译器生成代码的速度比基于指针的快。[29])
Fortran 95的另一个重要补充是国际标准化组织的技术报告TR-15580:浮点异常处理,非正式地称为IEEE TR。该规范定义了对IEEE浮点算法和浮点异常处理的支持。
条件编译和变长字符串
除了强制性的“基础语言”(在国际标准化组织/国际电工委员会1539-1 : 1997中定义)之外,Fortran 95语言还包括两个可选模块:
这些标准共同构成了多部分国际标准 (ISO/IEC 1539)。
根据标准开发人员的说法,“可选部分描述了大量用户和/或实现者所要求的独立功能,但这些功能被认为不够通用,不足以满足所有符合标准的Fortran编译器的要求。”然而,如果符合标准的Fortran确实提供了这样的选项,那么它们“必须按照标准适当部分中对这些设施的描述来提供”。
Fortran 2003正式发布为国际标准化组织/国际电工委员会(ISO/IEC)1539-1:2004,是引入许多新功能的主要修订版。Fortran 2003新特性的综合摘要可在Fortran工作组(ISO/IEC JTC1/SC22/WG5)的官方网站上查阅。[30]
从那篇文章中,该版本的主要增强功能包括:
对FORTRAN 2003的一个重要补充是国际标准化组织(ISO)的技术报告TR-19767:FORTRAN的增强模块设施。该报告提供了子模块,这使得Fortran模块更类似于Modula-2模块。它们类似于Ada的私有子单元。这允许模块的规范和实现以单独的程序单元表示,这改善了大型库的打包,允许在发布最终接口时保护商业秘密,并防止编译级联。
国际标准化组织/国际电工委员会(ISO/IEC)1539-1:2010,非正式称为Fortran 2008,于2010年9月获得批准。[31][32]与Fortran 95一样,这是一个小的升级,包括对Fortran 2003的澄清和更正,以及引入一些精选的新功能。新功能包括:
FORTRAN2008的一个重要补充是2012年5月提交给国际标准化组织批准的国际标准化组织关于FORTRAN与C的进一步互操作性的技术规范29113。[34][35]该规范增加了对从C访问数组描述符的支持,并允许忽略参数的类型和等级。
该语言的最新版本(Fortran 2018)之前被称为Fortran 2015。[36]这是一个重大修订,于2018年11月28日发布。[37]
Fortran 2018包含两个先前发布的技术规范:
其他变化和新功能包括支持国际标准化组织/国际电工委员会/IEEE 60559:2011(截至2019年的最新版本的IEEE浮点标准)、十六进制输入/输出、隐式无增强和其他变化[40][41][42][43]
尽管BASIC的作者在1968年的一篇期刊文章中已经将FORTRAN描述为“老式的”[44],Fortran现在已经使用了几十年,并且在科学和工程界有大量的Fortran软件在日常使用中。[45]Jay Pasachoff在1984年写道,“物理和天文学学生只需学习FORTRAN。FORTRAN中存在如此之多的东西,以至于科学家们似乎不太可能转向帕斯卡(Pascal)、Modula-2或其他任何东西。”[46]1993年,塞西尔·利斯称FORTRAN为“科学计算的母语”,并补充说,用任何其他可能的语言来代替FORTRAN“可能仍然是一个渺茫的希望”。[47]
它是一些最密集的超级计算任务的主要语言,如天文学、气候建模、计算化学、计算经济学、计算流体动力学、计算物理、数据分析、水文建模、数值线性代数和数值库(LAPACK、IMSL和NAG)、优化、卫星模拟、结构工程和天气预测。许多用来衡量新计算机处理器性能的浮点基准,如规格CPU2006基准的浮点组件CFP2006,都是用Fortran编写的。
除此之外,计算科学中更现代的代码通常使用大型程序库,例如用于图形划分的METIS、用于线性代数能力的PETSc或Trilinos、用于网格和有限元支持的DUNE或FEniCS以及其他通用库。自20世纪90年代末以来,几乎所有最广泛使用的支持库都是用C编写的,更常见的是用C++编写的。另一方面,高级语言如Matlab、Python或R在计算科学的特定领域越来越流行。因此,越来越多的科学项目也是用这些语言编写的。由于这个原因,2003年FORTRAN增加了与C互操作的设施,并通过国际标准化组织/国际电工委员会技术规范29113予以加强,该规范将纳入2018年FORTRAN。编程语言受欢迎程度的这种转变也明显体现在特殊处理器2000和特殊处理器2006浮点基准之间的应用程序选择上。
美国宇航局探测器旅行者1号和旅行者2号的软件最初是用FORTRAN 5编写的,后来移植到FORTRAN 77上。截至2013年9月25日,一些软件仍然是用Fortran编写的,一些已经移植到了c。[48]
Fortran 95语言特性中讨论了Fortran 95的精确特性和语法。
可移植性在早期是一个问题,因为没有一致的标准——甚至没有国际商用机器公司的参考手册——计算机公司竞相通过提供不兼容的特性来区分他们的产品和其他产品。标准提高了移植性。1966年的标准提供了参考语法和语义,但是供应商继续提供不兼容的扩展。尽管细心的程序员开始意识到使用不兼容的扩展会导致昂贵的可移植性问题,因此使用了诸如PFORT验证器之类的程序,[49][50]但是直到1977年的标准之后,当国家标准局(现在的NIST)发布FIPS PUB 69时,美国政府购买的处理器才被要求诊断标准的扩展。不是提供两个处理器,实际上每个编译器最终至少有一个诊断扩展的选项。[51][52]
不兼容的扩展不是唯一的可移植性问题。对于数值计算,重要的是要考虑到算法的特点。福克斯等人在PORT图书馆1966年标准的背景下解决了这个问题。[49]其中的思想被广泛使用,并最终通过固有的查询功能被纳入1990年的标准。二进制浮点运算广泛(现在几乎是普遍)采用了IEEE 754标准,基本上消除了这个问题。
在2003年标准解决之前,对计算环境(例如,程序的命令行、环境变量、错误条件的文本解释)的访问一直是个问题。
大量可以被描述为与工程和科学计算松散相关的库软件(如图形库)都是用C语言编写的,因此对它们的访问存在可移植性问题。这已经通过将互操作性集成到2003标准中得到解决。
现在用Fortran编写一个完全可移植的程序是可能的(而且相对容易),即使不需要借助预处理器。
Fortran 5在20世纪70年代末和80年代初由数据通用公司销售,用于Nova、Eclipse和MV系列计算机。它有一个优化编译器,对当时的小型计算机非常有用。这种语言最像FORTRAN 66。这个名字是早期FORTRAN IV的双关语。
FORTRANV于1968年由控制数据公司(Control Data Corporation)为CDC 6600系列发行。该语言基于FORTRAN IV。[53]
Univac还为1100系列提供了一个编译器,名为FORTRAN V。Univac Fortran V的一个派生版本是雅典娜FORTRAN。
Fortran 6 或可视Fortran 2001被微软授权给康柏(Compaq)。他们许可了康柏可视化Fortran,并为康柏v6到v6.1提供了Visual Studio 5环境界面。[54]
高性能科学计算机的供应商(如巴勒斯、控制数据公司、克雷、霍尼韦尔、IBM、德克萨斯仪器公司和UNIVAC)增加了对Fortran的扩展,以利用特殊的硬件特性,如指令高速缓存、中央处理器流水线和矢量阵列。例如,一个IBM的FORTRAN编译器(扩展IUP)有一个优化级别,它重新排序机器代码指令,使多个内部算术单元同时忙碌。另一个例子是计算流体动力学,一种专为ILLIAC IV型超级计算机设计的FORTRAN的特殊变体,运行在美国宇航局艾姆斯研究中心。IBM研究实验室还开发了一种基于FORTRAN的扩展语言,称为VECTRAN,用于处理向量和矩阵。
面向对象的Fortran是Fortran的面向对象扩展,其中数据项可以被分组到对象中,这些对象可以被实例化并且并行执行。它适用于Sun、Iris、iPSC和nCUBE,但不再受支持。
这种特定于机器的扩展要么随着时间的推移而消失,要么已经将元素纳入了主要标准。剩下的主要扩展是OpenMP,它是共享内存编程的跨平台扩展。一个新的扩展,Coarray Fortran,旨在支持并行编程。
对于IBM 650的运输
FOR TRANSIT是IBM 704 FORTRAN语言的简化版本的名称,它是使用卡内基在20世纪50年代后期开发的翻译程序为IBM 650实现的。[55]以下注释出现在《国际商用机器公司参考手册》(适用于国际商用机器公司的运输自动编码系统C28-4038,版权所有1957,1959)中:
FORTRAN系统是为比650更复杂的机器设计的,因此FORTRAN程序员参考手册中的32条语句中有一些是FOR TRANSIT系统不能接受的。此外,FORTRAN语言还增加了某些限制。然而,这些限制都不会使为FOR TRANSIT 编写的源程序与704的FORTRAN系统不兼容。
允许的声明是:
a = b
GO to n
GO TO (n1, n2, ..., nm), i
IF (a) n1, n2, n3
PAUSE
STOP
DO n i = m1, m2
CONTINUE
END
READ n, list
PUNCH n, list
DIMENSION V, V, V, ...
EQUIVALENCE (a,b,c), (d,c), ...
一个程序最多可以使用十个子例程。
对于TRANSIT语句,只限于第7至56列。穿孔卡用于IBM 650的输入和输出。将源代码翻译成“信息技术”语言,然后将信息技术语句编译成SOAP汇编语言,最后生成目标程序,然后将目标程序加载到机器中运行程序(使用穿孔卡进行数据输入,并将结果输出到穿孔卡上)。
650s有两个版本,带有一个2000字的内存鼓:TRANSIT I(S)和TRANSIT II(S),后者用于配有索引寄存器和自动浮点十进制(双五进制)算法的机器。手册附录一包括了IBM 533读卡器/打孔控制面板的接线图。
在FORTRAN 77之前,许多预处理程序通常被用来提供一种更友好的语言,其优点是预处理代码可以用标准FORTRAN编译器在任何机器上编译。这些预处理程序通常支持结构化编程、超过六个字符的变量名、附加数据类型、条件编译,甚至宏功能。受欢迎的预处理程序包括FLECS、iftran、MORTRAN、SFtran、S-Fortran、Ratfor和Ratfiv。例如,拉特福(Ratfor)和拉特费(Ratfiv)实现了一种类似于C语言的语言,在标准FORTRAN 66中输出预处理代码。尽管Fortran语言取得了进步,但预处理程序仍然被用于条件编译和宏替换。
FORTRAN最早的版本之一是在60年代推出的,且在大学里广泛使用。沃特福特由滑铁卢(Waterloo)大学开发、支持和发行,主要基于FORTRAN IV型。使用WATFOR的学生可以提交他们的批处理FORTRAN作业,如果没有语法错误,程序将直接执行。这种简化使学生能够专注于程序的语法和语义,或执行逻辑流程,而不是处理提交作业控制语言(JCL)、编译/链接-编辑/执行连续过程,或大型/小型计算机环境的其他复杂性。这种简化环境的缺点是,对于需要扩展主处理器能力的程序员来说,WATAF不是一个很好的选择,例如WATAF通常对输入/输出设备的访问非常有限。WATFOR被WATFIV及其后来的版本所取代。
program; s=0 i=1,n; s=s+1; stop i; s='s' Stop
(线路编程)
LRLTRAN是劳伦斯(Lawrence)辐射实验室开发的,用于支持矢量运算和动态存储,以及支持系统编程的其他扩展。发行版包括LTSS操作系统。
Fortran-95标准包括一个可选的第3部分,它定义了一个可选的条件编译能力。这种能力通常被称为“CoCo”。
许多Fortran编译器已经将预处理器的子集集成到了它们的系统中。
SIMSCRIPT是一个专用的Fortran预处理器,用于建模和模拟大型离散系统。
F编程语言被设计成Fortran 95的一个干净子集,它试图删除Fortran的冗余、非结构化和不推荐使用的特性,例如等价语句。F保留了Fortran 90中添加的数组特性,并删除了FORTRAN 77和Fortran 90中添加的结构化编程结构所废弃的控制语句。F被它的创建者描述为“一种编译的、结构化的数组编程语言,特别适合教育和科学计算”。[56]
拉希(Lahey)和富士通(Fujistu)合作为微软创建了福特兰针对.NET框架。[57]Silverfrost FTN95也能够创建.NET代码。[58]
下面的程序说明了动态内存分配和基于数组的操作,这是Fortran 90引入的两个特性。特别值得注意的是,在操作数组时没有DO循环和IF/THEN语句;数学运算应用于整个阵列。同样明显的是使用了符合当代编程风格的描述性变量名和通用代码格式。本示例计算交互式输入数据的平均值。
program average
! Read in some numbers and take the average
! As written, if there are no data points, an average of zero is returned
! While this may not be desired behavior, it keeps this example simple
implicit none
real, dimension(:), allocatable :: points
integer :: number_of_points
real :: average_points=0., positive_average=0., negative_average=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
! Take the average by summing points and dividing by number_of_points
if (number_of_points > 0) average_points = sum(points) / number_of_points
! Now form average over positive and negative points only
if (count(points > 0.) > 0) then
positive_average = sum(points, points > 0.) / count(points > 0.)
end if
if (count(points < 0.) > 0) then
negative_average = sum(points, points < 0.) / count(points < 0.)
end if
deallocate (points)
! Print result to terminal
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
end program average
在选择“FORTRAN 77”名称的FORTRAN标准委员会会议上,一项讽刺性的技术提案被纳入官方发行版,标题为“被认为有害的字母 O”。这个提议旨在通过从允许的变量名中删除字母来解决字母“O”和数字0之间有时出现的混淆。然而,所提出的方法是从字符集中完全删除字母(从而保留48个作为词汇字符,而冒号已经增加到49个)。这被认为是有益的,因为它将促进结构化编程,使之不可能像以前那样使用臭名昭著的GO TO语句。(麻烦的FORMAT语句也将被删除。)有人指出,这“可能会使一些现有的程序无效”,但大多数程序“无论如何都可能不符合要求”。[59][60]
当添加假定长度数组时,对于区分上限和下限的合适字符存在争议。沃尔特·布雷纳德(Walt Brainerd)博士在评论这些论点时写了一篇题为“天文学与胃肠病学”的文章,因为一些支持者建议使用星号(“*”),而另一些支持者则倾向于冒号(“:”)。
在FORTRAN 77(和大多数早期版本)中,以字母I-N开头的变量名具有默认的整数类型,而以任何其他字母开头的变量默认为实数,尽管程序员可以用显式声明覆盖默认值[61]。这导致了一个笑话:“在Fortran中,上帝是真实的(除非声明为整数)。”
^"FORTRAN". American Heritage Dictionary of the English Language (5 ed.). The Free Dictionary. 2011. Retrieved 2016-02-08..
^John Backus. "The history of FORTRAN I, II and III" (PDF). Softwarepreservation.org. Retrieved 19 November 2014..
^Eugene Loh (18 June 2010). "The Ideal HPC Programming Language". Queue. 8 (6)..
^"HPL – A Portable Implementation of the High-Performance Linpack Benchmark for Distributed-Memory Computers". Retrieved 2015-02-21..
^"Fifty Years of BASIC". Time. 29 April 2014..
^Szczepaniak, John (1 May 2014). "A basic history of BASIC on its 50th birthday". Gamasutra..
^John Backus (October–December 1998). "The History of Fortran I, II, and III". IEEE Annals of the History of Computing. 20 (4): 68–78. doi:10.1109/85.728232.CS1 maint: Date format (link).
^J. W. Backus; R. J. Beeber; S. Best; R. Goldberg; L. M. Haibt; H. L. Herrick; R. A. Nelson; D. Sayre; P. B. Sheridan; H. Stern; L. Ziller; R. A. Hughes; R. Nutt (February 1957). The FORTRAN Automatic Coding System (PDF). Western Joint Computer Conference. pp. 188–198. doi:10.1145/1455567.1455599..
^Mindell, David, Digital Apollo, MIT Press, Cambridge MA, 2008, p.99.
^The Fortran I Compiler "The Fortran I compiler was the first major project in code optimization. It tackled problems of crucial importance whose general solution was an important research focus in compiler technology for several decades. Many classical techniques for compiler analysis and optimization can trace their origins and inspiration to the Fortran I compiler.".
^Brian Bergstein (May 20, 2007). "Fortran creator John Backus dies". MSNBC. Retrieved 29 October 2018..
^Applied Science Division and Programming Research Department, International Business Machines Corporation (October 15, 1956). The FORTRAN Automatic Coding System for the IBM 704 EDPM : Programmer's Reference Manual (PDF). pp. 19–20..
^Programming Research Department, International Business Machines Corporation (April 8, 1957). The FORTRAN Automatic Coding System for the IBM 704 EDPM : Preliminary Operator's Manual (PDF). pp. 6–37..
^Reference Manual, IBM 7090 Data Processing System, 1961, IBM A22-6528-3..
^"Fortran II User Manual" (PDF). Bitsavers.org. Retrieved 19 November 2014..
^Reference Manual, FORTRAN II for the IBM 704 Data Processing System (PDF). 1958. C28-6000-2..
^"Ibibilio.org". Ibiblio.org. Retrieved 15 September 2014..
^Haines, L. H. (1965). "Serial compilation and the 1401 FORTRAN compiler". IBM Systems Journal. 4 (1): 73–80. doi:10.1147/sj.41.0073..
^Lee, John A. N. (1967). Anatomy of a Compiler. Van Nostrand Reinhold..
^Fortran Specifications and Operating Procedures, IBM 1401 (PDF). IBM. C24-1455-2..
^Fortran IV Language Specifications, Program Specifications, and Operating Procedures, IBM 1401, 1440, and 1460 (PDF). IBM. April 1966. C24-3322-2..
^McCracken, Daniel D. (1965). "Preface". A Guide to FORTRAN IV Programming. New York: Wiley. p. v. ISBN 978-0-471-58281-6..
^"List of FORTRAN Implementations 1957 - 1967". IEEE Annals. 2017. Retrieved 2017-10-17..
^IBM System/360 Model 50 Functional Characteristics (PDF). IBM. 1967. A22-6898-1..
^"FORTRAN Compilers and Loaders". Chilton-programming.org.uk. Retrieved 19 November 2014..
^Mil-std-1753. DoD Supplement to X3.9-1978. United States Government Printing Office..
^IEEE 1003.9-1992 - IEEE Standard for InformationTechnology - POSIX(R) FORTRAN 77 Language Interfaces - Part 1: Binding for System Application Program Interface (API). IEEE. Retrieved 24 November 2018..
^"Declaration Statements for Character Types". Compaq Fortran Language Reference Manual. Texas, Huston, US: Compaq Computer Corporation. 1999. Retrieved 17 September 2018. The form CHARACTER*(*) is an obsolescent feature in Fortran 95..
^"Fortran 95 Reference". Gnu.Org. Retrieved 10 May 2014..
^Fortran Working Group (WG5). It may also be downloaded as a PDF file, FTP.nag.co.uk.
^"N1836, Summary of Voting/Table of Replies on ISO/IEC FDIS 1539-1, Information technology – Programming languages – Fortran – Part 1: Base language" (PDF)..
^"Fortran 2008 – Last Working Draft" (PDF). Gnu.Org. Retrieved 10 May 2014..
^N1830, Information technology – Programming languages – Fortran – Part 1: Base language [1][失效连结].
^ISO page to ISO/IEC DTS 29113, Further Interoperability of Fortran with C.
^"Draft of the Technical Specification (TS) 29113" (PDF). wg5-fortran.org..
^"Doctor Fortran in "Eighteen is the new Fifteen"". Software.intel.com. Retrieved 20 November 2017..
^"Fortran 2018". ISO. Retrieved 30 November 2018..
^"Further Interoperability with C" (PDF). ISO. Retrieved 20 November 2017..
^"Additional Parallel Features in Fortran". ISO. Retrieved 20 November 2017..
^"The New Features of Fortran 2015". ISO. Retrieved 23 June 2017..
^"Doctor Fortran in "One Door Closes"". Software.intel.com. Retrieved 21 September 2015..
^"Doctor Fortran Goes Dutch: Fortran 2015". Software.intel.com. Retrieved 19 November 2014..
^Fortran 2018 Interpretation Document, 9 October 2018.
^Kemeny, John G.; Kurtz, Thomas E. (11 October 1968). "Dartmouth Time-Sharing". Science. 162 (3850): 223–228. doi:10.1126/science.162.3850.223..
^Phillips, Lee. "Scientific computing's future: Can any coding language top a 1950s behemoth?". Ars Technica. Retrieved 8 May 2014..
^Pasachoff, Jay M. (April 1984). "Scientists: FORTRAN vs. Modula-2". BYTE (letter). p. 404. Retrieved 6 February 2015..
^Galperin, Boris (1993). "26". Large Eddy Simulation of Complex Engineering and Geophysical Flows. London: Cambridgey. p. 573. ISBN 978-0-521-43009-8..
^"Interstellar 8-Track: How Voyager's Vintage Tech Keeps Running". WIRED. Retrieved 2017-12-23..
^P. A. Fox (1977). "Port — A portable mathematical subroutine library". A portable mathematical subroutine library. Lecture Notes in Computer Science. 57. pp. 165–177. doi:10.1007/3-540-08446-0_42. ISBN 978-3-540-08446-4. PORT ... written in (PFORT) .. ANS Fortran.
^"Methods to ensure the standardization of FORTRAN software". OSTI 5361454. PFORT ... Library ....
^D. E. Whitten (1975). "A machine and configuration independent Fortran: Portable Fortran". IEEE.org..
^"Portability Issues". .. discusses .. portability of .. Fortran.
^Healy, MJR (1968). "Towards FORTRAN VI". Advanced scientific Fortran by CDC. CDC. pp. 169–172. Archived from the original on 5 July 2009. Retrieved 10 April 2009..
^"third party release notes for Fortran v6.1". Cs-software.com. 15 March 2011. Retrieved 19 November 2014..
^"Internal Translator (IT) A Compiler for the IBM 650", by A. J. Perlis, J. W. Smith, and H. R. Van Zoeren, Computation Center, Carnegie Institute of Technology.
^"F Programming Language Homepage". Fortran.com. Retrieved 19 November 2014..
^"Fortran for .NET Language System". Archived from the original on 18 October 2014..
^"FTN95: Fortran 95 for Windows". Silverfrost.com. Retrieved 19 November 2014..
^X3J3 post-meeting distribution for meeting held at Brookhaven National Laboratory in November 1976.[来源可靠?].
^"The obliteration of O", Computer Weekly, 3 March 1977..
^"Rules for Data Typing (FORTRAN 77 Language Reference)". docs.oracle.com. Retrieved 2016-09-29..
暂无