Fortran 77 코드의 큰 프로그램 (우리는 550,000 라인)을 C++로 변환 한 사람이 있습니까? 어떤 함정에 빠져 들었습니까? 전환이 성공 했습니까? for_c
(http://www.cobalt-blue.com/fc/fcmain.htm)과 같은 도구를 사용하셨습니까? 결과 C++ 코드가 상당히 빠르거나 느린가요?Fortran 77 코드를 C++로 변환
답변
한 번 사용 : http://manpages.ubuntu.com/manpages/hardy/man1/f2c.html 작은 포트란 프로그램을 C로 변환했습니다. 변환에 성공했습니다. 이 코드는 어떤 종류의 속도 변화도 감지하기에는 상당히 복잡하지 않았습니다.
귀하의 프로그램이 더 커지기 때문에 모든 것이 저와 같이 돌아가고 있는지를 알지 못합니다.
나는 적당한 크기의 포트란 코드에서 몇 년 전에 f2c를 사용했다. 이미 품질이 떨어 졌던 (가독성 용어) 포트란 코드는 번역을 거친 후 끔찍한 것으로 떨어졌다. 읽을 수있는 C로 변환하기 위해 수작업으로 많은 노력이 필요했다. – nsanders
고려해야 할 사항이 많이 있습니다.
실제로 두 가지 경로가 있습니다. 하나는 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 장기간 유지하려면 재 작성을 권장합니다. 시간이 많이 걸리 겠지만, 더 빨라지지만 장기적으로 유지 보수가 가능합니다.
다행히도 개발 계획에 도움이되는 단위 테스트 세트를 작성하기위한 기본 프로그램이 있습니다.
그래, 나는 배열 subscripting에 대해 궁금해하고 있습니다. 실제로 단일 dimensioned 배열이 아니라 여러 dimensioned 배열 다소 날 걱정합니다 .BTW, FOR_C 자체 RTL 또한 그것을 대체 할 수 있습니다. WRITE와 READ를위한 tes. –
f2c는 Fortran 77을 컴파일하고 C 컴파일러를 사용하려는 경우 유용한 도구입니다. Fortran을 C 또는 C++로 변환하고 컴파일 된 코드 이외의 다른 것을 사용하려는 경우에는 매우 나쁜 것입니다. –
이것은 EvilTeach의 조언에 추가됩니다. Fortran 77 및 C/C++ 코드는 매우 쉽기 때문에 응용 프로그램의 부분을 점진적으로 변환하고 이전 부분과 함께 연결할 수 있습니다. 이렇게하면 모든 일반적인 포트란/c 불일치 (행/열 제목 배열, 배열 인덱싱 등)에 대해 생각해야하지만, 자동 번역 된 코드베이스를 한꺼번에 디버깅하는 번거 로움을 줄일 수 있습니다 .
이전 Fortran 코드에 상당한 투자를 한 국립 연구소 (DOE) 연구소에서 이와 같이 많은 대형 혼합 코드가 있습니다. 이 경로를 간다면 동일한 응용 프로그램에서 C, C++, Fortran, Fortran90, Python 및 Java간에 구성 요소를 공유 할 수 있도록 개발 된 Babel을 사용하는 것이 좋습니다. 이 실험실에서의 동기는 실제로 대규모 시뮬레이션을 위해 여러 팀이 만든 물리 모델을 연결하는 것이지만 코드를 전환하는 데 유용하다는 것을 알 수 있습니다. 많은 프로젝트에서 적극적으로 유지 관리되고 사용되지만, 수행하려는 작업에 너무 복잡 할 수도 있습니다.
예. 증분 포트, 아주 좋은 생각이야. – EvilTeach
예, 증분이 가능합니다. BTW, 우리는 이미 C 및 C++ 코드를 10,000 줄 가지고 있습니다. F77 코드는 실제로 C, C++ 또는 VB에서 호출 할 수있는 Win32 DLL에 있습니다. –
Promula을 살펴볼 수 있습니다. 다른 많은 자동 번역기보다 더 읽기 쉬운 C 코드를 생성합니다. 나는 Promula를 직접 사용하지 않았지만 C에서 C++로 상당히 많은 양의 Promula 출력을 변환했습니다. C 코드를 합법적 인 C++로 정리하는 것은 쉽지만, 물론 C++을 실제로 훌륭하게 만들려면 더 많은 노력이 필요합니다.
내 반응은 왜 변환 하시겠습니까?
큰 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++ 책입니다. 그것은 표준이 설정되기 전에 작성되었지만 그 차이는 그리 크지 않습니다.
우리 회사에서는 Fortran 프로그래머가 찾기 어려워지고 있음을 발견했습니다. – EvilTeach
저는 심장부가 for_c을 사용하여 FORTRAN에서 코드로 변환 된 응용 프로그램을 작성했습니다. 그것이 만든 코드는 끔찍한 것이 었습니다. 그것의 대부분이 해독 할 수 있었기 때문에 유지하기가 매우 어려웠습니다. 다행히도 그 코드는 꽤 안정적이었고, 그 코드는 아무 것도 할 수 없었습니다.
그러나이 작업은 수년 전에 이루어졌으며 16 비트 Windows 초기에 수행되었습니다. 아마 for_c가 더 나아 졌을까요?
와우, 나는 너를 부러워하지 않는다. –
왜 변환하는거야? –
당신은 오래된 농담을 알고 있습니다. "rm * f는 모든 포트란 소스를 무료 디스크 블록으로 변환하여 올바르게 작성하기 시작할 수있는 자동 도구입니다." –