Fortan77 프로그램을 C #으로 변환하려고합니다. 나는 약 650 줄의 코드와 끔찍한 GOTO 문을 가진 서브 루틴을 가지고 있습니다. 서브 루틴의 흐름을 시각화하여 그것이 무엇을하는지 파악하기 시작하기까지 많은 어려움을 겪고 있습니다.
이 서브 루틴에 대한 개요를 얻는 방법에 대한 조언을 해 줄 수있는 이런 종류의 경험이있는 사람이 있습니까? 이러한 유형의 변환을 가속화하거나 촉진하는 데 사용할 수있는 도구가 있습니까?
Fortan77 프로그램을 C #으로 변환하려고합니다. 나는 약 650 줄의 코드와 끔찍한 GOTO 문을 가진 서브 루틴을 가지고 있습니다. 서브 루틴의 흐름을 시각화하여 그것이 무엇을하는지 파악하기 시작하기까지 많은 어려움을 겪고 있습니다.
이 서브 루틴에 대한 개요를 얻는 방법에 대한 조언을 해 줄 수있는 이런 종류의 경험이있는 사람이 있습니까? 이러한 유형의 변환을 가속화하거나 촉진하는 데 사용할 수있는 도구가 있습니까?
답변:
내 경험상, 이것에 대한 좋은 방법은 Fortran 코드의 흐름도를 만드는 것입니다. GOTO 문의 대상을 별도의 블록으로 분리하고 다이어그램을 사용하여 코드를 높은 수준으로 이해하십시오.
논리적으로 GOTO를 루프 또는 함수 호출로 바꿀 수 있는지 확인하십시오. 결과 다이어그램이 트리 구조의 형태 인 경우 GOTO를 사용하지 않고 C #으로 변환하기가 비교적 쉽습니다. 결국 결과를 자신있게 유지하고 사용할 수 있으려면 코드를 자세히 이해해야합니다.
goto
는 현명하게 적용하면 매우 유용한 것입니다. 가 없으면 효율적이고 큰 상태의 자동 장치를 구현하지 않을 것 goto
입니다. 생성 된 코드에도 반드시 필요합니다.
Daniel B가 위에서 쓴 것 외에도 다음과 같이 말할 것입니다.
먼저 Fortran 코드를 Fortran과 함께 사용하여 DotNet에서 사용하십시오. "재 프로그래밍으로 아무 데나 갈 수없는 경우"가 아니라 재 프로그래밍을 시도하기 전에는 아닙니다. 작은 단계이지만 올바른 방향으로 진행됩니다.
그런 다음 C #으로 테스트 스위트를 작성하여 Fortran 코드에 입력을 입력하고 출력을 저장하십시오. 테스트 스위트를 한 번 실행하고 출력을 저장하십시오. 그런 다음 테스트 스위트를 확장하여 저장된 출력에 대해 생성 된 출력을 테스트하십시오. Fortran 코드가 동일한 입력을 공급할 때 항상 동일한 출력을 생성한다고 가정하면 테스트는 성공해야합니다.
그런 다음 C #으로 코드를 다시 작성하는 동안 테스트 스위트에서 코드를 실행하고 코드가 올바르게 작동하는지 여부, 즉 Fortran과 정확히 동일한 출력을 생성하는지 여부를 알려줍니다 동일한 입력이 주어진 코드. 그것 없이는, 당신은 길을 잃을 것입니다.
@ SK-logic에 동의하지 않으므로 C # 코드에서 gotos를 전혀 사용할 필요가 없습니다.
그러나 일단 DotNet에서 Fortran 코드 작업을 한 후에는 스파게티 코드를 C #으로 변환하는 데 시간을 낭비 할 이유가 없습니다.
goto
는 또한 어떤 경우에는 코드를 이해하기 어렵게 만들 수 있습니다 (그리고 상태 머신이 그러한 경우의 가장 중요한 예입니다). 나는이 어리석은 goto-bashing 종교를 참을 수 없다-사람들은 goto가 해로운 것으로 여겨지는 이유를 이해하려고 시도하지 않고 같은 의미없는 BS를 계속 반복한다.
당신의 작업은 까다 롭습니다. 포트란을 잘 알아야합니다. 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를 사용하여 원래 코드를 컴파일하고 다시 포맷 된 코드를 정기적으로 확인하여 다시 포맷하면 오류가 발생하지 않도록했습니다.
의심의 여지없이 가장 좋은 방법은 먼저 FORTRAN 코드를보다 체계적이고 논리적으로 다시 작성 / 리팩터링하는 것입니다. 그러면 C #으로 포팅하기 전에 원래 로직을 이해하게됩니다.
내가 접근하는 방법은 다음과 같습니다.
C #이 C와 마찬가지로 gotos와 레이블을 지원하므로 원래 FORTRAN과 동일한 goto 문으로 끝나는 자동 코드 변환기로 시간을 낭비하지 마십시오.
다른 방법으로 실패하면 C #에서 goto 문을 사용할 수 있습니다 .
고토 문은 레이블 문에 직접 프로그램 제어를 전송합니다.
의 일반적인 사용 고토는 A의 특정 스위치의 경우 라벨 또는 기본 레이블로 제어를 전송하는 것입니다 스위치 문.
고토 문은 중첩 루프 밖으로 얻을하는 데 유용합니다 ...
기존 FORTRAN 코드를 새로운 언어로 변환하려면 누군가가 레거시 코드에서 몇 가지 기본 단계를 수행해야합니다 (1) 정적 유형 확인을 위해 코드를 "IMPLICIT NONE"으로 변환 (2) 잘린 공통을 완전 공통으로 변환 (3) 제거 동등성 (4) 공통을 FORTRAN 90의 모듈로 변환
그런 다음 다른 언어로 변환을 시도 할 수 있습니다.