Fortran 77 코드를 C #으로 변환 GOTO 문을

Fortan77 프로그램을 C #으로 변환하려고합니다. 나는 약 650 줄의 코드와 끔찍한 GOTO 문을 가진 서브 루틴을 가지고 있습니다. 서브 루틴의 흐름을 시각화하여 그것이 무엇을하는지 파악하기 시작하기까지 많은 어려움을 겪고 있습니다.

이 서브 루틴에 대한 개요를 얻는 방법에 대한 조언을 해 줄 수있는 이런 종류의 경험이있는 사람이 있습니까? 이러한 유형의 변환을 가속화하거나 촉진하는 데 사용할 수있는 도구가 있습니까?



답변

내 경험상, 이것에 대한 좋은 방법은 Fortran 코드의 흐름도를 만드는 것입니다. GOTO 문의 대상을 별도의 블록으로 분리하고 다이어그램을 사용하여 코드를 높은 수준으로 이해하십시오.

논리적으로 GOTO를 루프 또는 함수 호출로 바꿀 수 있는지 확인하십시오. 결과 다이어그램이 트리 구조의 형태 인 경우 GOTO를 사용하지 않고 C #으로 변환하기가 비교적 쉽습니다. 결국 결과를 자신있게 유지하고 사용할 수 있으려면 코드를 자세히 이해해야합니다.


답변

Daniel B가 위에서 쓴 것 외에도 다음과 같이 말할 것입니다.

먼저 Fortran 코드를 Fortran과 함께 사용하여 DotNet에서 사용하십시오. “재 프로그래밍으로 아무 데나 갈 수없는 경우”가 아니라 재 프로그래밍을 시도하기 전에는 아닙니다. 작은 단계이지만 올바른 방향으로 진행됩니다.

그런 다음 C #으로 테스트 스위트를 작성하여 Fortran 코드에 입력을 입력하고 출력을 저장하십시오. 테스트 스위트를 한 번 실행하고 출력을 저장하십시오. 그런 다음 테스트 스위트를 확장하여 저장된 출력에 대해 생성 된 출력을 테스트하십시오. Fortran 코드가 동일한 입력을 공급할 때 항상 동일한 출력을 생성한다고 가정하면 테스트는 성공해야합니다.

그런 다음 C #으로 코드를 다시 작성하는 동안 테스트 스위트에서 코드를 실행하고 코드가 올바르게 작동하는지 여부, 즉 Fortran과 정확히 동일한 출력을 생성하는지 여부를 알려줍니다 동일한 입력이 주어진 코드. 그것 없이는, 당신은 길을 잃을 것입니다.

@ SK-logic에 동의하지 않으므로 C # 코드에서 gotos를 전혀 사용할 필요가 없습니다.

그러나 일단 DotNet에서 Fortran 코드 작업을 한 후에는 스파게티 코드를 C #으로 변환하는 데 시간을 낭비 할 이유가 없습니다.


답변

당신의 작업은 까다 롭습니다. 포트란을 잘 알아야합니다. Fortran이 유사 / 다른 계산을 수행하는 방식과 잘림 및 반올림 규칙이 적용되는 경우주의해야합니다. 또한 C # 및 Fortran의 기본 유형 의미에주의해야합니다.

제안 된 것의 또 다른 접근법 (더 나은 방법은 아니지만 다른 방법 일뿐입니다) :

A-비즈니스 지식과 기능에 따라 C #으로 코드를 다시 작성하는 것을 고려하고 Fortran 코드를 참조로 사용하십시오.

B-변환 작업을 수행하는 상용 도구 사용 고려-예 : DataTek

루틴이 표준 함수 또는 준비된 dll을 구매할 수있는 기능 (예 : 수치 통합)을 나타내는 경우 수동 변환 대신 표준 함수 또는 상용 제품을 사용하면 문제가 해결됩니다.

위의 방법으로 문제가 해결되지 않으면이 질문에 대답하십시오.

코드를 최적화하거나 실행해야합니까? 다시 말해, 코드를 개선하기 위해 500 시간을 소비하는 비즈니스 가치는 무엇입니까?

최적화에 값이 없으면 코드를 한 줄씩 변환하면 완료됩니다.

이것이 여전히 좋지 않으면 다음을 수행하십시오.

0-Fortran 코드를 한 줄씩 C #으로 변환 (또는 Fortan CLR 사용)

1- 빠른 테스트를 수행하여 실행되는지 확인하십시오.

2- 리팩토링 (상업용 도구 사용 가능)을 사용하면 코드를보다 최적화 된 방식으로 작성할 수 있습니다.

행운을 빕니다.


답변

gotos가 많은 물건을 레코딩하는 간단한 방법은 플로우 차트를 그리고 문자열을 똑바로 당기는 것입니다. 때때로 F77 프로그램은 오래된 F66 프로그램이거나 더 나쁜 FII 프로그램입니다. F66에는 if-then-else 구조가 없으므로 gotos가 필요했습니다. if-then을 얻기 위해 조건을 반전시키기 만하면됩니다.

F66에는 do-while이 없지만 F77에는 없습니다. F66과 같은 F77을 사용하는 코더가 F66에서 F77로 변환했는지 (오늘날 많은 사람들이 C에서 C ++로 또는 C ++에서 C #로) 변환했는지에 따라 다릅니다. 코딩에서 패턴을 발견 할 수 있으면 변환하기가 훨씬 쉽습니다.


답변

시작하기 전에 기존 코드를 테스트하기위한 테스트 스위트를 만드십시오. 이것이 행동에 빛을 비추는 데 도움이 될 수 있으므로 매우주의하십시오. 그런 다음이 제품군을 사용하여 전환의 효율성을 측정 할 수 있습니다.

그 외에도 체계적 이며 서두르지 말고 많은 종이를 사용하여 기능을 추적하십시오.


답변

다음은 실제로 코드를 C #으로 변환하는 방법입니다. .NET은 goto 문을 지원하기 때문에 먼저 전체 포트란 코드를 가져 와서 새 메소드에 붙여 넣었습니다.

컴파일러는 선언되지 않은 변수와 잘못된 블록 명령문 형식에 관한 백만 가지 오류를 발견했습니다. 또한 I / O 문과 같은 Fortran 관련 코드 중 일부를 다시 작성해야했습니다. 그것이 완료되었을 때 나는 원래 코드의 정확한 복제본을 가지고있었습니다.

Visual Studio의 멋진 형식 덕분에 논리 블록은 원래 코드보다 훨씬 쉽게 식별 할 수있었습니다. 그리고 나는 goto 진술을 하나씩 풀기 시작할 수 있습니다.

이 경험을 통해 goto 문이 실제로 동일한 코드를 반복해서 다시 작성하지 않아도 매우 유용한 경우가 많이 있지만, 많은 경우 메소드를 사용하고 반복적으로 호출하여 동일한 코드를 얻을 수 있습니다. .

또한 무료 버전의 Silverfrost를 사용하여 원래 코드를 컴파일하고 다시 포맷 된 코드를 정기적으로 확인하여 다시 포맷하면 오류가 발생하지 않도록했습니다.


답변

이러한 코드를 “컴파일 해제”하는 일반적인 방법은 다음과 같습니다.

  • 먼저 하위 레벨 형식으로 컴파일하십시오 (예 : LLVM)
  • SSA 변환 을 수행 하십시오 (지역 변수 정리에 도움이 될 것입니다)
  • 돌이킬 수없는 제어 흐름 분할 (있는 경우)
  • 루프와 if를 감지하고 적절한 고수준 구성으로 교체

LLVM의 자체 C 백엔드는 초안을 제공 할 수 있습니다.