題:
為什麼FORTRAN在計算化學中如此常用?
Melanie
2015-02-06 07:58:01 UTC
view on stackexchange narkive permalink

我一直在使用Ruby編寫用於研究的腳本,但是我想深入了解一些Ruby太慢的東西。我注意到有一些用C和C ++編寫的東西,但是有相當大一部分用FORTRAN編寫的計算化學軟件(我的經驗是零。)

為什麼是FORTRAN用於計算化學?據我了解,FORTRAN有點古老(“ punchcard”的意思。)我對於為FORTRAN撰寫的近期撰寫的教程感到震驚。

這是一種“

注意:我可能會將FORTRAN與後來使用的類似名稱的編程語言相混淆。

由於人們是很久以前就開始編寫代碼的,因此Fortran已(並且仍然)針對公式轉換(例如計算)進行了優化。
請記住,現代的Fortran(95,2003,2008)與FORTRAN 66或77有很大不同。
是的,您忽略了一些東西。 1)Fortran具有明顯不同的語義。它沒有真正的指針,因此編譯器在優化方面可以更加自由一些。 2)有很多遺留的fortran代碼3)fortran比C語言尤其是“面向對象”語言簡單得多。
對於某些數組計算,Fortran可能會比C / C ++更快,這是因為[假設指針永遠不會相互別名。](http://stackoverflow.com/questions/146159/is-fortran-faster-than-c)
“不太打孔”? https://upload.wikimedia.org/wikipedia/commons/5/58/FortranCardPROJ039.agr.jpg
這場特殊的語言戰爭(http://en.wikipedia.org/wiki/Software_wars)在Stackoverflow http://stackoverflow.com/questions/13078736/fortran-vs-c-does-fortran-still- hold-any-advantage-in-numerical-analysis-thes?lq = 1 http://stackoverflow.com/questions/31672/learning-fortran-in-the-modern-era/168565#168565 http:// stackoverflow。 com / questions / 953869 / is-the-return-worth-the-investment-in-learning-fortran?lq = 1 http://stackoverflow.com/questions/146159/is-fortran-faster-than-c困擾於30年前的人們認為它仍然像這裡一樣寫成FORTRAN。
FORTRAN是可用於開發計算專用程序的少數選項之一。對於打孔卡,列格式(這是語言規範的一部分)在設計時就考慮了打孔卡。
@DavidZhang可以通過使用strict關鍵字輕鬆解決此問題,該關鍵字在16年前就添加了。
別忘了,許多科學程序員實際上是可怕的程序員,用Fortran編寫比C ++更合理的東西要容易得多。
HTTPS://嗚嗚嗚.Quora.com/what-is-他和-most-popular-programming-language-used-in-computational-chemistry?share=1
大聲笑-1971年,我使用打孔卡在FORTRAN中編寫了我的第一個程序。想知道有多少人知道如何為按鍵設置控制卡。成為書呆子的另一個失落跡像是知道如何為電傳打字機打卡機纏繞紙帶。
六 答案:
Geoff Hutchison
2015-02-06 08:35:30 UTC
view on stackexchange narkive permalink

我認為這不是真的。

某些Fortran的使用是有歷史意義的(即早期的代碼是在FORTRAN中開發的,因為它是70年代和80年代進行數字運算的最佳編程語言) 。哎呀,這個名字代表“公式翻譯”。

某些 Fortran的使用是出於性能的考慮。該語言被設計為:

特別適合於數值計算和科學計算。

很多時候,我發現化學程序員堅持使用Fortran,因為他們知道

我認為當使用現代的,高度優化的C和C ++編譯器時,性能方面不再是正確的。

我寫了一篇C和C ++中的大量代碼可以提高性能,並使用Python粘合很多東西。我知道一些量子程序是專門或主要用C ++編寫的。以下是一些開放源代碼示例:

  • Psi4-用C ++和Python編寫
  • MPQC-用C ++
  • LibInt-用C ++編寫以實現有效的量子積分。
  • LibXC-用C編寫,帶有Fortran“綁定” DFT交換相關功能

這是我的觀點,但是我建議在化學中提高性能的建議是將Python混入某些C或C ++。

我發現我用Python進行編碼更有效,部分原因是語言,部分原因是有很多軟件包,部分是因為我不需要編譯,這都很重要。

此外,您可以運行Python腳本並在GPU上並行運行,甚至對其進行編譯,例如與 Numba。正如我所說,如果我認為性能至關重要,那麼我將用C或通常使用C ++編寫代碼,並根據需要鏈接到Python。

基於純粹的用法,我*高度*建議立即將Python用於科學編程。最新項目的一些片段已經可以作為有效的NumPy或SciPy函數使用。 :-)
我在Python上賣得很認真。我沒有用Python編寫太多東西,但是我發現用它編寫了很多非常有用的腳本。關於C或C ++,您推薦哪個?我只真正使用過Ruby和Perl(以及一點點Python),而我真的不在乎Perl。
我對學習語言的建議是在需要的地方有一個項目。最近,我自學了Python,只是使用NumPy圖像處理。我建議使用Python一段時間,然後如果有性能關鍵部分,請嘗試使用C或C ++重寫。在線上和以書本形式存在許多“學習語言X”指南。
@GeoffHutchison,我*從不*僅出於純粹的用途推薦任何東西。
不過,大多數廣泛使用的QC軟件包都是用fortran編寫的。
@Wildcat如果您不需要重新發明輪子,便可以在快速原型開發方面具有優勢。
@permeakra我認為這在很大程度上是由於歷史原因。高斯是70年代由Pople創立的。同樣,GAMESS在C被廣泛接受之前就已經開始了。較現代的項目主要是混合或C ++。
@permeakra值得一提的是,我知道Pople在創辦Q-Chem時就教了一些C ++。 libint等項目中的某些模板元編程很難或不可能在Fortran中復制。
@GeoffHutchison C / C ++在語義上存在一些難題(特別是使用指針和數組名=指針的間接訪問),這限制了內存讀寫的重新排序。因此,可以更好地優化fortran代碼。因此,與所有廣泛使用的語言相比,Fortran是處理數字的最佳語言。但是,在現代的opencl中,宿主語言變得不那麼重要了,因此可以使用其他選項。
@permeakra我同意,但是我不想就哪種語言最好進行辯論。當然,它們都是用來製作高性能的化學代碼,而OpenCL和其他功能使語言選擇不那麼重要。
多年來,Fortran一直具有帶有編譯器和優化器支持的本機多維數組。另一方面,C / C ++使用vector的vector進行模擬。正是出於這個原因,許多人繼續將Fortran用於化學和其他科學目的。
實際上,Python是一種解釋型腳本語言,這意味著您的代碼在運行時由解釋器翻譯。因此,在開發時間和速度之間需要權衡。對於數學/化學計算,沒有編程語言能勝過c / c ++。如果您希望並行運行代碼,則應學習使程序成為多線程
儘管我應該提到高效和有效的c / c ++有一個學習曲線,但是我要挑戰您進行其他演示。
@AlanZ2223如果新程序旨在在支持opencl的軟件上運行,則與使用opencl的語言沒有太大區別。 C ++是有史以來最糟糕的語言之一。
Wildcat
2015-02-06 15:56:58 UTC
view on stackexchange narkive permalink

我認為提供一種替代性的觀點並澄清問題確實有意義。

FORTRAN與Fortran

首先,必須將舊的FORTRAN與新的Fortran,按照慣例,舊語言的名稱通常全部大寫。實際上,由於大量的遺留代碼,仍舊使用舊的FORTRAN(一直到FORTRAN 77),但是使用新的Fortran(從Fortran 90開始)主要是因為它是一種非常優雅,簡單但功能強大且有效實施的語言處理數字

DSL與GPL總體上

特別注意,在我看來,即使是現代Fortran也是 域特定語言 (DSL)和與某些通用語言(GPL)之類的C ++相比,它的相對弱點在於:Fortran專用於特定任務(數字運算),可能不太適合

通用語言(例如C ++)為您提供了更多的靈活性(在語言功能方面,在第三方庫中,等),這樣您不僅可以解決主要任務(數字運算),而且可以解決使用相同語言的相關任務 。但是,如果您選擇Fortran進行數字運算,則通常必須使用一種其他語言(例如Python)來完成這些相關任務。考慮使用兩種不同的DSL:一種用於主要任務,另一種用於相關任務。當然,您也可以將Python與C ++一起使用,但是經驗豐富的C ++開發人員(如果您選擇對其中的數字進行處理的話,應該是這樣)不一定會利用其他語言代替他的C ++野獸。

Fortran與C ++專門

所有這些都有些主觀,但是無論如何,這是我的5美分。總體而言, Fortran比C ++更簡單,但是(並且因為) C ++具有更多功能。基本上,這是因為Fortran是DSL,而C ++是GPL。正如我所說,這在某種程度上是主觀的,此外,複雜性是宇宙中最複雜的事物之一,因此我們可以對此進行辯論,但是,嘿,只有一個詞:模板和討論在原則結束。模板使C ++變成了野獸,但一切都是為此付出代價的。

請注意,我並不是說C ++功能更強大,因為我認為“功能更豐富”並不總是意味著“更有力”。首先取決於您是否真的首先需要這些附加功能?認真地說,您是否需要C ++模板提供數字運算的慷慨程度(和元編程)?不必要。而且,如果是這樣,C ++不會比Fortran強大,儘管它仍將具有更多的功能。

模板不是Fortran沒有的唯一C ++功能。例外和標準庫-是Fortran不具備的其他兩個值得注意的功能。同樣,您不太可能從這些功能中受益匪淺。但是其他一些任務可能會非常有用,因此C ++作為GPL包括了它們,而Fortran作為DSL進行數字處理則沒有。將Fortran視為僅用於數字運算的“手提箱語言”,將C ++視為所有事物的“ trunk語言”。

Fortran語言還有一個很棒的功能,C ++仍然無法趕上它:模塊。我的意思是,真正的模塊,而不是古老的預處理器機制,這比其他所有東西都使我更惱火。

C ++具有真實的模塊;如果您不喜歡實現細節,則只需使用#pragma一次。
Jonathon
2015-02-06 08:38:05 UTC
view on stackexchange narkive permalink

FORTRAN在速度方面曾經擁有優勢,這是因為它具有更好的優化編譯器,部分原因是其相對簡單。既然C和C ++編譯器幾乎可以相提並論(有時更好),那麼諸如可編程性之類的其他因素就可以發揮作用。但是,那裡也有很多遺留代碼。 PSI4軟件包甚至將Python和C ++混合使用,以獲得每種工具的速度和可用性的好處。

此處列出了各種程序及其使用的語言。

  • ORCA-C ++
  • MPQC-C ++
  • PSI4-C ++,Python
  • PySCF-Python
  • Q-Chem-FORTRAN, C ++
  • CFour / ACES-FORTRAN,最近有一些C ++
  • NWChem-FORTRAN,C
  • GAMESS(美國)和GAMESS(英國)-FORTRAN
  • 高斯-FORTRAN
  • Molpro-FORTRAN
  • 道爾頓-FORTRAN,一些C
  • MRCC-FORTRAN
  • MOLCAS / OpenMOLCAS -FORTRAN
  • DIRAC-FORTRAN
  • ADF-FORTRAN
  • CASINO-FORTRAN
  • COLUMBUS-FORTRAN
  • CP2K -FORTRAN
  • 渦輪增壓器-FORTRAN

量子化學包裝

《計算機語言基準測試》中的C / C ++代碼是以非常“ hacky”的方式編寫的。沒有人會在生產中這樣做,因為這樣的代碼幾乎無法維護。可維護的C / C ++不會擊敗Fortran。
可悲的是,有時候這是真的。但是,由於C和C ++優化編譯器已經趕上來了,因此還有其他一些考慮因素,例如可用性。
@Wildcat我不同意;使用表達式模板的Blitz ++之類的庫既不易破解也不可維護;它們非常易於使用和維護,並且經常在線性代數中擊敗FORTRAN。
-1
@Alice:我從未聽說過Blitz ++。也許不錯,但龐大的用戶群也很重要。
@Alice:您能提供一個例子,其中Blitz ++擊敗FORTRAN嗎?
Cort Ammon
2015-02-06 11:30:43 UTC
view on stackexchange narkive permalink

FORTRAN是一種比C ++更少表達的語言,它使較早的編譯器可以更高效地進行優化。在現代編譯器中,性能幾乎沒有差異。在僅有的幾個地方,FORTRAN較弱的安全保證允許進行更極端的優化。除非您花費6-10年的時間來開發FORTRAN,否則您可能不會注意到它們之間的差異。

通常來說,使用更新的語言進行開發會更容易,因為它們可以更好地利用現代計算功能。 FORTRAN的格式非常嚴格,因為它必須由1970年代中期的計算機進行編譯。您可以完全以計算機的語言告訴計算機要執行的操作,而不是使用更易理解的語言來告訴計算機您要執行的操作。

FORTRAN仍被使用,原因有兩個,我可以發現: p>

  • 有些問題很簡單,浪費了C ++的表達能力,實際上,您可以使用更簡單的FORTRAN編寫更清晰的程序。
  • 許多程序都是上一代人編寫的。過去,FORTRAN在計算工作上確實更好。
從純粹的觀點來看,作為使用大約十二種語言進行開發的開發人員,除非有傳統的FORTRAN代碼庫與之交互,否則我沒有理由為任何任務的任何開發人員推薦FORTRAN。人們根本不再學習這種語言,這意味著您將不得不永遠維護自己編寫的任何代碼。很難移交給任何人。
@CortAmmon這與事實相去甚遠,以至於在理論上是不誠實的。出於上帝的考慮,現代的FORTRAN用於大型強子對撞機(CHC)上的歐洲核子研究中心(CERN),也不是使用傳統基礎的新代碼。許多事情已經被大量重寫或從頭開始編寫。正如使用了無數的庫和任務所顯示的那樣,FORTRAN的表達能力甚至不及C ++。此外,仍有許多人在學習它。在某些環境(大多數是科學環境)中,它是必需的編程語言。
這得到了好評,這引起了我的注意。我認為發布[2019年StackExchange程序員調查]的鏈接很有用(https://insights.stackoverflow.com/survey/2019#technology)。值得稱讚的是,可能會有少量緊密的人來發展FORTRAN,在這些人中,它可以是一種可維護的語言。但是在龐大的開發人員群體中,它是如此不受歡迎,以至於它甚至都沒有列出開發人員使用的語言列表(列表中最低的是WebAssembly,為1.1%)。
Buttonwood
2017-05-31 18:18:22 UTC
view on stackexchange narkive permalink

我偶然發現了 J中的一篇文章。應用哭泣。部分與原始問題有關。在可重用的軟件框架中將Fortran與晶體學算法環境中的其他編程語言進行比較,可以得出以下簡圖:

enter image description here

doi 10.1107 / S0021889801017824

應該補充一點,即本文涉及使用舊的Fortran 77方言編寫的軟件包。

雖然像Python這樣的語言並不是特別快(基本上是解釋為未編譯的),但這會產生誤導。使用Python,可以輕鬆訪問針對特定計算任務的高度優化的編譯庫。因此,您可以結合編程的簡便性,仍然可以實現高速數字運算。這就是它越來越受歡迎的原因之一。
Pierpy
2017-04-03 01:39:44 UTC
view on stackexchange narkive permalink

我相信在計算化學界廣泛使用Fortran的主要原因有兩個。首先是因為它的效率:FORTRAN表示公式轉換器,而科學/數字計算是開發此代碼的主要原因。例如)與Fortran一樣有效。但是,為什麼我們仍然使用Fortran進行編碼?基本上,大多數電子結構軟件都是用Fortran編寫的,沒有人如此瘋狂地翻譯數百萬行。因此,當添加代碼塊時,我們將其保持在Fortran中!另一方面,如果必須編寫新軟件,則沒有實際理由選擇Fortran作為語言。例如,用於獲得核波函數的最新軟件MIDAS(奧胡斯大學)已經完全用C ++編寫。就個人而言,我使用Fortran90作為語言,但它不像舊的FORTRAN77那樣僵硬……我喜歡它! :)實際上,我問自己與開始博士學位時所發布的問題相同。

+1。很好的答案。特別是因為這是您的第一個也是唯一的回答。這個答案應該比它有更多的讚成票。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...