我一直在使用Ruby編寫用於研究的腳本,但是我想深入了解一些Ruby太慢的東西。我注意到有一些用C和C ++編寫的東西,但是有相當大一部分用FORTRAN編寫的計算化學軟件(我的經驗是零。)
為什麼是FORTRAN用於計算化學?據我了解,FORTRAN有點古老(“ punchcard”的意思。)我對於為FORTRAN撰寫的近期撰寫的教程感到震驚。
這是一種“
注意:我可能會將FORTRAN與後來使用的類似名稱的編程語言相混淆。
我一直在使用Ruby編寫用於研究的腳本,但是我想深入了解一些Ruby太慢的東西。我注意到有一些用C和C ++編寫的東西,但是有相當大一部分用FORTRAN編寫的計算化學軟件(我的經驗是零。)
為什麼是FORTRAN用於計算化學?據我了解,FORTRAN有點古老(“ punchcard”的意思。)我對於為FORTRAN撰寫的近期撰寫的教程感到震驚。
這是一種“
注意:我可能會將FORTRAN與後來使用的類似名稱的編程語言相混淆。
我認為這不是真的。
某些Fortran的使用是有歷史意義的(即早期的代碼是在FORTRAN中開發的,因為它是70年代和80年代進行數字運算的最佳編程語言) 。哎呀,這個名字代表“公式翻譯”。
某些 Fortran的使用是出於性能的考慮。該語言被設計為:
特別適合於數值計算和科學計算。
很多時候,我發現化學程序員堅持使用Fortran,因為他們知道
我認為當使用現代的,高度優化的C和C ++編譯器時,性能方面不再是正確的。
我寫了一篇C和C ++中的大量代碼可以提高性能,並使用Python粘合很多東西。我知道一些量子程序是專門或主要用C ++編寫的。以下是一些開放源代碼示例:
這是我的觀點,但是我建議在化學中提高性能的建議是將Python混入某些C或C ++。
我發現我用Python進行編碼更有效,部分原因是語言,部分原因是有很多軟件包,部分是因為我不需要編譯,這都很重要。
此外,您可以運行Python腳本並在GPU上並行運行,甚至對其進行編譯,例如與 Numba。正如我所說,如果我認為性能至關重要,那麼我將用C或通常使用C ++編寫代碼,並根據需要鏈接到Python。
我認為提供一種替代性的觀點並澄清問題確實有意義。
首先,必須將舊的FORTRAN與新的Fortran,按照慣例,舊語言的名稱通常全部大寫。實際上,由於大量的遺留代碼,仍舊使用舊的FORTRAN(一直到FORTRAN 77),但是使用新的Fortran(從Fortran 90開始)主要是因為它是一種非常優雅,簡單但功能強大且有效實施的語言處理數字。
特別注意,在我看來,即使是現代Fortran也是 域特定語言 (DSL)和與某些通用語言(GPL)之類的C ++相比,它的相對弱點在於:Fortran專用於特定任務(數字運算),可能不太適合
通用語言(例如C ++)為您提供了更多的靈活性(在語言功能方面,在第三方庫中,等),這樣您不僅可以解決主要任務(數字運算),而且可以解決使用相同語言的相關任務 。但是,如果您選擇Fortran進行數字運算,則通常必須使用一種其他語言(例如Python)來完成這些相關任務。考慮使用兩種不同的DSL:一種用於主要任務,另一種用於相關任務。當然,您也可以將Python與C ++一起使用,但是經驗豐富的C ++開發人員(如果您選擇對其中的數字進行處理的話,應該是這樣)不一定會利用其他語言代替他的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 ++仍然無法趕上它:模塊。我的意思是,真正的模塊,而不是古老的預處理器機制,這比其他所有東西都使我更惱火。
FORTRAN在速度方面曾經擁有優勢,這是因為它具有更好的優化編譯器,部分原因是其相對簡單。既然C和C ++編譯器幾乎可以相提並論(有時更好),那麼諸如可編程性之類的其他因素就可以發揮作用。但是,那裡也有很多遺留代碼。 PSI4軟件包甚至將Python和C ++混合使用,以獲得每種工具的速度和可用性的好處。
此處列出了各種程序及其使用的語言。
FORTRAN是一種比C ++更少表達的語言,它使較早的編譯器可以更高效地進行優化。在現代編譯器中,性能幾乎沒有差異。在僅有的幾個地方,FORTRAN較弱的安全保證允許進行更極端的優化。除非您花費6-10年的時間來開發FORTRAN,否則您可能不會注意到它們之間的差異。
通常來說,使用更新的語言進行開發會更容易,因為它們可以更好地利用現代計算功能。 FORTRAN的格式非常嚴格,因為它必須由1970年代中期的計算機進行編譯。您可以完全以計算機的語言告訴計算機要執行的操作,而不是使用更易理解的語言來告訴計算機您要執行的操作。
FORTRAN仍被使用,原因有兩個,我可以發現: p>
我偶然發現了 J中的一篇文章。應用哭泣。部分與原始問題有關。在可重用的軟件框架中將Fortran與晶體學算法環境中的其他編程語言進行比較,可以得出以下簡圖:
( doi 10.1107 / S0021889801017824)
應該補充一點,即本文涉及使用舊的Fortran 77方言編寫的軟件包。
我相信在計算化學界廣泛使用Fortran的主要原因有兩個。首先是因為它的效率:FORTRAN表示公式轉換器,而科學/數字計算是開發此代碼的主要原因。例如)與Fortran一樣有效。但是,為什麼我們仍然使用Fortran進行編碼?基本上,大多數電子結構軟件都是用Fortran編寫的,沒有人如此瘋狂地翻譯數百萬行。因此,當添加代碼塊時,我們將其保持在Fortran中!另一方面,如果必須編寫新軟件,則沒有實際理由選擇Fortran作為語言。例如,用於獲得核波函數的最新軟件MIDAS(奧胡斯大學)已經完全用C ++編寫。就個人而言,我使用Fortran90作為語言,但它不像舊的FORTRAN77那樣僵硬……我喜歡它! :)實際上,我問自己與開始博士學位時所發布的問題相同。