문제

저는 최근에 대량의 과학적인 계산 집약적인 FORTRAN 코드를 관리하게 되었습니다.나는 구글과 두 권의 입문용 책에도 불구하고 40년 된 언어의 모든 뉘앙스를 이해하는 데 어려움을 겪고 있습니다.코드에는 "성능 향상 개선"이 가득합니다.누구든지 이에 대한 지침이나 실질적인 조언이 있습니까? - FORTRAN을 CS 101 수준으로 최적화하고 있습니까?FORTRAN 코드 최적화가 어떻게 작동하는지 아는 사람이 있습니까?FORTRAN 77/90 코드베이스를 인수하는 Java/C++/.NET 개발자에게 발생하지 않을 수 있는 일반적인 FORTRAN '문제'가 있습니까?

도움이 되었습니까?

해결책

그때 프로그래머가했던 일에 대해 "느낌"을 가져야합니다. 내가 작업하는 대부분의 코드는 나보다 오래되었고 부모님이 고등학교에 다니셨을 때 "새로운"컴퓨터에서 실행되었습니다.

가독성을 떨어 뜨리는 일반적인 FORTRAN-ism은 다음과 같습니다.

  • 공통 블록
  • 암시 적 변수
  • 공유 CONTINUE 문이있는 2 ~ 3 개의 DO 루프
  • DO 루프 대신 GOTO
  • 산술 IF 문
  • 계산 된 GOTO
  • 일부 공통 블록에서 REAL / INTEGER / other 등가

    이를 해결하기위한 전략에는 다음이 포함됩니다.

    1. 돈 가치가있는 Spag / plusFORT 를 얻으십시오. 자동으로 많은 문제를 해결하고 버그가 없습니다 ( tm)
    2. 가능하면 Fortran 90으로 이동하고, 자유 형식 Fortran 77로 이동하지 않는 경우
    3. 각 서브 루틴에 IMPLICIT NONE을 추가 한 다음 모든 컴파일 오류를 수정하여 시간이 많이 걸리지 만 궁극적으로 필요한 경우 일부 프로그램에서 자동으로이 작업을 수행하거나 스크립트를 작성할 수 있습니다.
    4. 모든 COMMON 블록을 MODULE, 낮은 매달린 과일로 이동, 그만한 가치가 있습니다.
    5. 산술 IF 문을 IF..ELSEIF..ELSE 블록으로 변환
    6. 계산 된 GOTO를 SELECT CASE 블록으로 변환
    7. 모든 DO 루프를 최신 F90 구문으로 변환

      myloop: do ii = 1, nloops
          ! do something
      enddo myloop
      

    8. 동등한 공통 블록 멤버를 모듈에 할당 된 ALLOCATABLE 메모리로 변환하거나 Hollerith가 REAL에 저장되는 경우 해당 문자 루틴으로 변환

      가독성 작업을 수행하는 방법에 대해 더 구체적인 질문이 있으면 조언을 드릴 수 있습니다. 40 년에 걸쳐 작성된 몇 십만 줄의 Fortran 코드베이스를 가지고 있으며 어떤 식 으로든 책임을지고 있으므로 발견 할 수있는 "문제"를 발견했을 것입니다.

다른 팁

기존 Fortran Soapbox

나는 꽤 오랫동안 레거시 Fortran 코드 기반을 유지 / 개선하는 데 도움을 받았고 대부분의 경우 sixlettervariables 가 비용이 든다고 생각했습니다. 하지만 그 조언은 기술적 인 경향이 있습니다. 더 어려운 행은 "우수 사례"를 구현하는 것입니다.

  • 필수 코딩 스타일 및 코딩 지침을 설정합니다.
  • 코드베이스에 제출 된 모든 항목에 대해 코드 검토 (코더 이상!)를 요구합니다. (버전 제어는이 프로세스와 연결되어야합니다.)
  • 단위 테스트 빌드 및 실행을 시작합니다. 벤치 마크 또는 회귀 테스트도 마찬가지입니다.

    요즘은 당연한 것처럼 들릴지 모르지만 과도하게 일반화 될 위험이 있지만 대부분의 포트란 코드 상점은 확고한 문화를 가지고 있으며 일부는 "소프트웨어 엔지니어링"이라는 용어가 존재하기 전에 시작되었으며 시간이 지남에 따라 지배적으로 오는 것은 "지금해라"입니다. (이것은 Fortran 상점에만있는 것은 아닙니다.)

    고차 포용

    하지만 이미 존재하는 끔찍한 오래된 레거시 코드베이스로 무엇을해야할까요? 재 작성에 대해 Joel Spolsky와 동의합니다. 하지 말아야합니다. . 그러나 제 생각에 sixlettervariables 는 허용 가능한 예외를 가리 킵니다. 소프트웨어 도구를 사용하여 더 나은 Fortran 구조로 전환 코드 분석기 ( FORCHECK ) 및 코드 재 작성기 ( plusFORT 입니다. 손으로해야하는 경우 긴급한 이유가 있는지 확인하십시오. (저는 소프트웨어 버그 수정에서 나온 소프트웨어 버그의 수에 대한 언급이 있었으면 좋겠습니다. 겸손합니다. 그런 통계가 전문가 C 프로그래밍 .)

    Fortran gotchas 게임에서 승리하는 가장 좋은 공격은 아마도 최고의 방어력을 갖는 것입니다. 언어를 상당히 잘 아는 것입니다. 이를 위해 책을 추천합니다!

    포트란 죽은 나무 도서관

    저는 수년 동안 "QA nag"로서 약간의 성공을 거두었지만 교육은 때때로 우연히 효과가 있으며 가장 영향력있는 것 중 하나가 누군가가 가지고있는 참고서라는 것을 알게되었습니다. 나는 사랑하고 적극 추천한다

    Fortran 90/95 과학자 및 엔지니어 용 , Stephen J. Chapman

    이 책은 사용해서는 안되는 구조를 구체적으로 식별하고 더 나은 대안을 제공한다는 점에서 Fortran 77 과도 잘 어울립니다. 그러나 실제로는 교과서이며 Fortran 95의 핵심을 알고 싶을 때 힘이 떨어질 수 있습니다. 이것이 제가 추천하는 이유입니다.

    Fortran 90/95 Explained , 작성자 : Michael Metcalf 및 John K. Reid

    Fortran 95에 대한 참조 (원문)로. 가장 명쾌한 글은 아니지만 새로운 Fortran 95 기능을 최대한 활용하고 싶을 때 베일이 벗겨 질 것입니다.

    Fortran 77에서 Fortran 90으로 전환하는 문제에 집중하면서 즐거웠습니다.

    Fortran 90으로 마이그레이션 , Jim 작성 케리건

    그러나 책은 이제 절판되었습니다. (O'Reilly가 Safari 를 사용하는 것을 이해하지 못합니다. 인쇄본이 있습니까?)

    마지막으로 훌륭하고 멋진 고전

ackoverflow.com/amzn/click/com/020103669X "rel="noreferrer "> 소프트웨어 도구 , 추천합니다

Classical FORTRAN , 작성자 : Michael Kupferschmid

이 책은 "오직"Fortran 77으로 무엇을 할 수 있는지 보여줄뿐만 아니라 발생하는 더 미묘한 문제 (예 : EXTERNAL 선언을 사용해야하거나 사용해서는 안 됨)에 대해서도 설명합니다. 이 책은 "Software Tools"와 같은 공간을 정확히 다루지는 않지만 "fun"이라고 태그를 붙인 세 개의 Fortran 프로그래밍 책 중 두 권입니다 .... ( 세 번째는 여기 입니다.

거의 모든 Fortran 컴파일러에 적용되는 기타 조언
  • IMPLICIT NONE 동작을 강제하는 컴파일러 옵션이 있으며,이를 사용하여 먼저 IMPLICIT NONE 선언으로 수정하지 않고도 문제 루틴을 식별 할 수 있습니다. 이 조언은 레거시 루틴에 삽입 된 IMPLICIT NONE 명령으로 인해 처음 빌드 폭탄이 터지기 전까지는 의미가 없어 보입니다. (뭐? 코드 리뷰에서이 문제를 파악하지 못했습니까?;-)
  • 배열 경계 검사를위한 컴파일러 옵션이 있으며 이는 Fortran 77 코드를 디버깅 할 때 유용 할 수 있습니다.
  • Fortran 90 컴파일러는 거의 모든 Fortran 77 코드와 더 오래된 Fortran 코드를 컴파일 할 수 있어야합니다. Fortran 90 컴파일러에서보고 옵션을 켜고이를 통해 레거시 코드를 실행하면 구문 검사를 제대로 시작할 수 있습니다. 일부 상용 Fortran 77 컴파일러는 실제로 Fortran 77 모드에서 실행되는 Fortran 90 컴파일러이므로 보유하고있는 빌드 스크립트에 대해 비교적 간단한 옵션이 될 수 있습니다.

원래 질문에주의해야 할 점이 있습니다. 당신은 코드가 "성능 향상 개선"으로 가득 차 있다고 말합니다. Fortran 문제는 일반적으로 과학적, 수학적 특성이므로 컴파일을 개선하기 위해 이러한 성능 트릭이 있다고 가정하지 마십시오. 아마도 언어에 관한 것이 아닙니다. Fortran에서 해결책은 코드 자체의 효율성에 관한 것이 아니라 최종 문제를 해결하기위한 기본 수학입니다. 트릭은 컴파일 속도를 느리게 만들고 논리가 지저분하게 보일 수도 있지만 솔루션을 더 빠르게 만드는 것입니다. 그것이 무엇을하는지, 왜 그런지 정확히 알지 못한다면 그냥 두십시오.

멍청 해 보이는 변수 이름을 변경하는 것과 같은 단순한 리팩토링조차도 큰 함정이 될 수 있습니다. 주어진 과학 분야에서 역사적으로 표준 수학 방정식은 Maxwell 시대 이후로 특정 속기를 사용했을 것입니다. 따라서 전자기학에서 B (:)라는 배열을보기 위해 모든 Emag 엔지니어에게 정확히 무엇을 해결해야하는지 알려줍니다. 위험에 따라 변경하십시오. 도덕적입니다. 이름을 변경하기 전에 과학의 표준 명명법을 알아 두세요.

FORTRAN (진지하게 사용한 지 오래되었지만 77 가지 맛)과 C / C ++ 경험이있는 사람으로서 즉시 마음에 떠오르는 항목은 배열입니다.FORTRAN 배열은 C / C ++ / Java에서와 같이 0 대신 1의 인덱스로 시작합니다.또한 메모리 배열이 반대입니다.따라서 첫 번째 인덱스를 증가 시키면 순차적 인 메모리 위치가 제공됩니다.

제 아내는 여전히 FORTRAN을 정기적으로 사용하고 있으며 제가 그녀를 돕기 시작하려고하는 지금 작업해야하는 C ++ 코드를 가지고 있습니다.그녀의 개종 중에 문제가 생기면 나는 그것들을 지적하려고 노력할 것입니다.도움이 될 수도 있습니다.

코드를 유지 관리하기 위해 무엇을 해야 하는지 설명해 주시겠습니까?정말 코드를 수정해야 하나요?코드 자체 대신 해당 코드에 대한 인터페이스만 수정하여 벗어날 수 있다면 그것이 최선일 것입니다.

FORTRAN뿐만 아니라 대규모 과학 코드를 다룰 때 내재된 문제는 기본 수학과 구현이 모두 복잡하다는 것입니다.거의 기본적으로 구현은 해야 한다 합리적인 시간 내에 실행하기 위해 코드 최적화를 포함합니다.이는 이 분야의 많은 코드가 소프트웨어 개발이 아닌 해당 분야의 전문가인 과학자/엔지니어에 의해 작성된다는 사실로 인해 더욱 복잡해집니다."이해하기 쉽다"는 것이 그들에게 최우선 순위가 아니라고 가정해 보겠습니다. (저는 그들 중 하나였으며 여전히 더 나은 소프트웨어 개발자가 되는 법을 배우고 있습니다.)

문제의 성격상 일반적인 질문과 답변만으로는 도움이 되지 않을 것 같습니다.코드 조각이 첨부된 일련의 구체적인 질문을 게시하는 것이 좋습니다.아마도 가장 골치 아픈 것부터 시작하시겠습니까?

나는 1967 년부터 '66 버전부터 Fortran을 사용해 왔습니다 (32k 단어의 메모리를 가진 IBM 7090에서). 그런 다음 PL / 1을 얼마 동안 사용했지만 나중에 Fortran 95로 돌아가서 우리가 가진 행렬 / 복소수 문제에 이상적으로 적합하기 때문입니다. 이전 코드의 복잡한 구조의 대부분은 사용 가능한 메모리의 양이 적기 때문이라는 고려 사항에 추가하고 싶습니다. 또 다른 문제는 반복되는 모든 하위 표현식에 대한 보조 변수를 정의하여 최적화하는 것입니다. 컴파일러는이를 위해 최적화하지 않았습니다. 또한 GOTO를 작성할 수 없습니다. DO i=1,n+1를 작성해야했습니다. n1=n+1. 결과적으로 오래된 코드는 불필요한 변수로 가득 차 있습니다. Fortran 95에서 코드를 다시 작성했을 때 변수의 10 % 만 살아 남았습니다. 코드를 더 읽기 쉽게 만들고 싶다면 쉽게 제거 할 수있는 변수를 찾는 것이 좋습니다.

또 다른 점은 수년 동안 복잡한 산술 및 다차원 배열이 매우 비효율적이라는 것입니다. 그렇기 때문에 실제 변수와 단일 선형 인덱스로 처리되는 행렬 만 사용하여 복잡한 계산을 수행하도록 코드를 다시 작성하는 경우가 많습니다.

음, 어떤 의미에서 당신은 운이 좋다. 왜냐면 Fortran은 미묘한 제어 흐름 구조 나 상속 등을 많이 가지고 있지 않기 때문이다.다른 한편으로는 산술적으로 계산 된 분기-숫자 레이블 항목, 선언이 필요하지 않은 암시 적 유형 변수, 실제 키워드의 부족과 같은 정말 놀라운 문제가 있습니다.

'성능 향상 개선'에 대해 잘 모르겠습니다.수십 년의 컴파일러 기술이 대부분의 힌트를 불필요하게 만들었 기 때문에 대부분은 비효율적이라고 생각합니다.안타깝게도 대규모 재 작성을 계획하지 않는 한 그대로 두어야 할 것입니다.

어쨌든 핵심 과학 계산 코드는 상당히 읽기 쉬워야합니다.중위 산술을 사용하는 모든 프로그래밍 언어는 Fortran의 산술 및 할당 코드를 읽기위한 좋은 준비가 될 것입니다.

I loved FORTRAN, I used to teach and code in it. Just wanted to throw that in. Haven't touched it in years.
I started out in COBOL, when I moved to FORTRAN I felt I was freed. Everything is relative, yeah? I'd second what has been said above - recognise that this is a PROCEDURAL language - no subtelties - so take it as you see it.
Probably frustrate you to start with.

I started on Fortran IV (WATFIV) on punch cards, and my early working years were VS FORTRAN v1 (IBM, Fortran 77 level). Lots of good advice in this thread.

I would add that you have to distinguish between things done to get the beast to run at all, versus things that "optimize" the code, versus things that are more readable and maintainable. I can remember dealing with VAX overlays in trying to get DOE simulation code to run on IBM with virtual memory (they had to be removed and the whole thing turned into one address space).

I would certainly start by carefully restructuring FORTRAN IV control structures to at least FORTRAN 77 level, with proper indentation and commenting. Try to get rid of primitive control structures like ASSIGN and COMPUTED GOTO and arithmetic IF, and of course, as many GOTOs as you can (using IF-THEN-ELSE-ENDIF). Definitely use IMPLICIT NONE in every routine, to force you to properly declare all variables (you wouldn't believe how many bugs I caught in other people's code -- typos in variable names). Watch out for "premature optimizations" that you're better off letting the compiler handle by itself.

If this code is to continue to live and be maintainable, you owe it to yourself and your successors to make it readable and understandable. Just be certain of what you are doing as you change the code! FORTRAN has lots of peculiar constructs that can easily trip up someone coming from the C side of the programming world. Remember than FORTRAN dates back to the mid-late '50s, when there was no such thing as a science of language and compiler design, just ad hoc hacking together of something (sorry, Dr. B!).

Here's another one that has bit me from time to time. When you are working on FORTRAN code make sure you skip all six initial columns. Every once and a while, I'll only get the code indented five spaces and nothing works. At first glance everything seems okay and then I finally realize that all the lines are starting in column 6 instead of column 7.

For anyone not familiar with FORTRAN, the first 5 columns are for line numbers (=labels), the 6th column is for a continuation character in case you have a line longer than 80 characters (just put something here and the compiler knows that this line is actually part of the one before it) and code always starts in column 7.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top