以下的内容不错,转发给大家!(原作者是王咏刚)

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模块后,我们就可以将Fortran变量定义成与C语言数据结构兼容的数据类型:

REAL(C_FLOAT), DIMENSION(100) :: ALPHA
或者利用C_PTR、C_FUNPTR类型与C语言中的指针或函数指针交互操作:

TYPE(C_PTR) :: BETA
IF (.NOT. C_ASSOCIATED(BETA)) THEN
    BETA = C_LOC(ALPHA)
END IF
对于下面这样的C语言函数:

int foo(void* buf, int count, int *ret)
它对应的Fortran函数接口是:

INTERFACE
    INTEGER (C_INT) FUNCTION foo &
    (buf, count, ret), BIND(C, NAME='foo')
        USE ISO_C_BINDING
        TYPE (C_PTR), VALUE :: buf
        INTEGER (C_INT), VALUE :: count
        TYPE (C_PTR), VALUE :: ret
    END FUNCTION
END INTERFACE
这样,C语言和Fortran语言就可以通过上述接口相互调用。当Fortran语言和C语言之间拥有了统一的连接方式后,Fortran语言与其他语言之间的连接也就不再是困难重重的事了。借助ISO_C_BINDING模块,Fortran语言可以直接(在二进制层面连接)或间接(以C语言为媒介)地与Delphi、C++、Ada、Java、C#等我们常见的通用编程语言交流、沟通。

在国际化方面,Fortran 90已经为Fortran引入了不少国际化支持功能。Fortran 2003则全面支持ISO 10646标准,可以正确处理双字节或四字节的国际字符集。Fortran 2003程序可以通过SELECTED_CHAR_KIND内部过程指明字符数据的编码方式;打开文件时,可以在OPEN语句内利用ENCODING=’UTF-8’或类似的方式指明文件内字符的编码;可以在读写文件时完成ASCII、ISO 10646、UTF-8之间的转换;Fortran 2003代码本身的字符集,以及标识符和字符串常量的长度范围也有所扩充。

另一个和开放性相关的新特性是Fortran 2003对流I/O(Stream Access Input/Output)的支持。作为一种以科学计算为目的的语言,传统的Fortran只提供了读写以记录为单位的外部文件的语法。在单纯的科学计算任务里,这种简单的I/O功能也许可以满足文件读写的需要,但当我们希望Fortran程序和外部应用交换数据的时候,有时就不得不面对如何读取没有固定记录结构的字节流数据的问题了。在Fortran 2003发布以前,我们只能通过编译器提供的扩展功能解决问题。现在,我们可以用标准的方式,在Fortran语言中随机访问外部文件的字节数据。应当说,直到Fortran 2003,Fortran语言才拥有了与C语言的I/O库大致相仿的I/O功能,才在I/O领域具备了通用语言的基本特征。

当我们在C语言中通过main函数的argc和argv参数获取命令行参数的时候,也许我们不会想到,在传统的Fortran语言中,要完成类似的任务,Fortran用户也必须求助于编译器提供的扩展功能。Fortran 2003显著增强了Fortran语言与外部环境的沟通能力。新引入的内部模块ISO_FORTRAN_ENV拥有INPUT_UNIT、OUTPUT_UNIT、ERROR_UNIT这一组对应于标准输入输出的常量(相当于C语言里的stdin、stdout和stderr),拥有GET_COMMAND、GET_COMMAND_ARGUMENT等获取命令行指令,以及GET_ENVIRONMENT_VARIABLE等访问环境变量或系统参数的内部过程。这些都是Fortran语言走向开放的重要标志。

6. 象牙塔里的Fortran
无论Fortran 2003多么强调面向对象、灵活和开放,Fortran语言在根本上仍然是一种面向科学计算的高级程序设计语言。

环顾一下四周,我们很容易发现,Fortran语言最常出现的地方也是科技创新最活跃、知识密集度最大的地方:在中科院大气物理研究所里,研究人员们正使用Fortran语言编写大气数据分析软件;在国家高性能计算中心里,Fortran语言正在新安装的曙光并行计算机上执行着各种科学计算任务;在一个又一个分子生物学、高能物理学、应用数学的国家重点实验室里,Fortran是研究者们最为倚重的工具之一;在相当数量的理工科学生的课程表中,Fortran是学生进入大学课堂后接触的第一门高级语言……

但正如本文开头那位博士生所说的那样,国内的Fortran语言应用多半还局限在Fortran 77的层面,大多数研究者仍在使用打孔卡片式的代码风格编写Fortran程序。这件事背后的潜台词是:一方面,Fortran 77已经可以满足大多数科研人员的需要,另一方面,科研人员不是专业的程序员,不可能有充足的时间学习新语言。在这种情况下,我们有什么理由让科研人员学习更复杂的面向对象语法并转向更强大的Fortran 95或Fortran 2003呢?

我个人觉得,Fortran 2003为所有Fortran用户带来的不仅是新鲜的语法特性,也是一种新的选择和机遇。

对于利用Fortran语言开发商业软件包的公司(国内这类公司较少,但国外有相当数量的软件公司在开发和销售用Fortran语言开发的工具或程序库)而言,Fortran 2003提供的面向对象机制和开放性可以帮助他们优化大型软件的开发过程,提高软件的复用率,降低开发成本。

对于将Fortran视为工具的科研人员来说,Fortran 2003既为我们提供了一种更自由的编程环境,也为我们提供了足够的向前兼容的保证——除了极少数“过时”或“危险”的语法特性被删除以外,Fortran 2003保持了与Fortran 77/90/95等语言版本的全面兼容。也就是说,你完全可以在Fortran 2003的环境中,一边编写你熟悉的Fortran 77代码,一边体验新的功能特性,直到你在不知不觉间喜欢上Fortran 2003为止。

对于理工科的学生来说,Fortran 2003也没有理由被拒之门外。与老旧、呆板的Fortran 77相比,Fortran 2003的语法更现代,更容易掌握;与C++、Java、Pascal等通用语言相比,Fortran 2003中强大的数据处理和矩阵运算功能显然可以帮我们节省许多开发时间;与Mathematica、Matlab、Macsyma,Mathcad等更“高级”的数学工具相比,Fortran 2003尽管在便捷性和可视化程度上略显不足,但Fortran语言编译后的执行效率却是这些工具软件难以企及的。

客观地说,Fortran 2003是一种在各方面都趋于“完美”的科学计算语言,是Fortran语言走向“现代化”的重要标志;不过,这种现代化改造大都是以Ada、C++、Java等现代主流程序设计语言为参照进行的,它们是否能与Fortran语言重视科学计算的初衷相适应,是否能赢得大多数科研人员的认可,还需要经过时间的检验——至少,我们应当等到HP(Compaq)、IBM、Salford、Intel、Fujitsu等主要的Fortran工具提供商推出了支持Fortran 2003的新版编译器,等到用Fortran 2003实现的程序库和应用系统越来越多的时候,再对Fortran 2003的表现做一个中肯的评价。

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语言生来就活脱脱是一个爱科学、讲科学、用科学的“动脑筋爷爷”呢?



[em12]