标签:
杂谈 |
原文作者 冼镜光, 微电脑传真第18卷第8期, 1999年8月
出于搜藏阅读的目的,我转载了此文,如果您认为侵害了您的知识产权,请立即联系blog作者。
谈Fortran 90/95
请不要认为世上只有 C/C++ 与 Java
一个好的程式员应该知道其它语言的存在了解各个语言的特色
这是什么时代了,还要谈Fortran ?
你或许会问我有没有搞错。不,我没有搞错,我真的是要谈Fortran。人总是喜欢一窝蜂赶时髦的。1980 年代末期,大家不学C
就对不起自己,老是把用Pascal 的人看成老古董;但没多久,C++跑出来了,很多人C 还没学完就去玩 C++;但是,C++
也没风光多久,Java 出来了,于是大家一起转向,投奔
Java。这是不是好现象且不去谈它,但我所见到的事实就是很多半瓶水的程式员,每一套语言都会,但却都不精。
不过,有两群程式员,依我的感觉,很少改变他们的语言,他们是COBOL与
FORTRAN。近几年来,COBOL 程式员慢慢成为稀有动物,当Y2K 问题出现之后,COBOL
程式员身价之高很今人羡慕。Fortran 程式员倒是慢慢集中到科技界,特别是计算科学 (Computational Science)
的工业上头。因为计算机系差不多都不教 Fortran
了,很多人都是工程出身的,但很不幸的是,工程界或科学界不少人,却渐渐受到计算机科班出身的影响,总认为 C++ 是万能,用 C++
也一样能解决计算科学的问题,甚至于有人还认为 Java 也行!我想这有好几个因素。
第一,很多科班出身的也许根本就搞不懂计算科学是怎么回事,自己用习惯了 C/C++
就认为世界上其它程式写作差不多就是如此,当然 C/C++ 就可以做 Fortran 或 COBOL 所做的事;换言之,他们相信
C/C++ 万能(其实,任一时刻都有一帮人认为当时流行的语言都是万能的)。
第二,很多人在比较两套语言时,通常都是在比较语言的语法(syntax)。例如说,C/C++
中有个for,Fortran 中有个DO;C/C++ 中有陈列,Fortran中有陈列;C/C++
中有指标可以自由运用,Fortran 中的指标不如C/C++
有威力等等。我不能说这种比较不对(至少,这也是一种比较的方式)。但是这种比较有失准头,且用这种方法比较语言是不公平的。COBOL
是设计来做资料处理的,我看不出 C++ 有多大能耐会比 COBOL 好,固然COBOL 有的C++ 也差不多都有,没有的也可以用
Class 造出来,但这并不意味着 C++ 会比 COBOL 好。
同样的道理,Fortran 有 C++ 没有的部分(好比说阵列处理) ,大多数也都可以用
C++ 来模拟,但是这种模拟充其量是在语法层面,要模拟语意(semantic)
层面就难很多了。但程式的语意,以及对语法的设计方式,常常是使该语言有特殊功用的精微所在,很难相互模拟的。Fortran
的指标就是一例;Fortran
语言上的设计就是要简单,使得编译程式可以尽可能地进行最佳化,因而指标的运用(这是使程式不能有效地最佳化的阻力)
就得相对地简单而且有限制。就这一点而言,它可以使 Fortran
写成的程式,在执行时可以快很多。所以,在比较两套语言时,若不能考虑到当初设计这套语言的原意,那么做出来的比较就失去意义了。
我们常指出 Fortran
没有这没有那,一下就否定了它的功能、威力、甚至于存在价值,这又是失去准头的做法。试想想从1950年代未到1990年代末,40年下来有多少程式是用
Fortran 写成的,大多数这些 Fortran 程式也还在使用呢!40年前,就说是20年前好了,那有 oo (object
oriented) 呢?程式员不也做出了辉煌的成绩了吗?用这一点来批评一套老语言是有失厚道的。
话又说回来,这也正是 Fortran 的致命伤。从 Fortran 66 ,到 Fortran
77, 或Fortran 90/95,Fortran 的标准委员会的动作老是比时代的脚步慢半拍。好比说,在订定 Fortran 77
的标准时,while 回圈就已经流行了。经过大家建议,委员会也把DO WHILE 加了进去,但却在最后一刻把DO WHILE
从标准中剔除。在订定 Fortran 90 时,oo 技术也差不多成熟了(Ada 在1983年就有object-based
的功能),但在 Fortran 的标准中硬是没有任何的的功能。如果我们把 Fortran , C , C++
的发展时间放在一起,就会看出一些为什么Fortran会被挤到一边的端倪。
Fortran 77 推出时,Pascal 与 Modula 正在流行,但 Fortran
77 却不很「先进」(与 Pascal,PL/1,Modula 相比较),但当然比 Fortran 66
好,遗憾的是在那个时候,常用的功能(DO WHIEL,NAMELIST)却被排除在标准之外。接着1983年我们有
Ada83,这个语言除了大之外,各项功能又比 Fortran 77 先进。1980年代,当人们不习惯用大语言,又觉得 Pascal
太小而不足以应付大型程式设计时,C 的流正好补上这个空档。 C 是不是个好语言是个见仁见智的问题,当然 C
并不是一套好的的数值计算用语言似乎是没太多疑问的。但是 Fortran 却在原地踏步,于是当 C
流行起来之后,很多数值应用的软体(MatLab) 都用了 C 的语法,对 Fortran 真是雪上加霜。
90年代初,C++ 开始风行,Fortran 90 标准出现,但却少了
oo。你看Fortran 不都正好落后其它语言一步吗?不过Fortran 9 0这一套就 Fortran 77
做了极大改进的标准却走相当远,它不很计较与其它语言的比较,而是走回到使用 Fortran
语言的根,着重在如何可以使计算用的程式写作更简单可靠,如何可以使阵列处理能力大增,特别是考虑到平行计算的能力。所以,Fortran
仍然是目前唯一最有威力的数值计算语言;固然有很多可以用C++ 的 oo 能力造出来,但是在 Fortran
中这些都是内建功能,在编译最佳化上头就比较做得好而且也很彻底,这就是为什么数值计算上 Fortran
速度总是占上风的理由。
Fortran 90 在1995年做了局部性改良,也在指标使用上的做了很重要的修饰,这就是
Fortran 95 。Fortran 标准委员会,打算在2002年推出 Fortran 2002,其中最重要的新功能就是 oo
与它的相关能力。
或许你会想学 Fortran,却苦于找不到 Fortran 90
编译程式,这一点在近两三年已经不是问题了,因为至少有三个 Fortran 90 编译程式是免费的。第一个就是Lahey 公司的 ELF
(Essential Lachey Fortran) ,你可以在http://www.lahey.com中找到它。它是个
Fortran 90/95 标准的程式,但是ELF 中去掉了一些比较不常用,很复杂的功能;再者,为了让用 ELF
的朋友写作结构良好的程式,它强迫你写作满足某些规格的程式。这并非是个问题,我是很赞成这样做,你用了 ELF
就知道为什么。请注意,ELF 只能在Windows 95/98/NT 之下作业。若想有个完整 Fortran 90/95
编译程式,不妨试试 Lahey的Lahey LF95 Express。
在 Linux 上的情况比较好,目前它已经有了免费的 Fortran 77 编译程式,叫做
g77。要用 Fortran 90 有两条路,第一是用一套叫做 F 的语言。与 ELF
一样,去掉了很多不必要的功能,也强制用户写作的好格局 Fortran 程式,你可在下面的网址抄录免费的 Linux 版
F: http://www.fortran.com/fortran。
Pasific-Sierra Research 公司最近也提供了一个 Linux 用的完整 Fortran 90 编译程式,在http://www.psrv.com,这个叫做 VAST/F90 的 Fortran 90 编译程式,也是免费的,也少了一些功能,但对初学者而言,这些少掉了的功能根本不会有什么影响。这也是个 Linux 用的编译程式,却不是个完整的编译系统。
VAST/F90 把你的 Fortran 90 程式翻译成 Fortran 77,再由 Linux 上的g77 翻译成机器语言,所以你的 Linux 系统上必须有 g77,版本多号码至少要是 0.5.21 以上。Pasific-Sierra Research 还有其它有趣的 Fortran 90 产品,例如说支援在Linux 下双处理器的HPF (High Performance Fortran) ,这也免费的。
如果你想要知道Fortran 的功能与其它资讯,你不妨试试http://www.fortran.com (Fortran Market) 与http://www.fortranlib.com (Fortran Link) 。
Pasific-Sierra Research 公司最近也提供了一个 Linux 用的完整 Fortran 90 编译程式,在http://www.psrv.com,这个叫做 VAST/F90 的 Fortran 90 编译程式,也是免费的,也少了一些功能,但对初学者而言,这些少掉了的功能根本不会有什么影响。这也是个 Linux 用的编译程式,却不是个完整的编译系统。
VAST/F90 把你的 Fortran 90 程式翻译成 Fortran 77,再由 Linux 上的g77 翻译成机器语言,所以你的 Linux 系统上必须有 g77,版本多号码至少要是 0.5.21 以上。Pasific-Sierra Research 还有其它有趣的 Fortran 90 产品,例如说支援在Linux 下双处理器的HPF (High Performance Fortran) ,这也免费的。
如果你想要知道Fortran 的功能与其它资讯,你不妨试试http://www.fortran.com (Fortran Market) 与http://www.fortranlib.com (Fortran Link) 。
闲话也说得多了,言归正传。正因为Fortran 90/95 是一个最好语言之在可能的情况下也与
C/C++ 做个比较。我的希望是,请不要认为世上只有C/C++ 与
Java,一个好的程式员应该知道其它语言的存在,了解各个语言的特色,这样才能为你的计划选用一套合的语言。在这一篇,我打算从
Fortran 的最基本的观念谈起。

加载中…