C与FORTRAN的差别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/c.htm
2. C语言和Fortran语言的差异
由于两者产生的背景不同,它们是存在差异的,在比较了几组源代码之后,主要有以下体会:
C 最大的优点在于灵活,不但可以藉由 struct 来定义新的数据结构,同时 C 的pointer 更可以让我们自由而且有效率地处理大数据。而在 UNIX 系统中,由于整个操作系统绝大部分就是 C 写出来的,故我们也有方便的 C 函数库,直接使用系统资源与享受系统带来的服务,以做到一些低阶、快速的动作。而FORTRAN从一开始就用于科学计算,它与C的差异主要表现为:
* 复数运算的速度
* 程序参数与字串
* 内存的动态管理
* 多维阵列的处理
* 函数调用与参数传递
2.1. 复数运算的速度
在进行复数运算的时候,C++ 可以定义复数的 class,还可以重新定义所有的四则运算式,复杂的算式也可以做到由一个表达式来解决。但它的重新定义复数四则运算是用函数来做的,使用函数来调用其速度很慢,除非采用 inline function 的方式,但会遇到以
下的问题:要先将这个算式拆解,分别算过后再重组结果,故表面上程序代码很简洁,但实际上是 compiler做了很多工作,还是要付出相当的计算时间代价的。
至于 Fortran,最大的优点在于复数 (complex number) 的运算,复数是 Fortran 的基本数据类型之一,这正是 C 所缺乏的 (C 基本上只有实型与整型类型而已)。虽然C 也可以由 struct 的定义,达到复数四则运算的目的,但却很可能牺牲了程序效能,或者是程序写起来相当繁杂降低可读性。因此,在大量而且要求高速的复数运算场合, Fortran 实际上比 C 还要适合。
然而既然复数已是 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(*,*) ''please input integer c:''
read(*,*) c
c ------------------------------------
end
2.3. 内存的动态管理
C 可以动态分配存储空间给任何数据类型,而Fortran 却不行。
例如:
float *c_function(int cnt)
{
float *a;
a = malloc(sizeof(float) * cnt);
/*
* 操作 array a.
*/
return a;
}
而且如果在程序执行过程中,如果不再需要这个 array a 了,还可以随时释放a
所占用的存储空间。而 Fortran 在一般情况下是不行的,因此在一般的 Fortran 程序中,常见所有需要用的 array, 都是在 MAIN__里头就配置好记存储空间,再一个个传入subroutine 里头来用,例如:
program fout
c ----------------------------
integer cnt
parameter (cnt^P00)
real a(cnt)
call f_routine(cnt, a)
end
c ----------------------------
subroutine f_routine(cnt, a)
c ----------------------------
integer cnt
real a(cnt)
c
c 操作 array a.
c
end
这里的 parameter 是设定变数的固定值,其作用就相当于 C 的 const 一样,经设定后的参数就是一个无法改变其值的常数了。有的时候,在某个函数中我们临时需要一个暂存阵列,但等到计算完成离开函数后,该阵列就没有用了,这在 C 可以做的很划算,即进入函数时malloc() 一个阵列,离开前再 free() 掉它。但在 Fortran 中却别无选择,一定要在 MAIN__ 里头先将暂存阵列配置好,再一起传入 subroutine 中。