歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Windows、Linux下的Fortran編譯器簡介及推薦 v2.0

Windows、Linux下的Fortran編譯器簡介及推薦 v2.0

日期:2017/2/28 15:46:04   编辑:Linux教程

  Windows、Linux下都有些什麼常用的Fortran編譯器?

  見知所限,我說的未必公允,也肯定有缺漏,厚顏寫出來只是為了拋磚引玉將問題彰顯,給出個尚可的解決方案,後來人就不用再在版上浪費時間在這些基本問題上了。如果有牛人進一步糾正、補償,那就更完滿了。我之前的《Ubuntu 10.04_i386 下安裝 ifort 11.1.072》是這種用意(見 http://www.linuxidc.com/Linux/2012-07/65070.htm ),以後如果有空,寫得入門類文章也會是這種用意。好不容易有了版主,而且願意做這麼多,由衷期待版上的其他朋友也一並參與進來,助他一臂之力,一起留下些可供後來者參考的珍貴資料~

  在開始前,先得點明一個很基本的觀念:編譯器(Complier)不等於IDE(Integrated Development Environment,集成開發環境)。前者只提供編譯Fortran代碼的功能,後者提供了從代碼編輯器、編譯器、調試器和圖形用戶界面工具(百度百科)。一個很有趣的現象是,Windows下現成可用的都是IDE,Linux下的則都是Complier。但千萬不要以為前者就該多麼方便,後者就得多麼麻煩,具體為什麼我在後面會提到。

一、Windows

  實際上,在Win平台中,大家用得最多的大概是基於微軟Visual Studio因而集成了一整套IDE的、商業Fortran編輯器。這裡只介紹兩個:CVF,IVF。當然還有非商業的,基於命令行的編譯器,如gfortran/g95等等,但我沒嘗試過,因為這樣的話我更願意直接到linux下工作呢。我個人非常期待關於Windows下命令行編譯器的使用補充,如果是像本文一樣的入門就更贊了~

1)Compad Visual Fortran

  最常見的就是Compad Visual Fortran v6.5或v6.6,基於VS6。這是Win98時代的東東,更新到v6.6c就被Intel收購了,但到了2011年的今天,我對門實驗室的童鞋們都依然在用。CVF我只以VS6試用過,不知道是否支持更高版本的VS,所以個人推薦還是用最小巧,最簡單的VS6。

  版本方面,網絡上最常見的是v6.5的安裝包+v6.6b或c的升級包。個人推薦不要升級到v6.6c,最多v6.6b就好。因為不知什麼原因,我用到程序只明確支持到v6.6b,在6.6c編譯不過。

  操作系統方面,確認百分比支持的是WinXP及之前版本。Vista我沒試過,聽說是根本就不兼容;Win7是勉強支持的,但都有這樣那樣的小毛病,推薦安裝微軟自己出品的、Win7專業版以上才可用、免費的Virtual PC XP-Mode。這是微軟為了解決兼容性問題,特意為Win7打造的微型XP虛擬機,活脫脫就是XP再生,當然可以兼容CVF在內的眾多軟件。

  CVF只支持到Fortran 95標准,不支持任何03以上的特性,而且界面、功能遠不如後繼者IVF完善。但他的優點非常明顯,因為用的人多,所以你向身邊的人可能就在用,可以隨時請教;你用到的程序,很可能就是一個現成的CVF Project;加上下載XX方便(CVF本身是免費的,而VS6一搜就有一大把的序列號),體積輕小、對配置要求極低,所以還是值得推薦的。

2)Intel Visual Fortran

  這是CVF的後繼者,也是我以前一直在用的編譯器。目前正不斷更新,最新版本是2011 XE,版本號是2011.0.084,或12.0.084。我的使用經歷是IVF 11.1.69

  最新的2011 XE支持擴展的Fortran2003標准,也就是吸納了部分2008特性,而2003本身除了兩個特性沒實現外已經差不多完現了。

  操作系統方面,Windows全系統支持。因為我沒安裝過,所以不確定具體能支持哪些VS版本,2010和2008應該是可以的,2005不清楚,但往下就肯定不支持了。

  但可悲的是,v12系列剛發布沒半年,價格高達700刀,想用都用不起。

  盜版方面,安裝程序和授權文件在網上很難找到,較常見的還是v11系列。但有一點要注意,v11對Win7支持是有缺陷的,只有11.1.48以上的版本才完整支持,大家下載時務必留意。Vista我壓根沒關注,所以不知道情形;XP就好辦了,100%兼容。v11系列只支持VS2005和2008,2010不清楚,大家下載VS時也請留意。

3)其他

  在Win下比較常見的還有PGI Fortran,更新發布比IVF要勤快,也容易下載到(VeryCD.com就有),聽說口碑也不錯,但我沒用過,沒發言權。Windows下面到底都有些什麼編譯器,有些什麼差異,比較結果又是怎樣,大家有興趣可以去下面的網址看看:

  (http://www.polyhedron.com/compare0html)

  最後羅嗦一句,我自己最近一年有良心發現的傾向,越來越想去尊重他人的勞動成功,因而越來越抗拒盜版。更不想自己的研究工作根植於一些不道德的行為,如盜版。囊中羞澀之下,又加上對GNU project的認同,俺目前的工作環境都已經全面轉向Linux及自由軟件。所以,俺不會再關注Win下的商業軟件了,最近的這些文章也算是作個告別吧~實際上,俺最近在學Emacs,所以也樂意多寫點東西練練手。

  促使我改投Linux懷抱的是一篇著名的文章:王垠《完全用 GNU/Linux 工作》,強烈推薦。http://www.linuxidc.com/Linux/2011-01/31091.htm

二、Linux

  之前提到過,Windows下面的Fortran發行版,多半是整合了IDE的商業版,價格不菲。而Linux下則是完全不同的氛圍,常用的編譯器清一色都是免費,甚至開源。缺點只是:沒有集成統一的IDE,在可視化、在編輯調試方面似乎不那麼方便。——但事情不是這樣的。

  Linux下有偉大的開源IDE,Eclipse可以替代VS;更有其他更自由更高效的解決方案,——只要你願意花時間學習。

  當然,愛怎麼折騰都全憑個人喜好。實際上,我實驗室裡面的師兄們都是簡簡單單隨便一個文本編輯器+編譯器就了解,純手工維護。這裡那麼多方案,只是提供更多選擇的可能性,讓大家知道,離開Windows來到linux其實是一種解放。

  我自己用的Linux發行版是32位的Ubuntu10.04,下面也主要以之為例。以下提到的所有軟件,在不同發行版中照樣可用,大家不必擔心。

1)兩種解決方案:IDE or DIY

  先說IDE,大名鼎鼎的跨平台、自由、集成開發環境Eclipse就有專為Fortran設計的插件Photran,支持所有常見的Fortran編譯器,如ifort、gfortran、g95等等。雖說一時間還比不上Windows下的VS,但已經相距不遠了。(注,不是說強大的Eclipse比不上VS,而是身為插件的Photran還不夠成熟,Photran+ifort還比不上IVF)。關於Eclipse和Photran可以自行Google之。下載也容易,Ubuntu的軟件中心就有,雖然版本要舊一點,但勝在方便。

  (http://www.eclipse.org/)

  關於IDE,我一師弟提到了Code::Blocks下也有Fortran插件,dongyuanxun在回復中也說:“Fortran的IDE可以使用跨平台的Code::Blocks,代碼完成,函數跳轉都挺不錯。”下面是百度百科的資料:

  

  “Code::Blocks 是一個開放源碼的全功能的跨平台C/C++集成開發環境. Code::Blocks是開放源碼軟件。Code::Blocks由純粹的C++語言開發完成,它使用了蓍名的圖形界面庫wxWidgets(2.6.2 unicode)版。對於追求完美的C++程序員,再也不必忍受Eclipse的緩慢,再也不必忍受VS.NET的龐大和高昂的價格。”

  (http://baike.baidu.com/view/1562377.htm)

  我自己是裝了Eclipse+Photran的,但一次都沒用過,因為Linux下有更強大的方案。繼承自Unix,Linux和Unix一樣,都有一種軟件開發的美學:一個軟件負責一種功能,把一種功能開發到極致,然後讓不同的最好的軟件互相協作。開發Fortran程序也可以做得到,把IDE拆分為:編輯器 + 項目管理維護軟件 + 編譯器,我個人所推崇的方案是:GNU/Emacs + GNU Make + Complier(如ifort)

2)Code Editor

  Emacs與Vim並稱編輯器中的神器,Vim的美譽是“編輯器之神“,而Emacs的美譽則是“神的編輯器“,我個人更喜歡Emacs的自由及無限可定制性,其他朋友憑自己喜歡也可以選用Vim。唯一需要注意的是,這兩件神器是需要花時間學,花更多時間去磨合的,雖然學會之後能大幅提高工作效率,但學習的過程是決計少不了。

  Emacs自帶Fortran-Mode和F90-Mode,對fixed和free兩種fortran書寫格式都提供語法高亮,為fortran程序的編寫和調試提供了非常周到的環境。而且還有大量的插件可供下載,如語法檢查及自動補全,與編譯器的整合等等,只要願意花心思,完全可以武裝到牙齒。我目前正在學習中,最近的兩篇文章就是用Emacs寫就的。

  關於Emacs的入門材料,網上有很多,但其實打開Emacs,按照她自帶的中文Tutorial試一遍就知道個大概了。但要發揮Emacs的無比威力,得進一步深化學習;中文的實體書卻不見售,我是在淘寶上買了本復印的《學習GNU Emacs 第二版》,這本書早就絕版,想買都買不到。

  下載同樣可以到Ubuntu的軟件中心搜索,最新版是23.3,Ubuntu收錄的是23.1,區別不大。

  如果不想折騰,可以用自由桌面自帶的文本編輯器,如Ubuntu上就自動有gedit,也支持語法高亮,一般人而言已經夠用了。

3)GNU Make

  關於make這個工具,三言兩語很難說得清,大家可以參考wiki。

  (http://zh.wikipedia.org/wiki/Make,更推薦英文版wiki)

  在我理解中,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公司提供的模擬器。

  (http://asc.2dark.org/node/8)

  我自己用的是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代碼從來沒出現什麼問題。

  而lz說的gfortran和ifort編譯出來程序的運行效率可以差個兩三倍,就沒有道理了。我曾經比較過,gfortran在除了matmul函數和三角函數遠慢於ivf外,其他運算速度要遠遠高於ivf。

  而matmul和三角函數也有另外的處理方式。gfortran有個開關-fexternal-blas,這個可以把matmul函數解析到外部的blas庫,如mkl的blas、比mkl還快的gotoblas、ATLAS,這樣得到的目標代碼速度要超過ivf的matmul的速度。對於三角函數,Linux下使用-mveclibabi=svml -lsvml -limf -lintlc 可以直接鏈接到mkl的svml庫,或者使用-mveclibabi=acml -lacml_mv 鏈接到acml庫,這樣速度就和ivf相同了。Windows下比較麻煩,因為鏈接到intel的庫要依賴vc的庫,所以最好鏈接到svml的dll進行處理。另外的方法即是使用通用的SIMD技術,把三角函數重寫(gcc),然後gfortran再去鏈接它。

  另外考慮到開源跨平台計算庫,比如fftw、gotoblas、atlas,這些東西用gcc/gfortran很好編譯,用vc/intel編譯器基本編譯不出來,雖然可以通過動態連接庫dll來使得intel使用,還不如直接使用gcc/gfortran來的便捷。

  最後最重要的是免費開源,ivf在windows下收費,Linux下也只是對個人免費而已,商業開發需要授權。開源這個挺好的,編譯器有時會不時的出現bug,intel的bug得報告後確認,還得等下個版本,還不一定修復,gfortran就不同了,可以去bugzilla上查閱bug,興許就有解決的補丁,然後自己重新編譯gfortran一下就行了。

  默認編譯呢,確實差距很大的,這是因為ivf不加參數是/O1優化,而且fastmath自動開啟(有時會產生錯誤結果,發現不對勁時要手動關閉),而 gfortran默認好像是-O0不優化(反正沒有ivf優化級別高),不開啟fastmath,所以默認參數表面上產生gfortran遠遠不如ivf 的假象。在此,引用一個說法,某人說過,intel這樣做是想推銷他的編譯器而已(默認開關就很快)。

5)其他

  關於make,科大論壇上的IceAge朋友推薦了cmake,我挺感興趣,於是查了下。有空的話就學一學:

  “CMake是一個比make更高級的編譯配置工具,它可以根據不同平台、不同的編譯器,生成相應的Makefile或者vcproj項目。通過編寫CMakeLists.txt,可以控制生成的Makefile,從而控制編譯過程。CMake自動生成的Makefile不僅可以通過make命令構建項目生成目標文件,還支持安裝(make install)、測試安裝的程序是否能正確執行(make test,或者ctest)、生成當前平台的安裝包(make package)、生成源碼包(make package_source)、產生Dashboard顯示數據並上傳等高級功能,只要在CMakeLists.txt中簡單配置,就可以完成很多復雜的功能,包括寫測試用例。如果有嵌套目錄,子目錄下可以有自己的CMakeLists.txt。總之,CMake是一個非常強大的編譯自動配置工具,支持各種平台,KDE也是用它編譯的,感興趣的可以試用一下。”

  IceAge還提到了IDB,我沒理解錯的話,應該是Intel DeBugger,另外還有GNU DeBugger,GDB。我自己在調試工具方面的理解和實踐很淺薄,所以在上面沒有說。這裡特意提到,是想借IceAge的方案來彌補。他的方案是: Vim + cmake + IDB + ifort, 有興趣的朋友可以仔細調研。這裡引以下關於GDB的討論:

f2003:

  對Fortran最大的兩點遺憾是 gdb對Fortran支持不好……

dongyuanxun:

  主要是動態數組gdb支持不好,所以要使用archergdb,但是archergdb不是緊跟gdb的trunk的,所以有些特性也發揮不出來,我曾經試圖把archergdb的補丁分離合並到gdb裡,編譯未果,要改太多東西了。

  補充一下,gcc/gfortran的調試是個硬傷,不如intel編譯器的調試器好,所以對個人的調試水平比較高。雖然可以使用archergdb來代替gdb,顯示還是沒有ivf的好。

三、尾聲

  說了那麼多,其實都只是一些皮毛性質的介紹。要學會fortran,只需也必須自己親自花時間去鑽研。而fortran語言也只是科研的一件工具,能用就行,科研本身才是最重要的,千萬不要捨本逐末。我所寫的這些,是根據我的情況、我的需求、我的經歷來寫的,僅供參考。如果我的這些文字能幫大家節省一些入門時間,那我就非常滿足了。我這些文字,贻笑大方本不算什麼,不過既然大家耐著性子看到這裡,我也提個願望:希望大家熟悉fortran之後也能如我這般做些力所能及的事情,幫一下後來者。不一定要在人煙稀少的瀚海星雲Fortran版,別的什麼地方都可以,哪怕只是在現實中教教後輩也是美事;最好對受益的人也提這樣的一個願望,這樣一點點傳播開去,世界就更美好了~

四、修改記錄

2011.04.07  原版。

2011.04.08 

補充了另外一個IDE的簡介,Code::Blocks;

發覺對gfortran的評述有失偏頗,故引用dongyuanxun回復,重新修改;

引用IceAge的回復,簡略補充了自動編譯設置工具cmake和調試工具IDB、GDB。

Copyright © Linux教程網 All Rights Reserved