【Fortran】
Fortran，可音译为福传，源自于「公式翻译」（Formula Translation）的缩写，是一种程式语言。它在1957年由IBM开发出，是世界上第一个被正式采用并流传至今的高级编程语言。
==简介==
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 2008和Fortran 2018等更新版本。
== 起源 ==
一架曾由劳伦斯利佛摩国家实验室（Lawrence Livermore National Laboratory，LLNL）操作的古老IBM 704大型主机。
1953年12月，IBM公司工程师约翰·巴科斯（J. Backus）因深深体会编写程序很困难，而写了一份备忘录给董事长Cuthbert Hurd（Cuthbert Hurd），建议为IBM704系统设计全新的电脑语言以提升开发效率。当时IBM公司的顾问冯·诺伊曼强烈反对，因为他认为不切实际而且根本不必要。但赫德批准了这项计划。1957年，IBM公司开发出第一套FORTRAN语言，在IBM704电脑上运作。
历史上第一支FORTRAN程式在马里兰州的西屋贝地斯核电厂试验。1957年4月20日星期五的下午，一位IBM软体工程师决定在电厂内编译第一支FORTRAN程式，当程式码输入后，经过编译，印表机列出一行讯息：“原始程式错误……右侧括号后面没有逗号”，这让现场人员都感到讶异，修正这个错误后，印表机输出了正确结果。而西屋电气公司因此意外地成为FORTRAN的第一个商业用户。
=== FORTRAN ===
最早的FORTRAN版本应用于IBM 704系统上，包含了32种语句，包括：
* DIMENSION和EQUIVALENCE语句
* 赋值语句
* 三态算术IF语句。
* 以IF这个陈述式检查例外情况（ACCUMULATOR OVERFLOW, QUOTIENT OVERFLOW和DIVIDE CHECK）；IF语句以处理判断开关和判断指示灯
* GOTO，计算的GOTO，ASSIGN，和赋值GOTO
* DO循环
* 格式化的输入与输出（Formatted I/O）: FORMAT, READ, READ INPUT TAPE, WRITE, WRITE OUTPUT TAPE, PRINT和PUNCH
* 非格式化的输入与输出（Unformatted I/O）: READ TAPE, READ DRUM, WRITE TAPE和WRITE DRUM
* 其他的输入与输出：END FILE, REWIND，和BACKSPACE
* PAUSE, STOP，和CONTINUE
* FREQUENCY语句（为编译器提供优化帮助）
==演化==
FORTRAN发明的年代还没有键盘与萤幕，程式码必须使用打卡机打在打孔卡（punch card）上。图中显示卡片上的1-5行、第6行与73-80行被使用过。
一张Fortran代码表，程序员准备将上面写的代码用打卡机转录到卡片上。现在已不再使用这种方式。
=== FORTRAN II ===
1958年IBM又推出FORTRAN II.支援使用者撰写副程式（subroutines）以及函数（functions）。有六个新陈述如下：
* SUBROUTINE, FUNCTION，和END
* CALL和RETURN
* COMMON
接下来的几年内，FORTRAN II继续又支援DOUBLE PRECISION和COMPLEX等数据类型（data types）。
====简单的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等的开发过程，包含了过多的机器依赖性（machine-dependent），造成程式码不易移植到其他机器上的问题。早期提供FORTRAN版本的厂商经常为此所苦。
自1961年开始，由于客户的强烈要求，IBM开始发展FORTRAN IV，目的在于移除一些FORTRAN II中过于依赖机器本身的程式码（例如：READ INPUT TAPE）同时新增一些新的功能，如LOGICAL资料型别。布尔表达式（TRUE或者FALSE）与逻辑IF语句则取代了算术IF语句。FORTRAN IV于1962年推出，最早应用于IBM 7030（"Stretch"）计算机之上，以及其接续的IBM 7090和IBM 7094版本。
=== FORTRAN 66 ===
早期的FORTRAN语言发展史上最重要的一件大事也许是美国标准协会（即今日的美国国家标准协会ANSI）的委员们开始为FORTRAN制定标准规格，名为"American Standard Fortran." 1966年委员会推出两套FORTRAN标准版本，分别定义成FORTRAN（基于FORTRAN IV，用来应付de facto标准）和Basic FORTRAN（基于FORTRAN II，并且移除其平台依赖性）。FORTRAN第一套标准后来被称为FORTRAN 66（大家仍习惯称之为FORTRAN IV）。FORTRAN 66有效的成功第一套工业标准版的FORTRAN。其功能如下：
* 主程序，SUBROUTINE，FUNCTION和BLOCK DATA程序单元
* INTEGER, REAL, DOUBLE PRECISION, COMPLEX和LOGICAL数据类型
* COMMON, DIMENSION和EQUIVALENCE语句
* DATA语句用以指定初始值
* 内部和EXTERNAL（例如库）函数
* 赋值语句
* GOTO，赋值GOTO和计算GOTO语句
* 逻辑IF和算术（三态）IF语句
* DO循环
* READ, WRITE, BACKSPACE, REWIND和ENDFILE语句以处理顺序读写
* FORMAT语句
* CALL, RETURN, PAUSE和STOP语句
* DATA和FORMAT语句中的Hollerith constant，作为子程序的实际参数
* 最长六个字母的标识符
* 注释行
=== FORTRAN 77 ===
在FORTRAN 66标准推出之后，各家编译器厂商不断推出更具扩充性的标准FORTRAN（"Standard Fortran"），这使得ANSI于1969年开始著手于1966标准版本的修正工作。最后定稿于1977年，1978年四月正式推出新的标准规格，也就是著名的FORTRAN 77，这个版本是基于FORTRAN 66之上新增许多功能，弥补过去的缺点：
* CHARACTER数据类型，极大地扩展了的字符输入和输出以及对基于字符的数据进行处理的工具
* IMPLICIT语句
* IF和END IF语句的块，以及可选的ELSE和ELSE IF从句，提供改进了的对结构化编程的语言支持。
* OPEN，CLOSE和INQUIRE语句以改进I/O能力
* 直接访问文件I/O
* PARAMETER语句以指定常数
* SAVE语句以保存本地变量
* 内部函数的通用名称
1978年推出了一个重要的版本FORTRAN 77是为MIL-STD-1753 Release版。这个规格由美国国防部制定，这个标准化的FORTRAN 77编译器并未引入ANSI FORTRAN 77标准。一些新功能最终合并到Fortran 90标准版。
* DO WHILE和END DO语句
* INCLUDE语句
* IMPLICIT NONE变量，用于IMPLICIT语句
* Bit manipulation内部函数，基于类似的包含在Industrial Real-Time Fortran（ANSI/ISA S61.1 (1972)）中的函数
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属性和ALLOCATE和DEALLOCATE语句
* POINTER属性，指针赋值和NULLIFY语句以便于创建和操作动态数据结构
* CASE结构以用于多路选择
* EXIT和CYCLE语句以用于在按顺序地"跳出"正常的DO循环重复
* 最长31个字符的标识符
* 行内注释
* 用户可控制的可定义的数字精度
* 新的和增强的内部过程
=== Fortran 95 ===
Fortran 95仅是一个小改版，大部份修正了Fortran 90 standard一些较为显著的问题。虽然如此，Fortran 95仍有不少的扩充，尤其是在High Performance Fortran的规格：
* FOR ALL和嵌套的WHERE结构以帮助向量化
* 用户定义的PURE和ELEMENTAL过程
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==
2007年在美国阿贡国家实验室架设的IBM蓝色基因超级计算机。
作为由二十一世纪的标准定义的语言，特别是因为它结合了面向对象编程支持和后来的Coarray Fortran，它经常被称为“现代Fortran”，这个术语在文献中的使用日渐增长。
=== Fortran 2003 ===
Fortran 2003有著更大幅度的改版。ISO Fortran工作组（ISO/IEC JTC 1/SC 22/WG5）的官方网站有关于Fortran 2003新特性的详细总结。
据该文所述，本版本的主要改进包括：
* 增强了衍生类型：带参数的衍生类型，改善了控制的可操作性，改善了结构化的创建和释放。
* 支持面向对象编程：扩展类型和继承，多态，动态类型分配，以及类型绑定过程。
* 改善了数据操作：可分配的组件（编入IEEE TR 15581），延期的类型参数，VOLATILE特性，在数组构造和分配语句中显式定义类型，增强的指针，扩展的初始化表达式，增强的内部过程。
* 增强的输入／输出：异步传输，流访问，用户指定衍生类型的传输操作，用户在格式转换时指定舍入控制，为连接前单元指定常数，FLUSH语句，关键字的规范，访问错误信息。
* 过程指针。
* 支持IEEE浮点算法和浮点异常处理（编入IEEE TR 15580）。
* 与C语言的交互性
* 支持国际化：访问ISO 10646四字节字符和在格式化的数字输入／输出中选择数字或者逗号。
* 与宿主操作系统增强的集成：访问命令行参数，环境变量和处理器错误信息。
=== Fortran 2008 ===
ISO/IEC 1539-1:2010，非正式的叫做Fortran 2008，于2010年9月通过。它只是一个小改版，略微更正了Fortran 2003的一些问题，并且合并了ISO/IEC TR 19767:2005的子模块功能。新的功能还包括了Co-array Fortran并行处理模式。
===Fortran 2018===
语言的最新修订（Fortran 2018）早先称为Fortran 2015，它是一个重大的修订并且发行于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浮点数标准）、十六进制输入/输出、IMPLICIT NONE增强和其他变更。
== FORTRAN的特征 ==
Fortran语言的最大特征，是接近数学公式的自然描述，在计算机里具有很高的执行效率。
* 易学，语法严谨。
* 可以直接对矩阵和复数进行运算，这点Matlab有继承。
* 自诞生以来广泛地应用于数值计算领域，积累了大量高效而可靠的源程序。
* 很多专用的大型数值运算计算机针对Fortran做了优化。
* 广泛地应用于并行计算和高性能计算领域。
* 其矩阵元素在记忆空间储存顺序是采用纵排优先（Column major），Matlab也承袭这点，目前最多使用的C语言则采用横排优先（Row major）。
Fortran 90，Fortran 95，Fortran 2003的相继推出，使Fortran语言具备了现代高级编程语言的一些特征。
== 代码例子 ==
下面是一个在标准输出设备上输出Hello World的简单程序，这种程序通常作为开始学习编程语言时的第一个程序，以Fortran 90/95自由格式的写法为例：
program main
write (*,*) "hello, world!"
write (unit = *, fmt = * ) "hello, world!"
stop
end program main
下面的程序展示动态内存分配和基于数组的运算，这是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) negative_average = sum(points, points
== 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编译器技术之后不久，便留下了用于Linux／UNIX系统的相关技术，而将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