在截至2020年9月的TIBOE编程语言兵器谱排名中,C语言仍然稳坐兵器谱排名第一位,Java屈居第二,Python排到第三。放眼到前20名之内,早已经没有了FORTRAN语言的身影。在大约30年前,FORTRAN也是曾经风靡一时的开发语言之一,用它开发的数值计算软件数不胜数。虽然时至今日,它已经风光不在,淡出了主流编程开发工具的江湖,但是,由于它天生的一些优异特质,使得它仍然活跃在数值计算软件开发的领域内。
本次排名老大C语言可以说是天生神力且能力非凡,40年几经沉浮如今仍然屹立潮头。开发人员用C语言开发了编译C语言的编译器(这是个非常有意思的话题,以后有机会再详细说),还开发了Java、Python这样的流行语言,可以说,排名前20名中大部分都是用C开发出来的。而FORTRAN在架构上和C语言有诸多类似的地方,从整型数到字符串,FORTRAN和C中存储变量的方式几乎一致,简单直接,这就意味着FORTRAN和C一样,具有贴近系统的优势,FORTRAN编译器和C编译器编译的程序,运行效率非常高。在这一点上,很多语言是无法追赶的。
FORTRAN的发展路线逐渐设定为解决科学计算问题。进行线性代数计算,加上它的数据存储方式简洁,FORTRAN的很多特性都变得有利于进行数组操作。例如FORTRAN中可以定义一个数组A,它包含100个数据,直接使用A=0就可以把这个数据全部数据设置为0,而同样的方式要在C语言中,语言使用循环赋值或者重载运算符来搞定。从本质上来说,这样的数组操作就是对连续内存区域进行操作,非常直接。这样类似的特性就决定了FORTRAN编译器可以充分利用CPU的一些特性进行编译。以INTEL的FORTRAN编译器为例,它可以针对CPU支持的各种辅助指令集进行编译优化,例如SIMD、VAX等等,从程序开发的基础上就开始加速。FORTRAN和C的混合编程也是契合度最高的。用FORTRAN编写的计算库可以很轻松的在C中调用。现在很多AI算法库在求解线性方程组时还在调用FORTRAN编写的BLAS库(基本线性算法库)。著名的LAPACK底层就是用FORTRAN写的,很多后来用其他语言编写的算法库都参考了它的FORTRAN代码,有些干脆就是把FORTRAN代码翻译成其他语言而已。
当然,FORTRAN也有它的不少弱点。虽然从FORTRAN90开始,到后来的FORTRAN2003等等后续版本都试图将FORTRAN中加上很多其他语言的特性,例如扩展FORTRAN语言格式的限制、增加FORTRAN定义“类”的能力(这个特性和C语言中用指针来模拟C++中的类很类似)等等。这些扩展并没有为FORTRAN增加太多的活力。自从像WINDOWS这样的视窗系统开始流行,用户对用户界面开发的要求逐渐增多,FORTRAN的受众越来越少,毕竟普通用户没有那么多的场合需要进行数值计算程序的开发。
油气藏数值模拟器的核心是处理数组、向量和方程,进行各种线性代数计算,求解方程组,等等,所以非常适合使用FORTRAN编写核心程序。而且如果用FORTRAN语言作为伪代码来描述一套算法,写成的伪代码几乎可以直接转换为可编译的真实代码,同时FORTRAN语言也很简洁,不需要像C语言一样写那么多括号和分号。对于FORTRAN不能很好处理的情况,例如有一些数据管理方面的处理可以使用高级语言如C++进行开发。即便是后期利用其他语言的优势进行一些组合优化,FORTRAN代码的原始特性也保证它能够方便的改造成其他语言。MONIX油藏数值模拟器采用了混合语言编程的方式实现。算法部分大多交给FORTRAN,FORTRAN无法实现的地方由C来实现,充分的利用两种语言的优势,达到提高开发效率和运算效率的目的。