Fortran
范例 | 多范式:结构化,命令(程序性,面向对象),通用,数组 |
---|---|
设计 | 约翰·贝克斯(John Backus) |
开发人员 | John Backus和IBM |
首先出现 | 1957 |
稳定版本 | Fortran 2018(ISO / IEC 1539-1:2018) / 2018年11月28日 |
打字学科 | 强,静态,明显 |
文件名扩展 |
.f90 ,.f ,.for
|
网站 | fortran-lang.org |
主要实施 | |
Absoft , Cray , Gfortran , G95 , IBM XL Fortran, Intel , Hitachi ,Lahey/Fujitsu,数值算法组, Open Watcom , Pathscale , PGI ,Silverfrost, Silverfrost , Oracle Solaris Studio ,其他 | |
被影响 | |
快速编码 | |
受影响 | |
Algol 58 , Basic , C , Chapel , CMS-2 , Dope , Fortress , PL/I , Pact I , Mumps , IDL , Ratfor |
fortran ( ;以前是Fortran )是一种通用的,编译的命令式编程语言,特别适合数字计算和科学计算。
Fortran最初是由IBM在1950年代开发的,用于科学和工程应用,随后开始主导科学计算。它已经在计算密集型区域(例如数值天气预测,有限元分析,计算流体动力学,地球物理学,计算物理学,晶体学和计算化学等)中使用了七十年。它是一种用于高性能计算的流行语言,用于基准和对世界上最快的超级计算机进行基准测试的程序。
Fortran的设计是许多其他编程语言,尤其是Basic和Algol的基础。但是Fortran本身通过多种版本和方言发展,增加了扩展,同时在很大程度上保留了与先前版本的兼容性。连续版本为基于字符的数据(FORTRAN 77),数组编程,模块化编程和通用编程(Fortran 90),高性能FORTRAN(FORTRAN 95),面向对象的编程(Fortran 2003),2003年(Fortran 2003),高性能(Fortran 2003),阵列编程和通用编程(FORTRAN 90)(FORTRAN 90),增加了对结构化编程和处理的支持。并发编程(Fortran 2008)和本机并行计算功能(CoArray Fortran 2008/2018 )。
自2021年8月以来,Fortran在Tiobe索引中排名前15种语言,这是对编程语言的普及。
命名
Fortran的第一本手册将其描述为公式翻译系统,并用小帽子打印了名称,Fortran 。其他消息来源建议该名称代表公式翻译器或公式翻译。早期的IBM计算机不支持较低的案例字母,并且通常在全图中拼写语言的语言版本的名称(Fortran 77是Fortran字符集仅包含大写字母的最后一个版本)。自Fortran 90以来,Fortran的官方语言标准称该语言为“ Fortran”。
起源
1953年底,约翰·W·Backus(John W. Backus)向IBM的上级提交了一项提案,以开发一种更实用的替代方法,用于编程其IBM 704大型机器机器计算机。 Backus历史悠久的Fortran团队由程序员Richard Goldberg,Sheldon F. Best,Harlan Herrick,Peter Sheridan, Roy Nutt ,Robert Nelson,Robert Nelson,Irving Ziller,Harold Stern, Lois Haibt和David Sayre 。它的概念包括将方程式更容易进入计算机,这是J. Halcombe Laning开发的想法,并在1952年的Laning and Zierler系统中进行了证明。
IBM数学公式翻译系统的规范草案已于1954年11月完成。Fortran的第一部手册出现在1956年10月,第一个Fortran编译器于1957年4月交付。这是第一个优化的编译器。高级编程语言,除非其编译器能够以相近手工编码的汇编语言的性能生成代码。
尽管社区对这种新方法的表现可能优于手工编码,但它减少了操作机器所需的编程声明数量,并迅速获得了接受。约翰·贝克斯(John Backus)在1979年对IBM员工杂志Think的采访中说:“我的大部分工作都是从懒惰的。我不喜欢编写程序,因此,当我从事IBM 701的工作时,编写用于计算的程序时导弹轨迹,我开始使用编程系统,以使编写程序更容易。”
该语言被科学家广泛采用,以编写数字密集的程序,该语言鼓励编译器作者生产可以生成更快,更有效的代码的编译器。将复杂的数字数据类型包含在使Fortran的语言中,特别适合于电气工程等技术应用。
到1960年, IBM 709、650、1620和7090计算机的FORTRAN版本。值得注意的是,Fortran刺激竞争计算机制造商的普及为其机器提供了供电者编译器,因此到1963年有40多个Fortran编译器都存在。由于这些原因,Fortran被认为是第一个广泛使用的跨平台编程语言。
IBM 1401计算机为Fortran提供了创新的63相编译器,该编译器完全在其仅8000(六位)字符的核心内存中运行。编译器可以从胶带或2200张甲板上运行;它不使用进一步的磁带或磁盘存储。如海恩斯所述,它将程序保持在内存中,并加载覆盖层,并将其逐渐将其转换为可执行的形式。本文在编译器解剖学和IBM手册“ Fortran规格和操作程序IBM 1401”中的两个版本中都经过了编辑。可执行形式并非完全是机器语言。相反,解释了浮点算术,亚扫描,输入/输出和功能参考,在UCSD Pascal p-Code之前进行了二十年。 Gotran是Fortran I的简化,解释的版本(只有12个语句而非32个语句),用于“负载和GO”操作(至少对于早期的IBM 1620计算机而言)。现代Fortran以及几乎所有后来的版本都是针对其他高性能语言完成的。
Fortran的发展与编译器技术的早期发展相似,并且编译器理论和设计的许多进步都是由于需要为FORTRAN程序生成有效的代码而进行的。
Fortran
IBM 704的Fortran的初始发布包含32个语句,包括:
-
DIMENSION
和EQUIVALENCE
语句 - 分配语句
- 三向算术
IF
声明,该声明将控制权传递到程序中的三个位置之一,具体取决于算术陈述的结果为负,零还是正面 -
IF
检查异常的语句(ACCUMULATOR OVERFLOW
,QUOTIENT OVERFLOW
, 和DIVIDE CHECK
);和IF
操纵感官开关和感官灯的陈述 -
GO TO
,计算GO TO
,ASSIGN
,并分配GO TO
-
DO
循环 - 格式I/O:
FORMAT
,READ
,READ INPUT TAPE
,WRITE
,WRITE OUTPUT TAPE
,PRINT
, 和PUNCH
- i/o未形成的I/O:
READ TAPE
,READ DRUM
,WRITE TAPE
, 和WRITE DRUM
- 其他I/O:
END FILE
,REWIND
, 和BACKSPACE
-
PAUSE
,STOP
, 和CONTINUE
-
FREQUENCY
语句(用于为编译器提供优化提示)。
算术IF
声明让人想起(但不容易通过)704上提供的三路比较指令(CAS- CAS-与存储器的CAS-COMPARE累加器)。该声明提供了比较数字的唯一方法,可以通过测试其差异,并具有伴随的风险溢出。后来,在Fortran IV中引入的“逻辑”设施克服了这种缺陷。
这FREQUENCY
语句最初(并选择)用于给出算术三个分支机构的分支概率IF
陈述。第一个Fortran编译器使用此加权来在编译时间执行蒙特卡洛模拟生成的代码,其结果用于优化基本块在内存中的放置,这是对其时代非常复杂的优化。 Backus等人的论文中记录了蒙特卡洛技术,有关此原始实现,即FORTRAN自动编码系统:
计划的基本单位是基本块。一个基本块是一个程序,它具有一个入口点和一个出口点。第4节的目的是为第5节A表(pred表)表准备,该表列举了每个基本块的基本块和列表,每个基本块每个基本块,这可以是其直接的流程中的直接前任,以及的绝对频率以及每个这样的基本块链接。该表是通过以蒙特卡洛的方式运行程序来获得的,其中由IF-Type语句和计算的条件转移结果的结果由随机数发电机根据提供的任何频率语句进行适当加权而确定。
第一个Fortran编译器在发现错误并在其控制台上输出错误代码时通过停止程序来报告诊断信息。该代码可以在操作员手册中的错误消息表中查找该代码,从而简要说明问题。后来,已合并了一个错误处理用户错误(例如由NASA开发的零)等用户错误的子例程,告知用户哪一行代码包含该错误。
修复了布局和打孔卡
在开发磁盘文件,文本编辑器和终端之前,程序最常在关键键盘上输入80柱打孔卡,这是卡的一行。由此产生的纸牌将被送入读卡器中以进行编译。打孔的卡代码不包括低写字母或许多特殊字符,并提供了IBM 026 Keypunch的特殊版本,这些版本将正确打印fortran中使用的重新使用的特殊字符。
反射打孔的卡输入实践,Fortran程序最初是以固定列格式编写的,前72列读为十二个36位单词。
第1列中的字母“ C”导致整个卡被视为评论,并被编译器忽略。否则,将卡的列分为四个字段:
- 1至5是标签字段:此处的数字序列被用作用于DO或控制语句的标签,例如to and If to and If to或IF,或识别写或读取语句中所述的格式语句。领先的零被忽略,0不是有效的标签号。
- 6是一个延续字段:此处的空白或零字符导致该卡作为先前卡上的陈述的延续。连续卡通常编号为1、2等。因此,启动卡的延续列可能为零 - 这不是其先前卡的延续。
- 7至72是声明领域。
- 73至80被忽略(IBM 704的读卡器仅使用了72列)。
因此,第73至80列可用于识别信息,例如打孔号或文本,如果丢弃了一堆卡片,则可以用来重新排序卡;尽管实际上,这是为稳定的生产计划保留的。 IBM 519可用于复制程序甲板并添加序列编号。一些早期的编译器,例如IBM 650,由于其读卡器的限制而受到了额外的限制。可以将Keypunches编程为第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字符串最初仅以格式和数据语句允许,由字符计数和字母h进行前缀(例如,26HTHIS IS ALPHANUMERIC DATA.
),允许将空白保留在字符串中。错误规模是一个问题。
进化
年 | 非正式名称 | 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 |
Fortran II
IBM的Fortran II出现在1958年。主要增强功能是通过允许用户编写的子例程和函数来支持程序编程,这些子例程和功能以参考文献传递的参数返回值。通用语句为子例程提供了一种访问常见(或全局)变量的方式。引入了六个新陈述:
-
SUBROUTINE
,FUNCTION
, 和END
-
CALL
和RETURN
COMMON
在接下来的几年中,Fortran II增加了对DOUBLE PRECISION
和COMPLEX
数据类型。
早期的Fortran编译器支持子例程中没有递归。早期的计算机体系结构不支持堆栈的概念,并且当它们直接支持子例程呼叫时,返回位置通常存储在一个与子例程代码相邻的固定位置(例如IBM 1130 )或特定的机器寄存器( IBM 360 ET SEQ) ),仅在通过软件维护堆栈并且在呼叫返回后拨打并还原之前将返回地址存储在堆栈上时,才允许递归。尽管未在Fortran 77中指定,但许多F77编译器都支持递归作为选项,而内置的递归设计的Burroughs大型机则默认情况下确实如此。它通过新的关键字递归成为Fortran 90的标准。
简单的Fortran II计划
对于苍鹭的公式,该程序在磁带卷轴上读取数据,其中包含三个5位整数A,B和C作为输入。没有可用的“类型”声明:名称以i,j,k,l,m或n开头的变量是“定点”(即整数),否则浮点。由于要在此示例中处理整数,因此变量的名称始于字母“ i”。变量的名称必须以字母开头,并且可以继续使用字母和数字,最高限制了Fortran II中的六个字符。如果a,b和c不能表示平面几何形状中三角形的侧面,则程序的执行将以“停止1”的错误代码结尾。否则,将打印输出线,显示A,B和C的输入值,然后是三角形的计算区域,作为浮点数,沿着输出线占据了十个空间,并在小数点之后显示2位数字,带有标签601的格式语句的.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
Fortran III
IBM还于1958年开发了一个Fortran III ,该Fortran III允许在其他功能中使用内联合代码。但是,此版本从未作为产品发布。像704 FORTRAN和FORTRAN II一样,Fortran III具有与机器相关的功能,这些功能使其在机器上无法说明代码。其他供应商提供的早期版本遭受了相同的劣势。
Fortran IV
由于客户需求,IBM从1961年开始开发Fortran IV。 Fortran IV删除了Fortran II的机器依赖性特征(例如READ INPUT TAPE
),同时添加新功能,例如LOGICAL
数据类型,逻辑布尔表达式和逻辑if语句作为算法IF语句的替代方案。 Fortran IV最终于1962年发行,首先发布了IBM 7030(“ stract”)计算机,其次是IBM 7090,IBM 7094的版本,后来是1966年IBM 1401的版本。
到1965年,Fortran IV应该符合由美国标准协会X3.4.3 Fortran工作组制定的标准。
在1966年至1968年之间,IBM为其系统/360提供了几个Fortran IV编译器,每个编译器由字母命名,表明编译器运行所需的最小内存量。字母(f,g,h)与系统/360型号的代码匹配以指示内存大小,每个字母的增量为两个较大因素:
- 1966年:DOS/360(64K字节)的Fortran IV F
- 1966年:OS/360(128K字节)的Fortran IV G
- 1968年:OS/360(256K字节)的Fortran IV H
从1967年到1975年,数字设备公司维护了PDP-10的DECSYSTEM-10 FORTRAN IV( F40 )。
大约在这个时候,Fortran IV已开始成为一种重要的教育工具,并创建了诸如滑铁卢大学的Watfor和Watfiv之类的实现,以简化早期编译器的复杂编译和链接过程。
Fortran IV编程和编译器的概述
在该时代的Fortran IV编程环境中,除了在控制数据公司(CDC)系统上使用的时代,每行只放置了一项指令。如果由$(美元)字符隔开,则CDC版本允许每行多个说明。福特纸被分为四个区域:
- 参考:第1至5列
- 续:第6列
- 可变字段:第7至72列
- 识别:第73至80列
可以在第1至5列中分配范围从1到99,999的订单数字,以识别特定说明,通常在循环或序列中断的情况下。这些列中的任何空白都被忽略了。第1列还可以包含一个“ C”,表明第1至80列的整个内容是评论,在编译过程中逐字复制而不会产生任何真实的说明。这些被称为“评论卡”。
“连续列”(第6列)可以在1到9(不包括0)之间保持一个数字,以表明以前卡上的公式或声明在当前卡上继续进行。最多可以使用19个连续卡,并且这些卡上的数字可以按任何顺序进行。
在变量字段(第7至72列)中,编写了程序的符号指令,并可以选择使用空白的空格指令,这些指令被编译器忽略。为了避免字母o和零数之间的混淆,零的数字由单个0表示,字母o由禁止的o(Ø)表示。
编译器忽略的标识区用于简短评论或编号程序卡。如果卡片的自然顺序被意外破坏,这一点特别有用。
当时的两个编译器IBM“ G”和Univac允许在与说明相同的行上写评论,并由特殊字符分开:“ Master Space”:v(Pultorations 7和8),用于Univac和univac和Puntorations 12 /11 /0/7/8/9(IBM的十六进制FF)。这些评论不应插入连续卡的中间。
Fortran 66
福特兰早期历史上最重要的发展也许是美国标准协会(现为美国国家标准研究所(ANSI))的决定,成立了商业设备制造商协会(BEMA)赞助的委员会,以开发美国标准供应商。由此产生的两个标准于1966年3月批准,定义了两种语言,即Fortran (基于Fortran IV,它是事实上的标准)和基本的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
,分配GO TO
, 和ASSIGN
语句 - 逻辑
IF
和算术(三向)IF
语句 -
DO
循环语句 -
READ
,WRITE
,BACKSPACE
,REWIND
, 和ENDFILE
顺序I/O的语句 -
FORMAT
语句和分配格式 -
CALL
,RETURN
,PAUSE
, 和STOP
语句 - Hollerith常数
DATA
和FORMAT
语句,作为程序的论点 - 最多六个字符的标识符
- 评论线
-
END
线
Fortran 77
在发布Fortran 66标准后,编译器供应商向标准FORTRAN引入了几次扩展,促使ANSI委员会X3J3于1969年开始在修订1966年的标准下,在计算机商业设备制造商协会(以前是Bema)的CBEMA下。该修订标准的最终草案于1977年散发,导致了1978年4月的新型Fortran标准的正式批准。新标准称为Fortran 77 ,正式表示X3.9-1978,添加了许多重要功能,以解决许多重要的功能Fortran 66的缺点:
- 堵塞
IF
和END IF
陈述,可选ELSE
和ELSE IF
条款,为结构化编程提供改进的语言支持 -
DO
循环扩展,包括参数表达式,负增量和零跳闸计数 -
OPEN
,CLOSE
, 和INQUIRE
提高I/O功能的陈述 - 直接访问文件I/O
-
IMPLICIT
陈述,覆盖隐式约定,如果他们的名字以i,j,k,l,m或n的名字开头,那么未宣布的变量是整数的(以及实际的) -
CHARACTER
数据类型,用大量扩展的功能代替Hollerith字符串,以进行角色输入和输出以及基于字符的数据的处理 -
PARAMETER
指定常数的声明 -
SAVE
持续的本地变量的声明 - 内在函数的通用名称(例如
SQRT
还接受其他类型的论点,例如COMPLEX
或者REAL*16
). - 一组内在的(
LGE, LGT, LLE, LLT
)基于ASCII整理序列的字符串比较。 (美国国防部在有条件的批准投票中要求这些ASCII职能。)
在对标准的此修订中,以可能使以前的标准符合程序无效的方式删除或更改了许多功能。 (删除是当时X3J3的唯一允许替代方案,因为“弃用”的概念尚不适合ANSI标准。以前标准允许但很少使用的漏洞或病理病例,故意删除了少数特定功能,例如:
- Hollerith常数和Hollerith数据,例如
GREET = 12HHELLO THERE!
- 读取格式规范中的H编辑(Hollerith字段)描述符
- 订阅对数组界限的过度索引
DIMENSION A(10,5) Y = A(11,1)
- 控制控制和返回DO循环的范围(也称为“扩展范围”)
过渡到ANSI标准FORTRAN
随着标准化过程难以跟上计算和编程实践的快速变化,将一再推迟修订的成功标准以取得成功的Fortran 77。同时,作为近十五年来的“标准供应商”,Fortran 77将成为历史上最重要的方言。
Fortran 77的一个重要实用扩展是1978年发布MIL-STD-1753。该规范是由美国国防部制定的,标准化了大多数Fortran 77编译器实施的许多功能,但未包含在ANSI Fortran 77标准中。这些功能最终将纳入Fortran 90标准中。
-
DO WHILE
,EXIT
,CYCLE
, 和END DO
语句 -
INCLUDE
陈述 -
IMPLICIT NONE
变体IMPLICIT
陈述 - 基于工业实时供货中包含的类似功能(ANSI/ISA S61.1(1976)) ,位操纵固有函数
IEEE 1003.9 POSIX标准于1991年发布,为Fortran 77程序员发出POSIX系统呼叫提供了一种简单的手段。文档中定义了100多个呼叫 - 允许以便携式方式访问POSIX兼容的过程控制,信号处理,文件系统控制,设备控制,过程指向和流I/O。
Fortran 90
Fortran 77备受推迟的继任者,非正式地称为Fortran 90 (在此之前, Fortran 8X ),最终以ISO/IEC标准1539:1991在1991年发行,并在1991年作为ANSI标准发行。除了更改官方外,从Fortran到Fortran的拼写,这项重大修订添加了许多新功能,以反映自1978年标准以来已经发展的编程实践的重大变化:
- 自由形式源输入删除了在输入语句之前跳过前六个字符位置的需求。
- 小写的fortran关键字
- 标识符的长度最高31个字符(在上一个标准中,只有6个字符)。
- 内联评论
- 能够在整个数组(或数组部分)上操作,从而大大简化数学和工程计算。
- 整个,部分和蒙版的数组分配语句和数组表达式,例如
X(1:N)=R(1:N)*COS(A(1:N))
-
WHERE
选择性数组分配的语句 - 阵列值的常数和表达式,
- 用户定义的数组值函数和数组构造函数。
- 整个,部分和蒙版的数组分配语句和数组表达式,例如
RECURSIVE
程式- 模块,将相关的过程和数据分组在一起,并使它们可用于其他程序单元,包括将可访问性仅限于模块的特定部分的功能。
- 一个大大改进的论点机制,允许在编译时检查接口
- 通用过程的用户写入接口
- 操作员超载
- 得出的(结构化)数据类型
- 新的数据类型声明语法,指定变量的数据类型和其他属性
- 通过
ALLOCATABLE
属性和ALLOCATE
和DEALLOCATE
语句 POINTER
属性,指针分配和NULLIFY
促进动态数据结构的创建和操纵的声明- 结构化循环结构,
END DO
循环终止声明,以及EXIT
和CYCLE
终止正常的陈述DO
以有序的方式循环迭代 -
SELECT
. . .CASE
构建多路选择 - 在用户控件下的数值精度的便携式规范
- 新的和增强的内在程序。
过时和缺失
与先前的修订版不同,Fortran 90删除了没有功能。在Fortran 90下,任何标准配合的FORTRAN 77程序也是标准构成的,并且任何标准都应使用以定义其行为。
一小部分功能被确定为“过时”,预计将在未来的标准中删除。这些早期反变功能的所有功能都可以由较新的fortran功能执行。有些人可以简化旧程序的移植,但在Fortran 95中删除了许多程序。
过时的特征 | 当前状态 |
---|---|
算术算法 | 删除 |
非直觉执行参数或控制变量 | 删除 |
共享do-loop终止或终止端以外的声明do或继续 | 删除 |
分支要结束,如果从外部一个街区 | 删除 |
替代回报 | 过时 |
暂停语句 | 删除 |
分配语句并分配到语句 | 删除 |
分配的语句编号和格式指定符 | 删除 |
H编辑描述符 | 删除 |
计算转到语句 | 过时 |
语句功能 | 过时 |
可执行语句中的数据语句 | 过时 |
字符*字符声明的形式 | 过时 |
假定的字符长度函数 | 过时 |
固定表单源代码 | 过时 |
“你好世界!”例子
program helloworld
print *, "Hello, World!"
end program helloworld
Fortran 95
Fortran 95 ,正式出版为ISO/IEC 1539-1:1997,是次要的修订,主要是解决Fortran 90标准中的一些未出色问题。尽管如此,Fortran 95还增加了许多扩展,特别是来自高性能的Fortran规范:
-
FORALL
并嵌套WHERE
辅助矢量化的构造 - 用户自定义
PURE
和ELEMENTAL
程式 - 派生类型组件的默认初始化,包括指针初始化
- 扩展了使用初始化表达式的数据对象的能力
- 将指针的初始化
NULL()
- 明确定义了这一点
ALLOCATABLE
阵列不在范围时会自动处理。
扩展了许多内在函数(例如dim
参数已添加到maxloc
固有的)。
从Fortran 95中删除了Fortran 90中指出的几个功能:
-
DO
语句使用REAL
和DOUBLE PRECISION
索引变量 - 分支到一个
END IF
从其外部的声明 -
PAUSE
陈述 -
ASSIGN
并分配GO TO
语句和分配格式指定符 -
H
Hollerith编辑描述符。
Fortran 95的重要补充是ISO技术报告TR-15581:增强的数据类型设施,非正式地称为可分配的TR。该规范定义了增强的使用ALLOCATABLE
阵列,在完全符合Fortran的Fortran编译器之前。这种用途包括ALLOCATABLE
数组作为派生类型组件,过程虚拟参数列表中的数组和函数返回值。 ((ALLOCATABLE
阵列比POINTER
- 基于数组,因为ALLOCATABLE
Fortran 95保证了阵列在范围内自动划分的阵列,从而消除了内存泄漏的可能性。此外,可分配数组的元素是连续的,并且混叠并不是优化数组参考的问题,允许编译器生成更快的代码,而不是指针。)
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编译器。”然而,如果标准符合的福特兰确实提供了这样的选择,则“必须根据标准适当部分中对这些设施的描述提供它们”。
现代福特
二十一世纪标准所定义的语言,尤其是因为它纳入了面向对象的编程支持和随后的coarray fortran ,通常被称为“现代福特兰”,并且该术语在文献中越来越多地使用。
Fortran 2003
Fortran 2003,正式出版为ISO/IEC 1539-1:2004,是介绍许多新功能的主要修订版。 Fortran工作组( ISO/IEC JTC1/SC22 /WG5)官方网站提供了Fortran 2003新功能的全面摘要。
从该文章中,此修订的主要增强功能包括:
- 派生类型增强:参数化派生类型,改进的可访问性控制,改进的结构构造函数和最终化器
- 面向对象的编程支持:类型扩展和继承,多态性,动态类型分配和类型结合的过程,为抽像数据类型提供完整的支持
- 数据操作增强:可分配组件(合并TR 15581),递延类型参数,
VOLATILE
数组构造函数中的属性,明确的类型规范,并分配语句,指针增强功能,扩展初始化表达式和增强的内在过程 - 输入/输出增强:异步传输,流访问,用户指定的派生类型的转移操作,用户指定的格式转换过程中的舍入的控制,称为预先连接的单元,命名为常数
FLUSH
语句,关键字的正规化以及访问错误消息 - 程序指针
- 支持IEEE浮点算术和浮点异常处理(合并TR 15580)
- 与C编程语言的互操作性
- 支持国际用法:访问ISO 10646 4字节字符以及数字格式化/输出中的小数或逗号的选择
- 与主机操作系统的增强集成:访问命令行参数,环境变量和处理器错误消息
Fortran 2003的一个重要补充是ISO技术报告TR-19767:Fortran的增强模块设施。该报告提供了子模块,这使得FORTRAN模块更类似于Modula-2模块。它们类似于ADA私人儿童子单元。这允许在单独的程序单元中表达模块的规范和实施,从而改善了大型库的包装,可以在发布确定的接口时保存商业秘密,并防止编译级联。
Fortran 2008
ISO/IEC 1539-1:2010,非正式地称为Fortran 2008,于2010年9月获得批准。与Fortran 95一样,这是一个较小的升级,并将其澄清和更正为Fortran 2003,并引入了一些新功能。新功能包括:
- 子模块 - 模块的其他结构设施;取代ISO/IEC TR 19767:2005
- COARRAY FORTRAN - 平行执行模型
- DO并发结构 - 用于无相互依赖的循环迭代
- 连续属性 - 指定存储布局限制
- 块构造- 可以包含具有构造范围的对象声明
- 递归可分配组件- 作为衍生类型中递归指针的替代方案
最终国际标准草案(FDI)可作为文档N1830获得。
Fortran 2008的补充是国际标准化组织(ISO)技术规范组织(TS)29113关于Fortran与C的进一步互操作性,该组织已于2012年5月提交给ISO批准。该规范增加了支持从C访问数组描述符的支持,并允许忽略参数的类型和等级。
Fortran 2018
该语言的最新修订(Fortran 2018)早些时候被称为Fortran2015。这是一项重要的修订,并于2018年11月28日发布。
Fortran 2018纳入了两个先前发表的技术规格:
- ISO/IEC TS 29113:2012与C进一步互操作性
- ISO/IEC TS 18508:2015 FORTRAN的其他平行功能
其他更改和新功能包括对ISO/IEC/IEEE 60559:2011的支持(在最新的次要修订版IEEE 754-2019之前,IEEE浮点标准的版本),十六进制输入/输出,隐含无增强和其他更改。
Fortran 2023
Fortran 2023(ISO/IEC 1539-1:2023)于2023年11月出版,可以从ISO购买。
语言特征
相关文章Fortran 95语言功能涵盖了Fortran 95带来的Fortran语言功能的完整描述。以后标准定义的语言版本通常被称为“现代福特人”,并在文献中进行了描述。
科学与工程
尽管基本作者的1968年期刊文章已经将Fortran描述为“老式”,但在Fortran中已经写了数十年的程序,并且在整个科学和工程社区中,每天都有大量的Fortran软件。杰伊·帕萨乔夫(Jay Pasachoff)在1984年写道:“物理和天文学学生只需要学习福特兰。 1993年,塞西尔·莱斯(Cecil E.
它是一些最密集的超级计算任务的主要语言,例如在天文学,气候建模,计算化学,计算经济学,计算流体动力学,计算物理学,数据分析,水文建模,数值线性代数和数值库( Lapack , IMSL和NAG ),优化,卫星模拟,结构工程和天气预测。许多浮点基准测量了新计算机处理器的性能,例如Spec基准的浮点组件(例如, CFP2006 , CFP2017 )。数学算法在数值配方中有充分的记录。
除此之外,计算科学中更现代的代码通常使用大型程序库,例如用于图形分区的METIS , PETSC或TRILINOS ,用于线性代数功能, Deal.ii或Fenics用于网格和有限元元素支持以及其他通用库。自2000年代初以来,许多广泛使用的支持库也已在C中,最近在C ++中实施。另一方面,高级语言,例如Wolfram语言, Matlab , Python和R等在计算科学领域的特定领域已变得流行。因此,越来越多的科学计划也用如此高级的脚本语言编写。因此,将与C间互操作的设施添加到Fortran 2003中,并通过ISO/IEC技术规范增强了29113,该设施已纳入Fortran 2018中,以允许与其他编程语言进行更灵活的互操作。
NASA Probes Voyager 1和Voyager 2的软件最初是用Fortran 5编写的,后来移植到Fortran77。截至2013年9月25日,某些软件仍在Fortran上写,有些软件已移植到C. C.
可移植性
在早期,便携性是一个问题,因为没有达成共识的标准(甚至IBM的参考手册),而计算机公司则通过提供不兼容的功能来区分其产品与他人的产品。标准提高了可移植性。 1966年的标准提供了参考语法和语义,但供应商继续提供不相容的扩展。尽管仔细的程序员开始意识到,使用不兼容的扩展造成了昂贵的可移植性问题,因此使用了诸如pfort验证者之类的程序,但直到1977年标准之后,国家标准局(现为NIST )才出版了FIPS Pub 69 ,美国政府购买的处理器被要求诊断标准的扩展。本质上,每个编译器都没有提供两个处理器,而是最终至少有一个诊断扩展的选项。
不兼容的扩展不是唯一的便携性问题。对于数值计算,重要的是要考虑到算术的特征。这是Fox等人解决的。在港口库的1966年标准的背景下。其中的想法被广泛使用,并最终通过内在的查询功能纳入了1990年的标准。二进制浮点算术的IEEE 754标准的广泛采用(现在几乎是普遍的)基本上已经消除了此问题。
访问计算环境(例如,程序的命令行,环境变量,错误条件的文本说明)一直是一个问题,直到2003年标准解决。
可以描述为与工程和科学计算(例如图形库)的大量图书馆软件收集,因此已在C中编写,因此访问它们带来了可移植性问题。通过将C互操作性纳入2003标准,已经解决了这一点。
现在,即使在不求助于预处理器的情况下,也可以在Fortran中编写完全便携式程序(相对容易)。
过时的变体
在开发Fortran 66标准之前,每个编译器都支持其自己的Fortran变体。有些与主流相比,比其他主流更具分歧。
第一个Fortran编译器为编译代码设定了高标准的效率。这个目标使得难以创建编译器,因此通常由计算机制造商来支持硬件销售。这留下了一个重要的利基市场:快速并为程序员(通常是学生)提供良好诊断的编译器。例子包括Watfor,Watfiv,Pufft和较小规模,Forgo,Wits Fortran和Kingston Fortran 2。
Fortran 5由Data General Corp在1970年代末和1980年代初为Nova , Eclipse和MV计算机销售。它具有优化编译器,非常适合当时的微型计算机。该语言最类似于fortran 66。
Fortran V由Control Data Corporation于1968年针对CDC 6600系列分发。该语言基于Fortran IV。
Univac还提供了一个名为Fortran V的1100系列的编译器。
高性能科学计算机供应商生产的特定变体(例如, Burroughs , Control Data Corporation (CDC), Cray , Honeywell , IBM , Texas Instruments和Univac )为Fortran增添了扩展,以利用特殊硬件的功能,例如指令缓存,CPU管道和向量阵列。例如,IBM的一个Fortran编译器( H扩展IUP )具有一定的优化水平,该级别重新排序了机器代码指令,以使多个内部算术单元同时忙于忙碌。另一个示例是CFD ,这是专为Illiac IV超级计算机设计的Fortran的特殊变体,在NASA的AMES研究中心运行。 IBM Research Labs还开发了一种扩展的基于Fortran的语言,称为Vectran用于处理向量和矩阵。
面向对象的Fortran是面向对象的Fortran扩展,可以将数据项分组到对像中,可以并行实例化和执行。它适用于Sun,Iris, IPSC和NCube,但不再支持。
这种特定于机器的扩展可以随着时间的流逝而消失,要幺将元素纳入主要标准。剩余的主要扩展名是OpenMP ,这是共享内存编程的跨平台扩展名。一个新的扩展名Coarray Fortran旨在支持并行编程。
对于运输,使用了1950年代后期在卡内基开发的翻译程序,是IBM 704 Fortran语言的简化版本的名称。以下评论出现在IBM参考手册中(用于运输自动编码系统C28-4038,版权1957,1959 by IBM):
FORTRAN系统的设计用于比650更复杂的机器,因此,在Fortran程序员的参考手册中发现的32个陈述中的某些语句中的某些语句不可接受for Transit System。此外,还添加了对Fortran语言的某些限制。但是,这些限制均未使为与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), ...
一个程序中最多可以使用十个子例程。
对于过境,仅限于第7至56列。打孔卡用于IBM 650上的输入和输出。将源代码转换为“ IT”语言需要三个通行证,然后将IT语句汇编为肥皂汇编语言,最后生产对象程序,然后可以被加载到机器中以运行程序(使用打孔卡进行数据输入,然后输出结果到打孔卡上)。
650年代存在两个版本,其中有2000个单词记忆鼓:对于过境I(S)和Transit II,后者是配备索引寄存器的机器和自动浮点数十进制( Bi-quarine )算术算术。手册的附录A包括IBM 533读卡器/打孔器控制面板的接线图。
基于Fortran的语言
在Fortran 77之前,许多预处理器通常用于提供更友好的语言,具有优势,即可以在具有标准Fortran编译器的任何机器上编译预处理的代码。这些预处理器通常会支持结构化编程,可变名称长于六个字符,其他数据类型,条件编译甚至宏观功能。受欢迎的预处理器包括EFL ,FLEC, IFTRAN , MORTRAN ,SFTRAN,S-FORTRAN, RATFOR和RATFIV 。例如,Ratfor和Ratfiv实现了类似C的语言,在标准Fortran 66中输出预处理代码。尽管进步了Fortran语言,但预处理程序仍在有条件的汇编和宏替换中继续使用。
60年代推出的最早版本之一是在大学和大学中使用的。 Watfor由滑铁卢大学开发,支持和分发,主要基于Fortran IV。使用WATFOR的学生可以提交其批处理工作,如果没有语法错误,该程序将直接执行。这种简化使学生能够专注于他们的程序的语法和语义或执行逻辑流,而不是处理提交工作控制语言(JCL),编译/链接/链接/执行程序连续的过程(ES)或大型帧的其他复杂性/微型计算机环境。这个简化的环境的不足之处在于,对于需要其主机处理器扩展能力的程序员来说,WATFOR不是一个不错的选择,例如,WATFOR通常对I/O设备的访问范围非常有限。 Watfor由Watfiv及其后来的版本继承。
program; s=0 i=1,n; s=s+1; stop i; s='s' Stop
(线路编程)
LRLTRAN是在Lawrence辐射实验室开发的,以为向量算术和动态存储提供支持,以及其他扩展,以支持系统编程。分布包括LTSS操作系统。
FORTRAN-95标准包括可选的第3部分,该部分定义了可选的条件汇编功能。该功能通常称为“可可”。
许多Fortran编译器将C预处理器的子集集成到其系统中。
SimScript是用于建模和模拟大型离散系统的应用程序特定的FORTRAN预处理器。
F编程语言被设计为福特兰95的干净子集,该子集试图删除冗余,非结构化和弃用的福特特征,例如EQUIVALENCE
陈述。 F保留了Fortran 90中添加的数组功能,并通过添加到Fortran 77和Fortran 90中的结构化编程结构中删除了对控制语句的过时。F的创建者将其描述为“一种编译,结构化的,阵列的编程,特别适合进行教育和科学计算”。 Essential Lahey Fortran 90(ELF90)是类似的子集。
Lahey和Fujitsu合作为Microsoft .NET框架创建了Fortran。 Silverfrost FTN95也能够创建.NET代码。
代码示例
以下程序说明了动态内存分配和基于数组的操作,这两个功能由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, 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
! 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) positive_average = sum(points, points > 0.) / count(points > 0.)
if (count(points < 0.) > 0) negative_average = sum(points, points < 0.) / count(points < 0.)
! Print result to terminal stdout unit 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) ! free memory
end program average
幽默
在选择“ Fortran 77”这个名称的同一Fortran标准委员会会议上,将讽刺的技术建议纳入了标题为“信件o被认为有害”的官方分布中。该提案据称是通过从允许变量名称中消除字母来解决字母“ O”和数字零之间产生的混乱。但是,提出的方法是完全从字符集中消除字母(从而将48个作为词汇字符的数量保留为词汇数量,结肠增加到49个)。这被认为是有益的,因为它可以通过不可能使用臭名昭著的来促进结构化的编程GO TO
像以前一样声明。 (麻烦FORMAT
陈述也将被淘汰。
当X3J3争论DO循环的最低旅行计数是否应为零还是在Fortran 77中为零时,Loren Meissner建议最低旅行数为两项 - 策划(tongue-in-Cheek) ,如果它少于两个没有理由循环!
当添加假定的长度阵列时,关于适当的角色的上限和下边界存在争议。沃尔特·布雷纳德(Walt Brainerd)在审查这些论点的评论中写下了一篇题为“天文学与胃肠病学”的文章,因为一些支持者建议使用星星或星号(“*”),而其他人则赞成结肠(“:”)。
以字母i – N开头的变量名称具有默认类型的整数,而变量则以默认为真实的任何其他字母开头,尽管程序员可以用显式声明复盖默认值。这导致了这个笑话:“在福特兰,上帝是真实的(除非宣布整数)。”