《程序员》第10期发表了我写的“Fortran 2003:完美还是虚幻?”一文。我把该文的节选贴在这里吧,要阅读全文的话,可以找《程序员》杂志来看。
Fortran 2003:完美还是虚幻?(节选)
王咏刚,2004年8月
“Fortran 2003!面向对象的Fortran!自由、开放的Fortran!拥抱Fortran 2003吧!”我手舞足蹈、兴奋异常。
“Fortran 2003?你发什么颠?”地球物理系一位戴着宽边眼镜的博士生拦住了我,鄙夷的目光从厚重的眼镜片里直射过来,“我昨天才用Fortran 77做完了课题。你说的‘面向对象’、‘自由’、‘开放’什么的,都是你们程序员的鬼把戏吧?它们能让我的SCI论文数量翻番吗?能让我提前评上副教吗?”
“……”
1.不断变革的Fortran
2004年5月,Fortran 2003,这个新世纪里诞生的Fortran语言新标准,终于在ISO、IEC的联合工作组JTC1/SC22/WG5以及美国Fortran委员会NCITS/J3的共同努力下,走完了编撰、修订的最后一步。不出意外的话,再过一两年,支持Fortran 2003的开发工具就会充斥Fortran世界;那些仍在坚守Fortran 77阵地的老用户们也会自然而然地把质疑的目光从Fortran 90/95投向更富有革命精神的Fortran 2003。
要了解Fortran 2003,我们有必要先简单回顾一下Fortran语言的历史。
1954到1957年间,世界上第一种高级程序设计语言——Fortran诞生于IBM公司。Fortran这个名字的原意是IBM Mathematical FORmula TRANslation,其设计目的在于为科研人员提供一种符合数学思维习惯的高级语言,以满足科学计算的需要。1960年代,在美苏太空竞赛的大背景下,在国防、教育和科研领域对高性能计算工具的迫切需求下,Fortran语言蓬勃发展,成为了当时统治计算机世界的高级语言之王。
…… …… ……
2.面向对象的Fortran
从结构化程序设计到面向对象,这是大多数高级语言的发展、演变规律,Fortran也未能免俗。在Fortran 77中,由于缺乏对数据抽象和数据封装的基本支持,人们很难引入面向对象的理念和方法。在Fortran 90/95中,尽管我们可以用派生类型(Derived Type)和模块(Module)模拟一部分面向对象的特性,但却无法实现真正意义上的封装和继承。
对数据和相关操作的封装是面向对象的基础。传统的结构化程序设计语言大多拥有简单的数据封装能力(如Pascal语言中的record),但缺乏对操作封装的支持。当我们为结构化程序设计语言引入面向对象机制时,在语法层面一般有两种思路:一种是引入一个全新的语法容器,允许用户借助该容器定义出封装了数据和操作的统一数据类型,例如,C++在C语言的基础上扩展出了class的概念,并以class为中心支持面向对象编程;另一种是通过某种机制,将原有的数据封装容器和表述操作的过程或函数捏合在一起,例如,Ada 95利用Ada 83中已有的概念,将private type和相关操作封装在package中,创建了完整的面向对象机制。Fortran 2003对Fortran 90/95的改造正是遵循着后一种思路进行的。
首先,Fortran 2003第一次引入了过程指针(Procedure Pointer)的概念。Fortran 90/95只支持普通指针。为了实现回调机制,Fortran 90/95特意引入了用过程名充当形式参数(Dummy Procedure)的语法,但这种语法还无法解决在数据类型中内嵌相关操作的问题。在Fortran 2003中,我们可以使用过程指针将数据和操作绑定在一起:
TYPE point
REAL :: x, y
PROCEDURE (testif), POINTER :: test
END TYPE
这种绑定是一种运行时的动态绑定,我们可以根据需要为过程指针赋值,这类似于我们在C语言的struct中嵌入函数指针。
其次,如果与类型相关的操作在编译时已经预知,我们就可以直接使用Fortran 2003提供的类型绑定过程(Type-bound Procedure),将数据和操作关联在一起:
TYPE point
REAL :: x, y
CONTAINS
PROCEDURE :: test => my_test
END TYPE
这样,在同一个模块中,类型和相关操作相互关联,用户可以直接使用CALL p1%test或类似的代码来访问特定操作,这已经非常近似于Ada 95的封装机制了。
和C++或Java语言相比,Fortran 2003的这种过程绑定方式较为靠近语言设计的底层。例如,对于绑定在point类型中的my_test过程,我们必须显示指明,该过程的第一个参数为point类型:
SUBROUTINE my_test(a)
TYPE(point), INTENT(IN) :: a
END SUBROUTINE
这里的参数a相当于C++或Java方法中隐含的this参数,其目的是将调用该操作的对象实例传入过程。我把这种显示实现this参数的做法称为“赤裸裸的面向对象”。尽管写起来稍嫌繁琐,但这种“赤裸裸”的做法也有不少好处。例如,我们可以在Fortran 2003中使用NOPASS属性禁止传递对象实例,或通过PASS属性改变对象实例参数在过程参数表中的位置。
…… …… ……
3.自由的Fortran
灵活性一直是Fortran语言的一个弱项。早期的Fortran甚至不支持内存的动态分配。Fortran 90引入了指针的概念,全面支持数据的动态存取,同时也引入了泛型过程(Generic Procedure)的机制,以支持与C++的函数重载类似的功能。在此基础上,Fortran 2003通过参数化派生类型、覆盖、多态型等机制,进一步增强了Fortran语言的灵活性。例如:
TYPE point(k, n)
INTEGER, KIND :: k = KIND(0.0D0)
INTEGER, LEN :: n
REAL(KIND=k) :: x, y
CHARACTER(LEN=n) :: name
END TYPE
基于上面这样的参数化派生类型(Parameterized Derived Type),我们可以在定义对象时,根据需要指定对象的具体类型参数,也可以在程序运行期间,动态指定可分配内存对象的类型参数(Deferred Type Parameter)。
除了Fortran 90已经实现的重载(Overloading)机制以外,Fortran 2003还允许扩展类型覆盖(Overriding)基类型中的类型绑定过程。更重要的是,Fortran 2003通过抽象类型(Abstract Type)、延迟绑定(Deferred Binding)、多态实体(Polymorphic Entity)、类型选择结构(SELECT TYPE)等要素完整地实现了面向对象语言必备的多态机制。举例来说,我们可以声明下面这样的抽象类型:
TYPE, ABSTRACT :: point
REAL :: x, y
CONTAINS
PROCEDURE(testif), DEFERRED :: test
END TYPE
ABSTRACT INTERFACE
SUBROUTINE testif(p)
CLASS(point), INTENT(in) :: p
END SUBROUTINE
END INTERFACE
上述代码相当于在C++或Java语言中声明了一个抽象类,其中的test过程相当于C++语言中的一个纯虚函数,只有接口声明,而没有实现代码。在此基础上,我们可以从抽象类型point扩展出具体的子类型。
当某个对象的具体类型在运行时才能确定时,我们可以用CLASS关键字(这里的CLASS指的是一组有继承关系的类型,与C++中的class并不等同)定义一个具有多态功能的指针或可分配对象:
CLASS(point), POINTER :: p
现在,指针p可以指向任何由point扩展的具体类型的对象,这种使用方式已经和我们在C++中用基类指针引用派生类对象的做法一模一样了。使用这种具有多态性特征的实体时,我们还可以用Fortran 2003提供的内部过程SAME_TYPE_AS和EXTENDS_TYPE_OF来判定对象的类型,这是一种简单的运行时类型识别(RTTI)机制,其功能和C++语言中的typeid关键字相仿。
…… …… ……
4.高性能的Fortran
与其他科学计算语言或工具相比,Fortran语言在性能上历来是出类拔萃的。因为语言本身专门针对数值计算、矩阵处理等功能进行了优化,大多数Fortran编译器产生的可执行代码在效率上甚至会超过以高效著称的C或C++语言。为了在高性能的并行处理系统(如IBM的“深蓝”和我国的“曙光”)上获得更出色的执行效率,Fortran 95还特意吸收了HPF语言的优点,为Fortran语言增添了若干支持并行计算的语法特征(比如著名的FORALL语句和PURE过程)。
继续改进Fortran语言的计算性能当然也是Fortran 2003的任务之一。一个最明显的例子是,Fortran 2003引入了VOLATILE属性。这个属性类似于C语言或Java语言中的volatile关键字。编写过并发或实时应用的程序员都知道这个含义为“易变”的关键字的价值:在并发系统中,如果没有这个关键字的帮助,我们就必须时刻警惕共享数据的取值是否已被正确刷新。
不过,相对而言,Fortran语言本身的并行计算机制仍不算十分健全。编写并发或实时程序时,Ada语言中的任务(Task)管理和同步(Synchronization)机制,或是Java语言中的多线程同步特性都可以为程序员提供更有力的支持。
实际上,Fortran 95和Fortran 2003陆续引入并行语法的目的之一是消除标准Fortran语言与已经存在并得到广泛应用的各种Fortran语言变种之间的隔阂,允许同一份Fortran代码在不同的语言环境间移植。至少到Fortran 2003为止,标准Fortran语言还没有能力完全替代以HPF为代表的“高性能”Fortran语言变种。仅就适应高性能并行计算环境的能力而言, HPF等Fortran变种也仍有足够的理由继续存在和发展,直到未来某一个大而全的Fortran标准把它们真正统一起来为止。
为了适应现代CPU的时钟精度,Fortran 2003扩展了内部过程SYSTEM_CLOCK的功能,允许其COUNT_RATE参数为INTEGER或REAL类型。
…… …… ……
5.开放的Fortran
传统意义上的Fortran语言看上去并不那么开放,这恐怕和Fortran语言向来只注重科学计算,而忽视语言通用性的习惯有关。中国的Fortran用户最常抱怨的两件事情是:不同的Fortran编译器连接外部程序(如C语言程序或Matlab程序)的方法不尽相同,不同的Fortran编译器对中文的支持能力也强弱有别。人们迫切希望制定Fortran标准的专家们能体谅到最终用户的苦衷,尽早将Fortran纳入开放、规范的发展轨道。
在开放性方面,Fortran 2003为我们带来的第一个福音是,新标准终于规范了Fortran语言与C语言的连接方式。Fortran 2003提供了一个名为ISO_C_BINDING的内部模块,该模块定义了Fortran与C语言连接时必需的类型常量。引用了ISO_C_BINDING模块后,我们就可以……
…… …… ……
6.象牙塔里的Fortran
无论Fortran 2003多么强调面向对象、灵活和开放,Fortran语言在根本上仍然是一种面向科学计算的高级程序设计语言。
环顾一下四周,我们很容易发现,Fortran语言最常出现的地方也是科技创新最活跃、知识密集度最大的地方:在中科院大气物理研究所里,研究人员们正使用Fortran语言编写大气数据分析软件;在国家高性能计算中心里,Fortran语言正在新安装的曙光并行计算机上执行着各种科学计算任务;在一个又一个分子生物学、高能物理学、应用数学的国家重点实验室里,Fortran是研究者们最为倚重的工具之一;在相当数量的理工科学生的课程表中,Fortran是学生进入大学课堂后接触的第一门高级语言……
但正如本文开头那位博士生所说的那样,国内的Fortran语言应用多半还局限在Fortran 77的层面,大多数研究者仍在使用打孔卡片式的代码风格编写Fortran程序。这件事背后的潜台词是:一方面,Fortran 77已经可以满足大多数科研人员的需要,另一方面,科研人员不是专业的程序员,不可能有充足的时间学习新语言。在这种情况下,我们有什么理由让科研人员学习更复杂的面向对象语法并转向更强大的Fortran 95或Fortran 2003呢?
我个人觉得,Fortran 2003为所有Fortran用户带来的不仅是新鲜的语法特性,也是一种新的选择和机遇。
…… …… ……
7.明天的Fortran
根据JTC1/SC22/WG5工作组和NCITS/J3委员会的规划,2004年5月到2009年8月是下一代Fortran标准的酝酿、编撰和定稿时间。到了2010年时,Fortran语言会变成什么样呢?
在高级程序设计语言的发展史中,我们可以很容易地找出两种截然不同的语言风格。
第一种是LISP语言开创的“实验风格”,这种风格强调高级语言的语法逻辑应尽量服从计算机表达数据和操作的基本方式,以充分发挥计算机的“智慧”。例如,LISP语言中用“广义表”来统一描述代码和数据,以及Smalltalk语言用“对象-消息”这样的基本语法结构来实现面向对象机制的做法都是这种风格的完美体现。不幸的是,“实验风格”的语言尽管在表达能力和逻辑性上表现出色,但因为更接近电脑而不是更接近人,它们在与普通程序员的沟通上总显得力不从心,无法得到大多数程序员的认可。
第二种是Fortran语言开创的“实用风格”,这种风格强调高级语言的语法应尽可能接近人类的自然语言或特定领域(如科学计算)的思维习惯,以简化程序员的编码或维护工作,降低程序员的学习难度。直接受Fortran影响的BASIC语言,以及间接受Fortran影响的C、Pascal、Ada、C++、Java、C#语言都是这种风格的杰出代表。在现代软件产业中,“实用风格”的语言占据了绝对的优势,但随着软件规模的增大,它们也逐渐暴露出了灵活度不足、表达能力不强、与计算机交流不顺畅的弱点。
现在看来,“实验风格”和“实用风格”在一定程度上的相互融合、相互促进是未来程序设计语言发展的总体趋势。这一点可以从Python、Ruby等新生代脚本语言的蓬勃发展中见到一些端倪。
根据这样的判断,Fortran语言在未来的几年里,是不是也会向更灵活、更富有表达能力的“实验派”靠拢呢?也许是,也许不是。但无论如何,Fortran语言注重科学计算、注重执行效率的基本特征都不会改变,语言设计者们仍要在Fortran语言天生的“科学属性”与“现代化”改造的矛盾中谨慎前行——没办法,谁让Fortran语言生来就活脱脱是一个爱科学、讲科学、用科学的“动脑筋爷爷”呢?
分享到:
相关推荐
Fortran是一种古老的编程语言,但仍然广泛应用于科学计算、工程计算、高性能计算等领域。以下是一些Fortran资源: Fortran官方文档:Fortran官方文档(https://fortran-lang.org/)提供了语言标准、语法规则、函数...
Fortran 2003是Fortran语言的一个标准版本,正式名称为Fortran 2003,也经常被称为Fortran 03。它是Fortran语言发展的最新标准,包含了多种现代特性,旨在帮助程序员更高效地编写程序。 本手册《Fortran 2003 手册...
Fortran语言:经典与现代交织的编程之旅 在编程的星辰大海中,Fortran犹如一颗璀璨的恒星,闪烁着经典与现代交织的光芒。它不仅见证了计算机科学的辉煌历程,更在今天的科研与工程领域,扮演着举足轻重的角色。 你...
Fortran 2003是FORTRAN语言的一个重要版本,它在原有的FORTRAN 95基础上引入了许多新的特性和功能,极大地扩展了FORTRAN在现代科学计算和工程应用中的能力。FORTRAN,全称为“Formula Translation”,是一种面向数值...
随着版本的更新,从FORTRAN 77到Fortran 90、95、2003、2008直至最新的Fortran 2018,语言特性逐渐丰富,支持模块化编程、面向对象等现代编程概念。本章将介绍Fortran的基本结构、语法特点以及与其他编程语言的比较...
### Fortran 2003:重要特性及增强 #### 引言与概述 Fortran 2003 是在 Fortran 95 基础上的重大扩展,旨在为编程人员提供更强大的功能和更现代的语言特性。与 Fortran 95 相比,后者仅是对 Fortran 90 的小幅改进...
### Fortran 2003 编程指南关键知识点总结 #### 一、Fortran 语言简介 **Fortran**(Formula Translation)自1957年推出以来一直是科学计算领域的首选编程语言。最初设计目的是为了让程序员能够在大型计算机上轻松...
Fortran(全称:Formula Translation),是一种高级编程语言,最初设计用于数值计算和科学计算。它由IBM的约翰·巴克斯(John W. Backus)领导的团队在1957年开发,是最早的高级编程语言之一。Fortran语言以其在科学...
《现代 Fortran 解释》第三版对第二版进行了扩展。 第二版最后四章中包含的内容已合并到正文中,从而在 20 章中对 Fortran 2018 进行了全面、统一的描述。2023 标准现在带来的附加功能,大多是相对而言的 本质上是...
### Fortran 2003 Handbook - 关键知识点解析 #### 一、引言与历史背景 《Fortran 2003 手册》是一本全面介绍Fortran 2003语言标准的权威指南。该书由一组在Fortran领域具有深厚经验的作者编写而成,包括Jeanne C....
《Fortran 2003手册》是一本详尽阐述Fortran 2003语言标准的权威指南,由一群在Fortran编程领域拥有深厚经验的专家共同编写,包括Jeanne C. Adams、Walter S. Brainerd、Richard A. Hendrickson、Richard E. Maine、...
Fortran 95/2003是一种针对科学计算和工程应用优化的编程语言,它在数值计算领域具有广泛的应用。这个压缩包包含的资源——《Fortran 95/2003科学计算与工程》由宋叶志、茅永兴和赵秀杰三位专家编著,为学习和实践...
### Fortran 2003 Handbook - 关键知识点解析 #### 一、引言与历史背景 《Fortran 2003 手册》是一本全面介绍 Fortran 2003 的书籍,该标准是 Fortran 语言在进入 21 世纪后的最新版本。自 1957 年首次推出以来,...
Fortran是一种古老的编程语言,但因其在科学计算和数值处理领域的高效性,至今仍在许多科研和工程领域中广泛使用。这个压缩包包含了几个Fortran编写的源代码文件,主要用于实现数值算法和人工智能算法,这对于学习和...
Fortran,全称为Formula Translation,是一种历史悠久的编程语言,尤其在科学计算领域有着广泛的应用。Fortran77、Fortran90和Fortran95是其发展的不同阶段,每个版本都引入了新的特性以增强其功能和现代性。 ...
Fortran 95/2003是一种高级编程语言,主要应用于科学计算和工程领域,因其高效的数值处理能力而备受推崇。本资源是《Fortran 95_2003程序设计 第3版》的电子版,为学习者提供了深入理解和应用这一现代Fortran版本的...
Fortran编译程序出现问题怎么解决???_
Fortran2003是Fortran语言的一个重要版本,它在Fortran 95的基础上进行了一系列的扩展和改进。Fortran 2003的主要特点包括:面向对象编程的引入、模块的增强、支持Unicode字符集、支持异步I/O操作、对过程参数的增强...
《Fortran 2003编程指南》是一本非正式的、教程式的入门书,介绍了Fortran 2003(也被称为Fortran03)——Fortran最新标准版本中的最重要特性。 Fortran 2003标准的推出标志着Fortran语言的重大突破,特别是在面向...