Fortran 77 코드를 C #으로 변환


14

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

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


1
이 질문 종료와 조언을 찾고 더 열려, 그것은 프로그래머 SE에 더 적합 할 것

4
silverfrost.com/11/ftn95/ftn95_fortran_95_for_windows.aspx를 사용하여 .NET으로 컴파일 한 다음 어셈블리를 참조하는 것을 고려 했습니까?

@Shaun, 좋은 생각입니다 Shaun. 나는 재 프로그래밍으로 아무데도 갈 수 없다면 그것을 볼 것입니다.
user643192

2
유감입니다 ...
marko

1
나는 너의 자리에 있었다. 내 경력의 최악의 날이었다.
사용자

답변:


10

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

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


좋은 제안, 감사합니다! GOTO 문구는 금지해야합니다.
user643192

6
@ user643192 goto는 현명하게 적용하면 매우 유용한 것입니다. 가 없으면 효율적이고 큰 상태의 자동 장치를 구현하지 않을 것 goto입니다. 생성 된 코드에도 반드시 필요합니다.
SK-logic

3
포트란 코드에서 플로우 차트를 그릴 수있는 도구가 있습니다. 예 : home.comcast.net/~lchen223621
NoChance

OP : 소급 적으로 금지 할 수는 없습니다. @EmmadKareem : 매우 유용한 제안.
Kris

나는 Daniel B가 여기에서 제안한 것을 끝내고 Fortran 코드의 블록 버전을 만들었습니다. 큰 도움이되었으므로 감사합니다. SK-logic에게는 아마도 GOTO에 관한 것이 옳을 것입니다. 내 의견은 첫 오후 오후에 코드를 살펴본 후에 이루어졌으며 여기에는 많은 GOTO가 있습니다 : o (
user643192

12

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

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

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

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

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

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


1
마음 설명, "왜 안돼"? 모든 합리적인 인수 외에 "모든 사람은 악하다고 생각합니다"? 나는 당신이 매우 중요한 경우라는 이름의 그렇지 않으면 당신이 중 하나를 읽을 수 없거나 unefficient 코드 (또는 둘 다)를 작성하게 될 겁니다, 고토를 사용합니다.
SK-logic

@ SK-logic 나는 "당신은해서는 안된다"라고 쓰지 않았고, "당신은해서는 안된다"라고 썼다. 어쨌든 여기에 간다 : goto 문은 거의 모든 상황에서 코드를 이해하고 정확성을 검증하기가 매우 어렵고 효율성으로 인한 이익은 신화와 오해 사이에 있다고 생각합니다. 물론 이것들은 더 명확 해 질 수 있지만, 그렇게하지 말아주세요.이 토론의 장소는 아닙니다. 동의하지 않기 만합시다.
Mike Nakis

2
엄밀한 정치가 goto는 또한 어떤 경우에는 코드를 이해하기 어렵게 만들 수 있습니다 (그리고 상태 머신이 그러한 경우의 가장 중요한 예입니다). 나는이 어리석은 goto-bashing 종교를 참을 수 없다-사람들은 goto가 해로운 것으로 여겨지는 이유를 이해하려고 시도하지 않고 같은 의미없는 BS를 계속 반복한다.
SK-logic

당신은 마지막 단어가 없다면 참을 수없는 사람들 중 하나입니다. C-: =
Mike Nakis

1
@ ridecar2, 나는 항상 좋은 상태 머신을 작성합니다. 열거 형과 switch 문을 사용하고 컴파일러에서 생성 된 기계 언어로 GOTO를 작성하도록했습니다. 실제로 GOTO로 명시 적으로 작성된 상태 머신의 예를 본 적이 없습니다. 예제에 대한 포인터를 게시 하시겠습니까?
John R. Strohm

3

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

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

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

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

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

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

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

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

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

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

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

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

행운을 빕니다.


2

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

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


1

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

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


1

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

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

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

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

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


0

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

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

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


0

의심의 여지없이 가장 좋은 방법은 먼저 FORTRAN 코드를보다 체계적이고 논리적으로 다시 작성 / 리팩터링하는 것입니다. 그러면 C #으로 포팅하기 전에 원래 로직을 이해하게됩니다.

내가 접근하는 방법은 다음과 같습니다.

  • 기존 코드와 필요한 경우 리팩터링을 이해하고 FORTRAN으로 다시 작성하여 작동하는지 쉽게 테스트 할 수 있습니다.
  • 리팩토링 된 코드를 C #으로 이식

C #이 C와 마찬가지로 gotos와 레이블을 지원하므로 원래 FORTRAN과 동일한 goto 문으로 끝나는 자동 코드 변환기로 시간을 낭비하지 마십시오.


0

다른 방법으로 실패하면 C #에서 goto 문을 사용할 수 있습니다 .

고토 문은 레이블 문에 직접 프로그램 제어를 전송합니다.

의 일반적인 사용 고토는 A의 특정 스위치의 경우 라벨 또는 기본 레이블로 제어를 전송하는 것입니다 스위치 문.

고토 문은 중첩 루프 밖으로 얻을하는 데 유용합니다 ...


-2

기존 FORTRAN 코드를 새로운 언어로 변환하려면 누군가가 레거시 코드에서 몇 가지 기본 단계를 수행해야합니다 (1) 정적 유형 확인을 위해 코드를 "IMPLICIT NONE"으로 변환 (2) 잘린 공통을 완전 공통으로 변환 (3) 제거 동등성 (4) 공통을 FORTRAN 90의 모듈로 변환

그런 다음 다른 언어로 변환을 시도 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.