簡體   English   中英

將Fortran 77代碼轉換為C ++

[英]Conversion of Fortran 77 code to C++

有沒有人將Fortran 77代碼的大型(我們的550,000行)程序轉換為C ++? 你遇到了什么陷阱? 轉換成功了嗎? 你使用像for_c這樣的工具( http://www.cobalt-blue.com/fc/fcmain.htm )嗎? 生成的C ++代碼是顯着更快還是更慢?

有很多事情需要考慮。

真的有兩條路可走。 一種是直接逐行轉換為c。 我的意思是每個fortran聲明給一個等於c的聲明。

另一條路徑是重寫,使用500k loc +,這將是更多的工作。 有了這種大小,我當然會尋找一種工具來進行翻譯,比如f2c。

直接端口的問題......

gotos直接翻譯,你需要為goto目標創建標簽。

label10:;

    goto label10;

數組下標是一個重要的問題。 c是基於零的,fortran是基於1的,因此數組需要在fortran代碼中標注一個更大的數據。

真正的* 4 a(10,20)變成了

#define XMAX 10 + 1
#define YMAX 20 + 1 
float a[XMAX][YMAX];

允許循環像這樣寫。

for (x = 1; x <= XMAX; x++)
    for (y = 1; y <= YMAX; y++)
        a[x][y] = 0.0f;

c數組訪問是行主要順序,而fortran是列主要。 這可能是一個性能問題。 如果它確實成為一個問題,你可以用某種宏定義來解決它,這會顛倒順序或數組下標。 實際上你也可以讓宏從每個下標中減去一個,以使它看起來像一個基於一個數組,實際上映射到一個基於零的數組。

real * 8 a(XMAX,YMAX)a(4,2)= 3.14

#define A(X,Y)  a[Y][X]
double a[XMAX][YMAX];
A(4,2) = 3.14;

fortran unit io可以使用stdio類型文件進行模擬。 如果你使用的是單位19,那么

FILE *fp19 = fopen("file","mode");

如果您在文件中使用fortran托架控件,則可能存在托架控制問題。 單元5和6可以簡單地用stdin引用,而stdout可以不用fopen引用。

printf系列函數可以處理很多格式。 您可能必須添加額外的循環來處理一些fortran數組io。

WRITE(6,200)(PROJ(z,4),z = 1,20)

int z;
for (z = 1, z <= 20; z++)
    printf("%lf ", proj[z][4]);


使用f2c可能是最快的方法。 然后你被它的rtl困住了。
o做一個直接的港口是可行的事情。 耗費時間,但可行
o如果你想長期維護它,我會建議重寫。 非常耗時,可能更快,但從長遠來看更易於維護

令人高興的是,在任何情況下,您都可以使用原始程序作為基線來進行一組單元測試,以幫助開發工作。

這增加了EvilTeach的建議。 請記住, 鏈接 Fortran 77和C / C ++代碼相當容易,因此您可以逐步轉換部分應用程序並將它們與舊部件鏈接在一起。 如果你這樣做,你將不得不考慮所有常見的fortran / c差異(行/列主要數組,數組索引等),但它可以節省你一次調試整個自動翻譯的代碼庫的痛苦。

在國家(DOE)實驗室中有許多這樣的大型混合代碼,它們對舊的Fortran代碼進行了大量投資。 如果你走這條路,你可以考慮使用Babel ,它是為允許在同一個應用程序中共享C,C ++,Fortran,Fortran90,Python和Java之間的組件而開發的。 在實驗室中實現這一目標的動機是將不同團隊構建的物理模型捆綁在一起進行大型模擬,但您可能會發現它對於轉換代碼也很有用。 它在許多項目中得到了積極的維護和使用,盡管它可能對你想要做的事情來說有點過於復雜。

我的反應是你為什么要轉換它。

在20世紀90年代,許多公司都在研究如何開發具有大量Fortran代碼庫的產品的問題。 那就是轉換,留在Fortran還是生產混合動力車。 我認為大多數人選擇了混合方法,通常是用戶界面的C ++和后台的原始Fortran代碼庫。

我的建議是查看Carsten Arnholm撰寫的“使用C ++和FORTRAN 77的混合語言編程”,網址為http://arnholm.org/software/cppf77/cppf77.htm 。在早期的互聯網上,這個文檔很好地鏈接到了。

本文檔描述了如何使用包含C ++和Fortran的應用程序。 我不知道是否有些技術細節可能已經過時,但是這個文檔來自一個想要使用C ++進行開發但有一個龐大的Fortran代碼庫的項目。

您還可以看看Barton和Nackman撰寫的“科學與工程C ++:高級技術與實例介紹”,這些書籍來自好書店。 本書為Fortran程序員教授C ++。 它有一些從C ++編寫Fortran代碼包裝器的例子。 這是一本很好的C ++書,忽略了Fortran方面。 它是在標准設定之前編寫的,但差異不是很大。

我曾經用過這個: http//manpages.ubuntu.com/manpages/hardy/man1/f2c.html將一個小的fortran程序轉換為C.轉換成功了。 檢測任何類型的速度變化代碼並不復雜。

由於你的程序比較大,我真的不知道一切都會像我一樣運行。

你可能想看看Promula 它產生比許多其他自動翻譯器更可讀的C代碼。 我沒有直接使用Promula,但我已經將相當數量的Promula輸出從C轉換為C ++。 將C代碼清理成合法的C ++很容易,但當然需要花費更多精力才能使它成為非常好的C ++。

我已經開發了一個應用程序,其核心是使用for_c從FORTRAN轉換的代碼。 它創造的代碼太可怕了。 它很難維護,因為大部分都是難以辨認的。 幸運的是,代碼非常穩定,很少有必要對它進行任何操作。

然而,這是在很多年前完成的 - 大約是Windows的早期16位年代。 也許for_c現在更好?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM