2008-11-09 41 views
14

Có ai đã chuyển đổi một chương trình lớn (của chúng ta là 550.000 dòng) của mã Fortran 77 thành C++ không? Bạn đã gặp phải những cạm bẫy nào? Chuyển đổi có thành công không? Bạn đã sử dụng công cụ như for_c (http://www.cobalt-blue.com/fc/fcmain.htm)? Mã C++ kết quả nhanh hơn hay chậm hơn đáng kể?Chuyển đổi mã Fortran 77 thành C++

+3

Ồ, tôi không ghen tị với bạn :) –

+0

Tại sao bạn chuyển đổi? –

+4

Bạn biết trò đùa cũ: "rm * f là một công cụ tự động để chuyển đổi tất cả các nguồn fortran của bạn thành các khối đĩa miễn phí để bạn có thể bắt đầu viết đúng". –

Trả lời

3

Tôi đã từng sử dụng điều này: http://manpages.ubuntu.com/manpages/hardy/man1/f2c.html để chuyển đổi chương trình fortran nhỏ thành C. Chuyển đổi thành công. Mã không phức tạp đáng kể để phát hiện bất kỳ loại thay đổi tốc độ nào.

Vì chương trình của bạn đông hơn nên tôi không thực sự biết mọi thứ có chạy như tôi đã làm hay không.

+0

Tôi đã sử dụng f2c trên một mã cỡ vừa phải fortran vài năm trở lại.Chất lượng kém (các thuật ngữ dễ đọc) fortran code đã giảm xuống khủng khiếp sau khi trải qua bản dịch. Phải mất rất nhiều nỗ lực thủ công để đánh bóng để đọc được C – nsanders

9

Có rất nhiều điều cần xem xét.

Thực sự có hai đường dẫn để thực hiện. Một là thực hiện một đường dây trực tiếp bằng cách chuyển đổi dòng sang c. Bằng cách đó tôi có nghĩa là tất cả các tuyên bố fortran cho một tuyên bố c cân bằng.

Cách khác để thực hiện là viết lại và với 500k loc + sẽ hoạt động nhiều hơn. Với loại kích thước đó, tôi chắc chắn sẽ tìm kiếm một công cụ, để thực hiện bản dịch, như f2c.

Sự cố cho một cổng thẳng ...

Dịch ảnh trực tiếp, bạn sẽ cần phải tạo nhãn cho mục tiêu goto.

label10:; 

    goto label10; 

Chỉ số mảng là một vấn đề tiềm ẩn. c là không dựa, fortran là 1 dựa, vì vậy mảng cần phải được kích thước một lớn hơn trong mã fortran.

thực * 4 a (10,20) trở thành

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

cho phép vòng lặp được viết như thế này.

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

c truy cập mảng theo thứ tự chính hàng, trong khi fortran là cột chính. có thể là sự cố hiệu suất. nếu nó trở thành một vấn đề, bạn có thể có thể để giải quyết nó với một số loại định nghĩa macro mà đảo ngược thứ tự hoặc các bảng con mảng. Trong thực tế, bạn cũng có thể có macro trừ một phần của mỗi bảng con để làm cho nó trông giống như một mảng dựa trên, thực sự ánh xạ tới một mảng dựa trên không.

thực * 8 một (XMAX, ymax) một (4,2) = 3,14

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

đơn vị fortran io thể được mô phỏng với các tập tin loại stdio. nếu bạn đang sử dụng thiết bị 19, thì

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

Có thể có vấn đề với kiểm soát vận chuyển nếu bạn đang sử dụng kiểm soát vận chuyển trong tập tin của bạn. Các đơn vị 5 và 6 có thể được tham chiếu đơn giản với stdin và stdout mà không có fopen.

Rất nhiều định dạng có thể được xử lý với nhóm chức năng printf. Bạn có thể phải thêm các vòng lặp bổ sung để xử lý một số mảng fortran io.

VIẾT (6, 200) (Proj (z, 4), z = 1, 20)

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


o sử dụng f2c có lẽ là cách nhanh nhất để làm điều đó. Sau đó, bạn đang mắc kẹt với rtl của nó.
o làm một cổng trực tiếp là một điều khả thi để làm. Mất thời gian, nhưng có thể thực hiện được
o nếu bạn muốn duy trì nó lâu dài, tôi khuyên bạn nên viết lại. Rất tốn thời gian, có thể nhanh hơn, nhưng dễ bảo trì hơn trong thời gian dài

Hạnh phúc trong mọi trường hợp bạn có chương trình gốc để sử dụng làm cơ sở để thực hiện một bộ kiểm tra đơn vị để giúp đỡ trong nỗ lực phát triển.

+0

Có, tôi đã tự hỏi về mảng subscripting.Trên thực tế không phải là mảng duy nhất kích thước nhưng mảng nhiều kích thước lo lắng cho tôi một chút BTW, FOR_C có riêng của nó RTL cũng rằng nó thay thế tes cho VIẾT và ĐỌC. –

+0

f2c là một công cụ hữu ích nếu bạn muốn biên dịch Fortran 77 và có trình biên dịch C. Nó cực kỳ tệ nếu bạn muốn chuyển đổi Fortran thành C hoặc C++ và làm bất cứ điều gì với mã được tạo ra ngoài biên dịch nó. –

9

Điều này thêm vào lời khuyên của EvilTeach. Hãy nhớ rằng nó khá dễ dàng để liên kết Fortran 77 và C/C++, vì vậy bạn có thể chuyển đổi từng phần của ứng dụng và liên kết chúng với nhau với các phần cũ. Bạn sẽ phải suy nghĩ về tất cả các sự khác biệt thông thường của fortran/c (mảng hàng/cột-chính, lập chỉ mục mảng, v.v.) nếu bạn làm điều này, nhưng nó sẽ giúp bạn tiết kiệm được nỗi đau khi gỡ lỗi toàn bộ codebase được dịch tự động cùng một lúc .

Có nhiều mã lai lớn như thế này tại các phòng thí nghiệm quốc gia (DOE), có đầu tư đáng kể vào mã Fortran cũ. Nếu bạn đi tuyến đường này, bạn có thể xem xét sử dụng Babel, được phát triển để cho phép các thành phần được chia sẻ giữa C, C++, Fortran, Fortran90, Python và Java tất cả trong cùng một ứng dụng. Động lực cho điều này tại các phòng thí nghiệm là kết hợp các mô hình vật lý được xây dựng bởi các nhóm khác nhau để mô phỏng thực sự lớn, nhưng bạn cũng có thể thấy hữu ích khi chuyển đổi mã của mình. Nó được chủ động duy trì và sử dụng trên rất nhiều dự án, mặc dù nó có thể hơi phức tạp đối với những gì bạn đang cố gắng làm.

+0

ya. cổng gia tăng, một ý tưởng rất hay. – EvilTeach

+0

Có, gia tăng sẽ có thể thực hiện được. BTW, chúng tôi đã có 10.000 dòng mã C và C++ trong ứng dụng của chúng tôi. Mã F77 thực sự trong một Win32 DLL có thể gọi bằng C, C++ hoặc VB. –

2

Bạn có thể muốn xem xét Promula. Nó tạo ra mã C dễ đọc hơn nhiều trình dịch tự động khác. Tôi đã không sử dụng Promula trực tiếp, nhưng tôi đã chuyển đổi một số tiền hợp lý của Promula đầu ra từ C đến C + +. Thật dễ dàng để làm sạch mã C thành hợp pháp C++, nhưng tất nhiên phải mất nhiều công sức hơn để làm cho nó thực sự tốt C++.

6

Phản ứng của tôi là lý do tại sao bạn muốn chuyển đổi nó.

Câu hỏi về cách phát triển một sản phẩm có cơ sở mã Fortran lớn được nhiều công ty trong thập niên 1990 xem xét. Đó là liệu có nên chuyển đổi, ở lại với Fortran hay sản xuất lai hay không. Tôi nghĩ đa số đã chọn phương pháp lai, thường là C++ cho giao diện người dùng và mã gốc Fortran gốc trong nền.

Đề xuất của tôi là xem "Lập trình ngôn ngữ hỗn hợp bằng C++ và FORTRAN 77" của Carsten Arnholm có sẵn tại http://arnholm.org/software/cppf77/cppf77.htm Trong những ngày trước của Internet, tài liệu này được liên kết tốt.

Tài liệu này mô tả cách có ứng dụng chứa C++ và Fortran. Tôi không thể nói liệu một số chi tiết kỹ thuật có thể lỗi thời hay không nhưng tài liệu này xuất phát từ một dự án muốn sử dụng C++ cho sự phát triển của nó nhưng có một cơ sở mã Fortran khổng lồ.

Bạn cũng có thể xem "Khoa học và Kỹ thuật C++: Giới thiệu với các kỹ thuật và ví dụ nâng cao" của Barton và Nackman, có sẵn từ các cửa hàng sách tốt. Cuốn sách này dạy C++ cho các lập trình viên của Fortran. Nó có một vài ví dụ về cách viết trình bao bọc cho mã Fortran từ C++. Nó là một cuốn sách C++ tốt bỏ qua khía cạnh Fortran. Nó được viết trước khi tiêu chuẩn được thiết lập nhưng sự khác biệt không phải là rất lớn.

+0

Tại công ty chúng tôi, chúng tôi thấy rằng các lập trình viên của Fortran đang trở nên khó tìm. – EvilTeach

0

Tôi đã làm việc trên một ứng dụng mà, tại trung tâm của nó, là mã được chuyển đổi từ FORTRAN sử dụng for_c. Mã nó tạo ra là thần khủng khiếp. Rất khó duy trì vì hầu hết nó không thể giải mã được. May mắn là đoạn mã đó khá ổn định và hiếm khi mọi thứ phải được thực hiện với nó.

Tuy nhiên, điều này đã được thực hiện từ nhiều năm trước - khoảng 16 năm đầu của Windows. Có lẽ for_c tốt hơn bây giờ?

Các vấn đề liên quan