C语言和Fortran语言
作者: 解放军信息工程大学理学院学员旅一队 温睿
目录
第1章. C++语言和Fortran语言的发展背景
第2章. C语言和Fortran语言的差异
2.1. 复数运算的速度.
2.2. 程序参数与字串.
2.3. 内存的动态管理.
2.4. 多维阵列的处理.
2.5. 函数调用与参数传递.
1. C++语言和Fortran语言的发展背景
在程序设计语言的发展过程中,FORTRAN 语言被认为是科学计算的专用语言。后来推出的FORTRAN90 和FORTRAN 95 版本也不例外,它们虽然可以完全实现C++语言同样的功能,然而其软件开发环境和软件的集成性等方面都远不如C++ 语言。近年来,随着计算机软硬件技术的发展,数据结构、数据库管理技术、可视化与计算机图形学、用户接口系统集成以及人工智能等领域的成果被逐渐应用到结构分析软件中,结构分析软件的设计并不仅仅局限于单一的科学计算需要涉及众多的软件开发领域。C++ 语言可以提供这类软件开发所需的功能,而用FORTRAN 90 却很难实现,另一方面从软件的编程环境来看,目前FORTRAN 90 的编译器极少,而C++ 语言的编译系统相当普及,可以运行在各种机型上,便于实现跨平台的软件系统集成。
2. C语言和Fortran语言的差异
由于两者产生的背景不同,它们是存在差异的,在比较了几组源代码之后,主要有以下体会:
C 最大的优点在于灵活,不但可以藉由 struct 来定义新的数据结构 ,同时 C 的pointer 更可以让我们自由而且有效率地处理大数据。而在 UNIX 系统 中,由于整个操作系统绝大部分就是 C 写出来的,故我们也有方便的 C 函数库, 直接使用系统资源与享受系统带来的服务,以做到一些低阶、快速的动作。而FORTRAN从一开始就用于科学计算,它与C的差异主要表现为:
* 复数运算的速度
* 程序参数与字串
* 内存的动态管理
* 多维阵列的处理
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)* 函数调用与参数传递
2.1. 复数运算的速度
在进行复数运算的时候,C++ 可以定义复数的 class,还可以重新定义所有的四则运算式,复杂的算式也可以做到由一个表达式来解决。但它的重新定义复数四则运算是用函数来做的,使用函数来调用其速度很慢,除非采用 inline function 的方式,但会遇到以下的问题:要先将这个算式拆解,分别算过后再重组结果,故表面上程序代码很简洁,但实际上是 compiler做了很多工作,还是要付出相当的计算时间代价的。
至于 Fortran,最大的优点在于复数 (complex number) 的运算,复数是 Fortran 的基本数据类型之一,这正是 C 所缺乏的 (C 基本上只有实型与整型类型而已)。 虽然C 也可以由 struct 的定义,达到复数四则运算的目的,但 却很可能牺牲了程序效能,或者是程序写起来相当繁杂降低可读性。因此,在大量而且要求高速的复数运算场合, Fortran 实际上比 C 还要适合。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)然而既然复数已是 Fortran 基本数据类型之一,则 Fortran compiler在设计上可以做到对复数特别的 optimization,例如如果遇到较短的复数运算式,它可以用“心算” 直接得出 real_part 与 imag_part 的 expression,像这样:
real(a) =……;imag(a) = …….
如此只需两步就得到结果。直到遇到太长太复杂的算式,才去做拆解的动作。
这样使用 C 来做复数运算可能需要绕圈圈,而且绕出来的圈圈可能还不小。不过如果程序中需要复合的数据结构,如一个自定义的数据结构中既有浮点数、整数、还有字符串时, Fortran 只有举白旗投降了。当然, Fortran 如果要做还是可以做,只是不太方便,而且可能也需要绕圈圈。但如果使用 Fortran 90 则不成问题了,因为 Fortran 90 也有类似 C 的 struct 结构以定义复合的数据类型。
2.2. 程序参数与字串
C 程序可以有参数串列, Fortran 则没有。例如,当程序执 行时,必须输入 a, b, c
三个参数,在 C 可以这样写:
int main(int argc, char **argv) { int a, b, c; a = atoi(argv[1]); b = atoi(argv[2]); c = atoi(argv[3]); }
而程序执行时,参数就是这样传入: a.out 12 15 18
Fortran 却没有办法 ,要传入任何参数,只能透过对话的方式:
integer a, b, c c ------------------------------------ write(*,*) ''please input integer a:'' read(*,*) a write(*,*) ''please input integer b:'' read(*,*) b write(*,*) ''ple