Fortran Coder

查看: 4076|回复: 3
打印 上一主题 下一主题

[闲聊] 面向对象Fortran的到来(1)——《程序员》

[复制链接]

13

帖子

9

主题

0

精华

入门

F 币
75 元
贡献
52 点
跳转到指定楼层
楼主
发表于 2016-3-3 21:21:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhangzhipeng 于 2016-9-1 09:54 编辑

1. 不断变革的Fortran
2004年5月,Fortran 2003,这个新世纪里诞生的Fortran语言新标准,终于在ISO、IEC的联合工作组JTC1/SC22/WG5以及美国Fortran委员会 NCITS/J3的共同努力下,走完了编撰、修订的最后一步。不出意外的话,再过一两年,支持Fortran 2003的[url=]开发[/url]工具就会充斥Fortran世界;那些仍在坚守Fortran 77阵地的老用户们也会自然而然地把质疑的目光从Fortran 90/95投向更富有革命精神的Fortran 2003。
要了解Fortran 2003,我们有必要先简单回顾一下Fortran语言的[url=]历史[/url]
1954到1957年间,世界上第一种高级程序设计[url=]语言[/url]——Fortran诞生于IBM公司。Fortran这个名字的原意是IBM Mathematical FORmula TRANslation,其设计目的在于为科研人员提供一种符合[url=]数学[/url]思维习惯的高级语言,以满足[url=]科学[/url]计算的需要。1960年代,在美苏太空竞赛的大背景下,在国防、教育和科研领域对高性能计算工具的迫切需求下,Fortran语言蓬勃发展,成为了当时统治计算机世界的高级语言之王。
1962年,为了统一不同公司、不同硬件平台上的Fortran语言,人们开始了Fortran语言标准化的尝试,这也是程序设计语言发展史上的第一次标准化历程。1972年,Fortran 66标准(标准编号来自标准草案的制定时间)正式发布。但因为标准文档过于简单,约束力不强,Fortran 66标准发布后,Fortran语言的统一问题并没有得到彻底解决。
1978年,Fortran语言标准的第一个修订版本正式发布,这就是我们熟悉的Fortran 77了。Fortran 77细致描述了Fortran语言的各种特征,让Fortran成了一种真正规范、高效和强大的结构化程序设计语言。此后,无数性能优异的Fortran 77编译器和开发工具的问世更是让Fortran 77成为了几乎所有理工科学生的必修课。
尽管Fortran 77的影响力一直延续到了今天,但Fortran语言不断变革的历程却从未停止过。为了改变Fortran 77那种老旧的、从打孔卡片遗传来的语言风格,为了给Fortran注入更多的现代特征,人们于1991年发布了崭新的Fortran 90标准。除了自由的代码风格外,Fortran 90还为Fortran语言引入了模块、接口、自定义(派生)数据类型和运算符、可动态分配和参与复杂运算的数组、泛型过程、指针、递归等重要的语法特征。这不但使结构化的Fortran语言更趋完善,也使其具备了少量的面向对象特性。
1997年发布的Fortran 95标准在Fortran 90的基础上,吸收了HPF语言(High Performance Fortran,Fortran语言在并行环境下的一个变种)的优点,提高了Fortran语言在并行任务中的表达和计算能力,并进一步完善了派生类型、指针、数组等要素的相关语法。
以Fortran 66为基准,我们可以把后续的Fortran 77/90/95以及本文介绍的Fortran 2003均视为对Fortran语言标准的修订。在历次修订中,Fortran 77和Fortran 95是修订幅度相对较小的版本,而Fortran 90和Fortran 2003则是锐意变革的“大修”版本。如果说Fortran 90是在“形式”上让Fortran脱胎换骨的话,那么,Fortran 2003就近乎彻底地解决了Fortran语言[url=]现代化[/url]的问题:完整的面向对象机制、灵活的语法特征、统一的接口标准……这些难道还不足以让Fortran 迷们跃跃欲试吗?



分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

13

帖子

9

主题

0

精华

入门

F 币
75 元
贡献
52 点
沙发
 楼主| 发表于 2016-3-3 21:25:06 | 只看该作者

面向对象Fortran的到来(2)《程序员》

本帖最后由 zhangzhipeng 于 2016-9-1 09:54 编辑

2. 面向对象的Fortran

从结构化程序设计到面向对象,这是大多数高级语言的发展、演变规律,Fortran也未能免俗。在Fortran 77中,由于缺乏对数据抽象和数据封装的基本支持,人们很难引入面向对象的理念和方法。在Fortran 90/95中,尽管我们可以用派生类型(Derived Type)和模块(Module)模拟一部分面向对象的特性,但却无法实现真正意义上的封装和继承。

对数据和相关操作的封装是面向对象的基础。传统的结构化程序设计语言大多拥有简单的数据封装能力(如Pascal语言中的record),但缺乏对操作封装的支持。当我们为结构化程序设计语言引入面向对象机制时,在语法层面一般有两种思路:一种是引入一个全新的语法容器,允许用户借助该容器定义出封装了数据和操作的统一数据类型,例如,C++在C语言的基础上扩展出了class的概念,并以class为中心支持面向对象[url=]编程[/url];另一种是通过某种机制,将原有的数据封装容器和表述操作的过程或函数捏合在一起,例如,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属性改变对象实例参数在过程参数表中的位置。

Fortran 90/95已经允许用户自定义运算符过程。现在,Fortran 2003则进一步允许用户将运算符过程绑定到特定的类型,其方法和绑定普通过程类似:

TYPE point
REAL :: x, y
CONTAINS
GENERIC :: OPERATOR(+) => plus
GENERIC :: ASSIGNMENT(=) => assign
END TYPE

有了完善的数据和操作封装机制,Fortran 90/95中简单的访问权限控制属性——PRIVATE和PUBLIC就不能满足要求了。Fortran 2003扩展了PRIVATE和PUBLIC的使用范围,允许PRIVATE类型中出现PUBLIC成员,同时又增加了PROTECTED属性,以限定某个成员的取值只能由自己所属的模块修改。

Fortran 2003增强了派生类型的初始化和构造语法。尽管我们在Fortran 2003中还不能像在C++里那样随心所欲地定义各种构造函数,但仍可以较精确地控制对象的初始化过程。此外,Fortran 2003允许我们为类型定义终结子例程(Final Subroutine),以完成对象销毁时的清理工作。终结子例程可以定义多个,像这样:

TYPE point
REAL :: x, y
CONTAINS
FINAL :: finish1, finish2
END TYPE

在Fortran 2003中,继承机制是通过类型扩展(Type Extension)实现的。相关的语法和大多数面向对象语言的继承机制没有什么不同:

TYPE, EXTENDS(point) :: funny_point
LOGICAL :: funny = .TRUE.
END TYPE

在扩展类型中,可以直接通过基类型的名称来引用基类型的成员,这类似于C++中引用基类成员的语法。

单从封装和继承这两个层面看来,Fortran 2003对Fortran 90/95的扩展就是革命性的。当年,Fortran 90刚问世的时候,许多人迫不及待地宣称Fortran已经是面向对象的语言了。殊不知,Fortran 90/95中的面向对象机制还不如Visual Basic 6.0中的类模块(Class Module)来得成熟,更不要说与真正面向对象的Fortran 2003相提并论了。



13

帖子

9

主题

0

精华

入门

F 币
75 元
贡献
52 点
板凳
 楼主| 发表于 2016-3-3 21:34:15 | 只看该作者

fortran做界面

本帖最后由 zhangzhipeng 于 2016-9-1 09:54 编辑

在刚接触Fortran时便担心,因为其虽在数值计算方面有得天独厚的优势,但却普及甚低,都只是实验室中,已经绝顶的老科学家们在敲敲打打着使用,会不会走到灭绝的地步。担心的原因更包括其在制作界面,以及软件包方面的缺陷,而缺乏美观。但综合而言,最大的缺陷,还在于Fortran语言的陈旧过时,面向对象终将统治世界,在C++与Java的凯歌高奏之下,Fortran也只能做没落贵族了。

但最近发现Fortran2003的终极革命,让我兴奋不已。虽然像我这种土人,最近才发现这一改革的重要性,但秉承真理至上的原则。还是将这篇文章贴出来,以便对Fortran的再次兴旺做出促进,并期待权威兼容Fortran2003编译器的早日到来,为Fortran再次君临天下,做好全部的准备。

47

帖子

3

主题

0

精华

大师

F 币
1634 元
贡献
119 点

规矩勋章

地板
发表于 2017-7-15 17:33:42 | 只看该作者
Fortran2003 2008 什么的都引入些新特性,也不断在向面向对象的思路靠拢,但我个人感觉Fortran的优势还是在于计算,比如说到搭各种接口、继承各种属性,我用Python之类很省心的语言做调用多好~或者再向低层靠拢些,用C++之类,为什么偏要用Fortran来做呢?
我觉着这也是现在很多地方不用Fortran的一个原因吧,纵使后续的设计逐步增添了这些功能,但明显比不上一些本来在发展时就有次想法的各种后起之秀
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-25 16:19

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表