강력하고 "현대적인"Fortran 코드 작성
일부 과학 환경에서는 대부분의 개발자가 해당 관용구 만 알고 있고 많은 레거시 코드 및 관련 경험이 있기 때문에 FORTRAN 없이는 갈 수없는 경우가 많습니다. 솔직히, 고성능 프로그래밍 을위한 다른 크로스 플랫폼 옵션은 많지 않습니다 (C ++가 작업을 수행하지만 구문, 제로 시작 배열 및 포인터는 일부 사람들과 호환되지 않음).
그래서, 새로운 프로젝트를 가정하자 있어야 포트란 90 사용할 수 있지만, 가장 최근의 컴파일러와 호환되는 (인텔 ifort뿐만 아니라 일 / HP / IBM 컴파일러 포함) 동안은, 그것에서 가장 현대적인 소프트웨어 아키텍처를 구축하고자
그래서 저는 상식으로 널리 알려져 있지만 아직 제 환경에서는 표준이 아닌 것을 부과 할 생각입니다.
- 전역 변수 금지, gotos 없음, 점프 레이블 없음
implicit none
등 - "객체 지향 프로그래밍"(데이터 유형 및 관련 서브 루틴이있는 모듈)
- 모듈 식 / 재사용 가능 함수, 잘 문서화되고 재사용 가능한 라이브러리
- 어설 션 / 전제 조건 / 불변 (전 처리기 문을 사용하여 구현 됨)
- 모든 (대부분의) 서브 루틴 및 "객체"에 대한 단위 테스트
#ifdef DEBUG
더 많은 검사와 가능한 모든 인텔 컴파일러 검사 (배열 경계, 서브 루틴 인터페이스 등)가 있는 강력한 "디버그 모드"( )- 코드 처리 도구 도우미를 사용하여 균일하고 읽기 쉬운 코딩 스타일.
이 모든 것의 목표는 신뢰할 수 있고 유지 관리가 가능한 모듈 식 코드를 갖는 것입니다. 반면 많은 레거시 코드에서 재사용 성은 중요한 목표가 아닙니다.
객체 지향 포트란, 계약 별 프로그래밍 (어설 션 / 전제 조건 등)에 대한 참조를 검색 한 결과 대규모 프로젝트에 참여하지 않은 사람들이 작성한보기 흉하고 오래된 문서, 구문 및 문서, 죽은 프로젝트 만 찾았습니다. .
이 주제에 대한 좋은 URL, 조언, 참고 문헌 / 책이 있습니까?
내 5 센트.
포트란 위키 좋은 출발점이 될 것입니다. 최신 Fortran을 사용한 프로그래밍의 다양한 측면에 대한 기사가 있습니다. 단위 테스트, 디버깅, 일반 프로그래밍 등. 또한 Fortran 2003 Standard에 대한 컴파일러 지원에 대한 매우 흥미로운 표 를 사용할 수 있습니다. (Blklight가 이미 언급했듯이 일부 2003 기능은 컴파일러에서 사용할 수 없습니다. 다른 컴파일러를 비교하는 것이 좋습니다.)
저는 C ++ 사람이지만 F90 프로젝트에 갇혀 있습니다.
이 과정을 읽는 것이 좋습니다. Introduction to Modern Fortran . MSB는 유명한 "Fortran 95/2003 Explained"를 언급했지만이 책은 충분히 크고 자세한 내용으로 가득 차 있습니다. 반대로 위에서 언급 한 과정은 시작하기에 좋은 곳입니다. 또한 리버풀 대학의 인터랙티브 포트란 90 프로그래밍 과정 을 살펴보십시오 .
당신을 놀라게 할 수있는 Fortran 90 프로그램의 실수 . 이 페이지 제목은 그 자체로 말합니다. =)
흠 ... 또한 책갈피에 PSTI RESEARCH LECTURE SERIES "SCIENTIFIC COMPUTING WITH FORTRAN 95"에 대한 링크가 있습니다. 시도 해봐.
JF Sebastian은 F2Py를 언급하고 Python을 가르치기위한 조언을 제공했습니다. 나는 그의 의견에 동의한다. Python은 제가 가장 좋아하는 언어가 아닙니다. 그러나 그것을 가르치기에 충분히 유용합니다. 이미 언급 한 전 처리기 (대부분이 Python으로 작성 됨)와 F2Py는 SCons ( 현대 소프트웨어 구성 도구 )를 넘기지 않습니다 .
PS 지난주에 lulu.com에서 전자 책을 샀습니다. Drew McCormack의 Fortran에서 과학 소프트웨어 개발 . 좋은 독서가 되길 바라지 만 갑자기 시간이 없다. 저자는 Forpedo (Fortran Wiki에 언급 된 Fortran 특정 전 처리기 중 하나)의 개발자이자 Objective-C 및 Python 프로그래밍에 대한 많은 책과 자습서의 저자입니다.
나는 OP가 Fortran이 고성능 과학 컴퓨팅에서 견디기 힘들다는 태도를 버리고 열정적으로 뛰어들 것을 제안합니다. OP가 다소 무시적인 사고 방식을 유지한다면 그의 전체 Fortran 코딩 경력은 어려움을 겪을 것입니다. 그리고 정말로, C ++로는 할 수없는 Fortran으로 할 수있는 일은 없습니다. 그러니 정말로 원하지 않는데 왜 귀찮게할까요?
OP의 총알 목록에는 지난 30 년 동안 Fortran과 함께 작업해온 많은 사람들이하지 않은 것이 없습니다 (Fortran 90 컴파일러의 광범위한 가용성 이후 일부는 그 이전에도 마찬가지입니다). 예, 포인터를 이해하는 계산 과학자와 과학 소프트웨어 엔지니어가 있습니다. 많은 사람들이 0부터 계산을 시작하고 전역 변수가 A BAD THING이라는 것을 알고 있습니다.
@MSB와 마찬가지로 나는 Metcalf et al 의 책을 현대 Fortran의 기능과 특징에 대한 정보 소스로 추천합니다. 그리고 @MSB와 마찬가지로 C 또는 C ++를 사용하여 Fortran과 동등하거나 더 나은 접근 방식이있는 라이브러리를 래핑하는 아이디어에 눈을 뗄 수 있습니다. 인텔 포트란에 구현 된 2003 표준의 C 기능과의 상호 운용성은 그 어느 때보 다 쉽게 C 라이브러리를 직접 호출 할 수 있도록합니다.
나는 OP와 함께 모듈 코드를 갖는 것이 그 자체로 목표라는 문제를 가지고 있습니다. 목표는 정확하고 검증 가능하며 검증 가능하고 강력하고 신뢰할 수있는 코드입니다. 모듈화는 이러한 목표의 달성을 지원하는 한 가지 방법이지만 끝 점이 아니라 전술입니다. 모듈화없이 10 ^ 6 줄의 코드로 구성된 좋은 프로그램을 작성할 수 있다고 생각했다면 모듈화에 신경 쓰지 않을 것입니다.
좋아, 이제 OP가 이미하려는 작업에 추가 할 몇 가지 구체적인 팁 :
- 변수 선언에 KIND를 사용하여 필요한 정밀도를 적용하십시오. 이것을 컴파일러 옵션에 맡기거나이 컴파일러가 해당 프로세서에서 수행 할 수있는 작업에 대해 추측하지 마십시오.
- 명시 적 루프보다는 가능한 한 배열 연산을 사용하십시오. 이는 코드를 더 안전하게 만드는 데 도움이됩니다. 때로는 성능이 저하되지만 사례별로 확인해야합니다.
- PURE 함수를 작성하십시오.
- 코드 정확성 (기타)에 대한 전 처리기 또는 기타 비 포트란 접근 방식에 의존하지 말고, Fortran에서 어설 션 및 전제 조건 (기타)을 작성하십시오. 전 처리기 (기타)는 잘 작성된 Fortran 프로그램만큼 오래 살아남지 못하며 현재와 미래의 이식성에 대한 주요 장벽이 될 것입니다.
- 인텔 포트란에 액세스 할 수있는 경우 인텔 MKL (및 IPP)에 액세스하고 자체 코드를 작성하는 대신 해당 라이브러리를 사용하십시오.
- 병렬화를 위해 OpenMP와 MPI를 다룰 계획이며, 둘 다 Fortran에 매우 적합합니다. 오, 그리고 가능한 한 빨리 병렬로 갈 계획을 세우십시오. 직렬 프로그래밍보다 훨씬 재미 있습니다.
- 이 포트란 코딩 표준 세트는 좋은 시작이지만 아마 그 이상은 아닙니다. Code Complete 의 첫 번째 버전은 현재 버전보다 Fortran (77) 프로그래밍에 대해 더 많은 내용을 담고 있지만 대부분의 조언은 어떤 언어로 작성하든 적용 할 수 있습니다.
그리고 마지막으로, 요즘에는 Fortran 프로그램과 프로그래머가 객체 지향 프로그래밍의 아이디어보다 함수형 프로그래밍의 아이디어에 더 많은 정보를 제공한다고 생각합니다.
Fortran 90/95/2003은 원하는 경우 모듈, 개인 / 공용, 사용자 정의 유형 등을 추가하여 모듈 식 코드를 작성할 수 있도록 설계되었습니다. Fortran 2003은 추가 객체 지향 기능을 도입합니다. Fortran 90이 더 안전한 방법으로 Fortran 배열을 직접 동적으로 할당하기 위해 "할당"할 때 malloc을 추가하기 위해 C에 연결하는 것은 의미가 없습니다. 모듈에 프로 시저 (함수 및 서브 루틴)를 배치 한 다음 모듈을 "사용"하면 인터페이스가 확인됩니다. 첨자 경계 검사와 같은 컴파일러의 많은 디버그 / 검사 옵션을 사용할 수 있습니다.
이러한 기능과 기타 기능에 대해 배울 수있는 훌륭한 책 : Metcalf, Reid 및 Cohen의 "Fortran 95/2003 Explained". FORTRAN 77을 계속 작성하는 것보다 최신 Fortran의 최고의 기능을 배우는 것이 좋습니다. 필요한 경우 코딩 표준 / 가이드를 작성하십시오.
Over the last few years a coworker and I have developed a rather large computational library from scratch in modern Fortran with many of the features you mention - object orientation, modular/reusable, consistent code style, and more (we haven't done a great job with unit tests, though - need to get on that), and then wrap all of that to provide interfaces with C++, Python, and more. Others here have pointed to all of the books and links I would recommend (and more), so I won't repeat them. My reason for posting is just to say that it really is possible to do these things with Fortran and create something great, so stick with it.
I'll also point out how lucky you are to be starting after so much of the Fortran 2003 standard has been implemented in all major compilers. You'll find a lot of these features (procedure pointers for instance) to be very helpful.
I'm in a rather hurry, so forgive me if I'm making this answer in the form of checkpoints instead of reasonable sentences.
- try adhering to the standard (Fortran is a standardized language, and by adhering to standard language features, and avoiding vendor specific extensions, you'll have a portable between platforms program, for which you can be sure the compiler will give no problems). I don't know where I downloaded my copy, but I'm pretty sure you can download the latest draft (beware; many features of fortran 2008 or 2003 for that matter are still not implemented in the currect compiler, although many are almost there nowadays ... Cray being one) from J3's page
- for all questions regarding the above, I heartily recommend comp.lang.fortran usenet group - not only does it have some very knowledgeable people there (for example. mr. Richard Maine ... will probably be willing to answer any standard compliance questions you may ask, with much detail, if asked nicely ... same goes for many others) but it also has people who've worked on large scale problems and will certanly know and be willing to give advice on your subject
- books - in addition to all of the already mentioned (Metcalf, Reid and Cohen's book also has my recommendation, also "Fortran 2003 handbook" by Maine and others ...), try finding yourself a copy of Stephen J. Chapman's "Fortran 95/2003 for scientists and engineers" ... takes a little too confident stand on some topics, but still, overall a very nice book, with many "good programming practices" mentioned)
- also, don't know if you've comed across this one "Object oriented programming via Fortran 90/95"
Some comments on your text:
( This may all seem "evident" modern programming assumptions, but in a legacy fortran world, most of these are big changes in the typical programmer workflow )
Even in a modern fortran world, some of these assumptions are questionable ... remember, fortran programmers are not programmers (I'm repeating this in condensed form; I've already written this on this forum so many times) but engineers, scientists and so on. To them (us?) code is not a goal, but merely a tool ... to professional programmers code is everything; they have nothing "beyond it" ... therefore, they cherish it so much. To us engineers, it is merely a means of getting the result we want ... with that in mind, although good programming practices pay later, do not necessary insist on them where there is no obvious need for them.
The goal with all that is to have trustworthy, maintainable and modular code. Whereas, in typical fortran, modularity is often not a primary goal, and code is trustworthy only if the original developer was very clever, and the code was not changed since then ! (i'm a bit joking here, but not much)
Somebody once said, and you wouldn't believe how true it is:
"There is nothing more permanent than a temporary fix".
Any good URL, advice, reference paper/books on the subject?
Given several above.
Also, while writing this answer, I see High Perf. Mark posted a very nice answer, with which I mostly agree ... it goes a little more into detail about standard adhering.
Also, my recommendation would be to definitely post this question also on comp.lang.fortran ... I gather you can get much more quality answers there, then in here (I believe there isn't more then 20 or so fortran programmers on whole of stackoverflow).
There was a set of code writing guidelines published freely by some european union commitee; they would be very useful as part of this answer, but unfortunatelly, I cannot find them in my quick google search, and haven't got the time to look extensively. Try searching on the topic ... maybe you'll have better luck.
I just found this two-part series on object-oriented programming with F2003. Lots of great stuff here:
Part 1: http://www.pgroup.com/lit/articles/insider/v3n1a3.htm
Part 2: http://www.pgroup.com/lit/articles/insider/v3n2a2.htm
It has great examples and explains everything very clearly.
If you want to look at a large Fortran program in OO go to www.mohid.com. It is GPL. I agree that to write modern Fortran OO is not enough anymore, it is mandatory to incorporate Functional Programing concepts. I am doing some research on this and I believe the main missing feature is lambda (anonymous) functions. On the other side I think that to do parallelization it is better to go the MPI route, rather than OpenMP.
참고URL : https://stackoverflow.com/questions/2758635/writing-robust-and-modern-fortran-code
'Program Tip' 카테고리의 다른 글
XAML 그리드에서 RowDefinition Height =“10 *”은 무엇을 의미합니까? (0) | 2020.11.24 |
---|---|
왜 SPARSE COLUMN을 사용해야합니까? (0) | 2020.11.24 |
뮤텍스를 보유한 스레드를 확인할 수 있습니까? (0) | 2020.11.24 |
DEFAULT 값없이 null이 아닌 열을 추가 할 수 있습니까? (0) | 2020.11.24 |
여러 코어를 자동으로 사용하는 R 패키지? (0) | 2020.11.24 |