2008-11-09 9 views
14

Fortran 77 코드의 큰 프로그램 (우리는 550,000 라인)을 C++로 변환 한 사람이 있습니까? 어떤 함정에 빠져 들었습니까? 전환이 성공 했습니까? for_c (http://www.cobalt-blue.com/fc/fcmain.htm)과 같은 도구를 사용하셨습니까? 결과 C++ 코드가 상당히 빠르거나 느린가요?Fortran 77 코드를 C++로 변환

+3

와우, 나는 너를 부러워하지 않는다. –

+0

왜 변환하는거야? –

+4

당신은 오래된 농담을 알고 있습니다. "rm * f는 모든 포트란 소스를 무료 디스크 블록으로 변환하여 올바르게 작성하기 시작할 수있는 자동 도구입니다." –

답변

3

한 번 사용 : http://manpages.ubuntu.com/manpages/hardy/man1/f2c.html 작은 포트란 프로그램을 C로 변환했습니다. 변환에 성공했습니다. 이 코드는 어떤 종류의 속도 변화도 감지하기에는 상당히 복잡하지 않았습니다.

귀하의 프로그램이 더 커지기 때문에 모든 것이 저와 같이 돌아가고 있는지를 알지 못합니다.

+0

나는 적당한 크기의 포트란 코드에서 몇 년 전에 f2c를 사용했다. 이미 품질이 떨어 졌던 (가독성 용어) 포트란 코드는 번역을 거친 후 끔찍한 것으로 떨어졌다. 읽을 수있는 C로 변환하기 위해 수작업으로 많은 노력이 필요했다. – nsanders

9

고려해야 할 사항이 많이 있습니다.

실제로 두 가지 경로가 있습니다. 하나는 c로 직접 변환하는 것입니다. 그 말은 모든 포트란 진술이 동등한 C 진술에 있음을 의미합니다.

다른 경로는 다시 작성하고 500k loc +로하면 더 많은 작업이 수행됩니다. 그런 종류의 크기로, 저는 f2c와 같은 번역을 할 수있는 도구를 찾을 것입니다. 직선 포트

문제 ...

gotos 당신이 고토 대상에 대해 레이블을 만들어야합니다, 직접 번역합니다.

label10:; 

    goto label10; 

배열 서브 스크립팅은 잠재적 인 문제입니다. c는 0을 기반으로하므로 포트란은 1을 기반으로하므로 배열은 포트란 코드에서 하나 더 커야합니다.

* 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 배열 액세스는 행의 주요 순서이며, 포트란은 주요 열입니다. 성능 문제가 될 수있는 입니다. 문제가되는 경우 을 사용하여 순서 또는 배열 첨자를 뒤집는 매크로 정의로 문제를 해결할 수 있습니다. 사실 매크로는 하나의 기본 배열처럼 보일 수 있도록 각 첨자의 매크로를 뺄 수 있습니다. 실제로는 0에 기반한 배열로 매핑됩니다.

A (XMAX, Ymax와) IO가 STDIO 형 파일을 시뮬레이션 할 수있는 (4,2) = 3.14

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

FORTRAN 부 8 * 실제. 장치 19를 사용하는 경우

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

파일에 fortran 캐리지 제어 기능을 사용하는 경우 캐리지 제어에 문제가있을 수 있습니다. 유닛 5와 6은 stdin으로 간단하게 참조 할 수 있고 stdout은 fopen없이 참조 할 수 있습니다.

printf 계열의 함수로 많은 형식을 처리 할 수 ​​있습니다. Fortran 배열 io 중 일부를 처리하려면 추가 루프를 추가해야 할 수도 있습니다.

WRITE (6, 200) (PROJ (Z, 4), Z = 1, 20) F2C를 사용하여이를 수행 할 수있는 가장 빠른 방법 아마 O를

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


. 그렇다면 당신은 그것의 RTL에 붙어 있습니다.
직접 포트를 사용하는 것은 할 수있는 일입니다. 시간이 많이 걸리지 만 할 수 있습니다.
o 장기간 유지하려면 재 작성을 권장합니다. 시간이 많이 걸리 겠지만, 더 빨라지지만 장기적으로 유지 보수가 가능합니다.

다행히도 개발 계획에 도움이되는 단위 테스트 세트를 작성하기위한 기본 프로그램이 있습니다.

+0

그래, 나는 배열 subscripting에 대해 궁금해하고 있습니다. 실제로 단일 dimensioned 배열이 아니라 여러 dimensioned 배열 다소 날 걱정합니다 .BTW, FOR_C 자체 RTL 또한 그것을 대체 할 수 있습니다. WRITE와 READ를위한 tes. –

+0

f2c는 Fortran 77을 컴파일하고 C 컴파일러를 사용하려는 경우 유용한 도구입니다. Fortran을 C 또는 C++로 변환하고 컴파일 된 코드 이외의 다른 것을 사용하려는 경우에는 매우 나쁜 것입니다. –

9

이것은 EvilTeach의 조언에 추가됩니다. Fortran 77 및 C/C++ 코드는 매우 쉽기 때문에 응용 프로그램의 부분을 점진적으로 변환하고 이전 부분과 함께 연결할 수 있습니다. 이렇게하면 모든 일반적인 포트란/c 불일치 (행/열 제목 배열, 배열 인덱싱 등)에 대해 생각해야하지만, 자동 번역 된 코드베이스를 한꺼번에 디버깅하는 번거 로움을 줄일 수 있습니다 .

이전 Fortran 코드에 상당한 투자를 한 국립 연구소 (DOE) 연구소에서 이와 같이 많은 대형 혼합 코드가 있습니다. 이 경로를 간다면 동일한 응용 프로그램에서 C, C++, Fortran, Fortran90, Python 및 Java간에 구성 요소를 공유 할 수 있도록 개발 된 Babel을 사용하는 것이 좋습니다. 이 실험실에서의 동기는 실제로 대규모 시뮬레이션을 위해 여러 팀이 만든 물리 모델을 연결하는 것이지만 코드를 전환하는 데 유용하다는 것을 알 수 있습니다. 많은 프로젝트에서 적극적으로 유지 관리되고 사용되지만, 수행하려는 작업에 너무 복잡 할 수도 있습니다.

+0

예. 증분 포트, 아주 좋은 생각이야. – EvilTeach

+0

예, 증분이 가능합니다. BTW, 우리는 이미 C 및 C++ 코드를 10,000 줄 가지고 있습니다. F77 코드는 실제로 C, C++ 또는 VB에서 호출 할 수있는 Win32 DLL에 있습니다. –

2

Promula을 살펴볼 수 있습니다. 다른 많은 자동 번역기보다 더 읽기 쉬운 C 코드를 생성합니다. 나는 Promula를 직접 사용하지 않았지만 C에서 C++로 상당히 많은 양의 Promula 출력을 변환했습니다. C 코드를 합법적 인 C++로 정리하는 것은 쉽지만, 물론 C++을 실제로 훌륭하게 만들려면 더 많은 노력이 필요합니다.

6

내 반응은 왜 변환 하시겠습니까?

큰 Fortran 코드 기반의 제품을 개발하는 방법에 대한 질문은 1990 년대 수많은 회사에서 조사되었습니다. 그것은 변환 할 것인지, Fortran과 함께 머무를 것인지 또는 하이브리드를 생산할 것인지 여부입니다. 대다수가 하이브리드 접근법을 선택했다고 생각합니다. 대개 C++을 사용자 인터페이스 용으로 사용하고 원래의 Fortran 코드를 백그라운드로 사용합니다.

나의 제안은 Carsten Arnholm의 "C++ and FORTRAN 77을 사용한 혼합 언어 프로그래밍"을 http://arnholm.org/software/cppf77/cppf77.htm에서 볼 수있다. 인터넷 초기에이 문서는 잘 링크되어 있었다.

이 문서에서는 C++ 및 Fortran이 포함 된 응용 프로그램을 만드는 방법을 설명합니다. 기술적 세부 사항 중 일부가 구식인지 여부는 말할 수 없지만이 문서는 개발을 위해 C++을 사용하려고했지만 거대한 Fortran 코드 기반을 가지고있는 프로젝트에서 나왔습니다.

좋은 서점에서 구할 수있는 Barton 및 Nackman의 "과학 및 공학 C++ : 고급 기법 및 예 소개"를 참고하십시오. 이 책은 Fortran 프로그래머에게 C++을 가르칩니다. C++에서 Fortran 코드에 래퍼를 작성하는 몇 가지 예가 있습니다. Fortran 측면을 무시한 좋은 C++ 책입니다. 그것은 표준이 설정되기 전에 작성되었지만 그 차이는 그리 크지 않습니다.

+0

우리 회사에서는 Fortran 프로그래머가 찾기 어려워지고 있음을 발견했습니다. – EvilTeach

0

저는 심장부가 for_c을 사용하여 FORTRAN에서 코드로 변환 된 응용 프로그램을 작성했습니다. 그것이 만든 코드는 끔찍한 것이 었습니다. 그것의 대부분이 해독 할 수 있었기 때문에 유지하기가 매우 어려웠습니다. 다행히도 그 코드는 꽤 안정적이었고, 그 코드는 아무 것도 할 수 없었습니다.

그러나이 작업은 수년 전에 이루어졌으며 16 비트 Windows 초기에 수행되었습니다. 아마 for_c가 더 나아 졌을까요?