在我理解中,make是一个很好的软件项目管理及维护的自动化工具,我们要进行的Fortran程序设计自然也在其中。她协助你将一系列繁琐的编译管理工作给一次性设计好,然后封装为单独的一个文本文件叫makefile,makefile文件描述代码文件之间的依赖关系,决定他们应该何时以什么编译器编译,如何协调不同的代码版本,等等等等。几乎所有的大型软件工程,都在用makefile来维护,任何一个IDE背后都有一个make。就如微软的VS,看似彻头彻尾的图形界面,独立的项目管理,其背后,实际也只是一个nmake程序 + makefile文件。所谓的Visual Studio,不过是把makefile文件里的语句给可视化了而已。
make的功能非常非常强大,对于小程序来说,make不是必需,但只要你代码上了一万行,分了模块、分了文件,那么,你就只能选择make,除非你想承受没完没了的手工维护之苦。大规模的程序开发��make来维护,——这在学术界、工业界已经是惯例了。我接触过宇宙学上著名的Fortran程序:CosmoMC,她就是用make来维护的。
make也有不少版本,我推荐的自然是linux下最常用的GNU make。不需安装,任何linux发行版必然自带,要学的只是该怎么写makefile文件。关于make的资料非常丰富,网上一搜就一大把;中文的教材方面,我用的是《GNU make项目管理 第三版》也是绝版书,在淘宝上有复印版可买到。
4)Complier
linux下的Fortran编译器很丰富,而且几乎都是免费的。下面网址中的都列举得差不多了。另外还有IBM公司的xlfortran,口碑非常好,似乎是第一个完整实现fortran2003标准的编译器,但可惜只支持基于IBM自己的powerpc,其他平台得用IBM公司提供的模拟器。
我自己用的是ifort,瀚海Fortran版上的朋友以及超算中心服务器上的用户也大多用ifort。我身边用得比较多的还有gfortran和g95,这两者都是开源的。尤其是gfortran,更是GNU Project里的成员。
g95虽然开源,但只是作者一人在维护,不是非常推荐。其他的编译器我没试过,没发言权,不敢妄自评论。
关于gfortran,因为我以前在实际使用中并不愉快,所以不敢多说。我在《 Ubuntu10.04_i386 下安装 ifort 11.1.072 》一文写到:“GNU Project 贡献了无数优秀的g字开头的软件、程序,如gcc,GNU/emacs等,但绝对不包括gfortran,比起ifort,gfortran的效率及容错性都不甚如意。”这是有失公允的。我更是没有在亲自试验的情况下,引用了科大论坛以前的某位朋友的观点:“gfortran和ifort编译出来程序的运行效率可以差个两三倍。“这就很不严谨了,在此真诚道歉。
提到编译器,不得不说一说对古老的Fortran77的支持。由于F77时代积累了无数珍贵代码,及Fortran标准的要求,所有编译器都是号称向下兼容的。但实际一用起来就未必是这么一回事了。这里有一个概念,叫对劣质代码的容错性。
以我实验室流传的程序为例,最初写的时候就不规范,用到了很多新标准所建议弃用的语法,以前用古老的f77、g77编译器倒没什么。后来一升级系统(由FC4升到ubuntu8.04),f77和g77都装不上了,只好用新版的编译器。我处于对GNU的无上推崇,首先选用的自然是gfortran,哪知一编译就一大堆警告和错误,仔细看看提示,发现要全部消除的话几乎得把程序重写!后来换了ifort,直接编译通过,运行良好。这本来只是我们的程序写得太烂,与编译器无关,但既然已成事实了,总得希望新版的编译器宽容一点不是?从此之后,我就一直用intel的编译器了……也说出了之前评价gfortran的那句话。
说到这,大家都知道我要推荐的是什么编译器了。关于ifort的下载、安装和设置请参考我之前那篇文章,这里就不多说了。
为了让大家对gfortran有个比较全面的理解,我想转贴“编程爱好者论坛“上dongyuanxun朋友的回复。我从他的回复里学到很多,在此深深感谢。
dongyuanxun:
不过lz的观点有些偏颇。
Windows下除了那些商业软件外,gfortran/g95也可以在windows下正常使用,这个不在话下。
我没用过g95,下面只说一下gfortran。Windows/Linux下gfortran(4.5以上版本,4.4之下的版本不做评述)的性能和ivf相比差距不大。但由于gfortran集成了gnu家族的参数复杂,所以很多初学者不太会用。
lz说的一编译就一大堆警告和错误,我猜想可能是和默认列长度有关,ivf默认支持很长,gfortran取消限制需要加入-ffree-line-length-0。当然还有其他的不同,在此不做赘述。我使用gfortran编译经典f77代码从来没出现什么问题。