Pisanie solidnego i" nowoczesnego " kodu Fortran

W niektórych środowiskach naukowych często nie można obejść się bez FORTRANA, ponieważ większość programistów zna tylko ten idiom, a istnieje wiele starszego kodu i związanego z nim doświadczenia. I szczerze mówiąc, nie ma wielu innych wieloplatformowych opcji programowania o wysokiej wydajności (C++ zrobiłby to zadanie ,ale składnia, tablice zerowe i wskaźniki nie są kompatybilne z niektórymi osobami).

Załóżmy więc, że nowy projektmusi używać Fortrana 90, ale chcę zbudować większość nowoczesnej architektury oprogramowania jest kompatybilna z najnowszymi kompilatorami (Intel Ifort, ale także kompilatorami Sun / HP/IBM)

Więc myślę o narzucaniu rzeczy, które są powszechnie znane jako zdrowy rozsądek, ale nie są jeszcze standardem w moim środowisku: {]}
  • globalna zmienna zakazana, brak gotos, brak etykiet skoku, implicit none, itd.
  • [13]} "programowanie obiektowe" (moduły z typami danych i pokrewnymi podprogramami)
  • funkcje modułowe/wielokrotnego użytku, dobrze udokumentowane biblioteki wielokrotnego użytku
  • twierdzenia / warunki wstępne / niezmienniki (zaimplementowane przy użyciu instrukcji preprocesora)
  • testy jednostkowe dla wszystkich (większości) podprogramów i "obiektów"
  • intensywny "tryb debugowania" (#ifdef DEBUG) z większą liczbą sprawdzeń i wszystkimi możliwymi sprawdzeniami kompilatora Intela (granice tablic, interfejsy podprogramów, itp.)
  • jednolity i wymuszony czytelny styl kodowania, za pomocą pomocników narzędzi do przetwarzania kodu.
/ Align = "left" / godny zaufania, łatwy w utrzymaniu i modułowy kod. Podczas gdy w wielu starszych kodach ponowna użyteczność nie była ważnym celem.

Szukałem odniesień do obiektowego Fortran, programowania według umowy (assertions/preconditions/etc.), a znaleziono tylko brzydkie i nieaktualne dokumenty, składnie i dokumenty wykonane przez ludzi bez zaangażowania w projekty na dużą skalę oraz martwe projekty.

Jakieś dobre adresy URL, porady, referaty/książki na ten temat?

Author: Chris, 2010-05-03

7 answers

Moje 5 centów.

Fortran Wiki jest dobrym punktem wyjścia. Zawiera artykuły o różnych aspektach programowania przy użyciu nowoczesnego Fortran. Testowanie jednostkowe, debugowanie, programowanie generyczne itp. Dostępna jest również bardzo ciekawa Tabela dotycząca obsługi kompilatora standardu Fortran 2003. (Jak już wspomniał Blklight niektóre funkcje z 2003 roku nie są dostępne w kompilatorach. To dobre miejsce do porównywania różnych kompilatorów.)

Jestem facetem C++ ale utknąłem z niektóre projekty F90.

Polecam przeczytać ten kurs: Wprowadzenie do nowoczesnego Fortran . M. S. B. wspomniał o słynnym "Fortran 95/2003 Explained", ale ta książka jest wystarczająco duża i pełna szczegółów. Oczywiście wymienione powyżej wręcz przeciwnie jest dobrym miejscem do rozpoczęcia. Zapoznaj się również z interaktywnym kursem programowania Fortran 90 z Uniwersytetu w Liverpoolu.

Błędy w programach Fortran 90, które mogą cię zaskoczyć . Ten tytuł strony mówi za siebie. =)

Hmmm... Mam też w zakładkach link do PSTI RESEARCH LECTURE series "SCIENTIFIC COMPUTING WITH FORTRAN 95" . Spróbuj.

J. F. Sebastian wspomniał o F2Py i dał radę uczyć Pythona. Zgadzam się z jego opinią. Python nie jest moim ulubionym językiem. Ale to na tyle przydatne, aby go nauczyć. W adycji do już wymienionych preprocesorów (wiele z nich napisanych w Pythonie) i F2Py nie przepuszczają SCons - nowoczesna konstrukcja oprogramowania narzędzie.

P. S. w ostatnim tygodniu kupiłem e-booka w lulu.com. Rozwój oprogramowania naukowego w Fortran Drew McCormack. Mam nadzieję, że będzie to dobra lektura, ale nagle nie mam czasu. Autor jest twórcą Forpedo (jednego z preprocesorów specyficznych dla Fortran, o których mowa w Fortran Wiki) oraz autorem wielu książek i samouczków na temat programowania Objective-C i Pythona.

 38
Author: Wildcat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-03 16:49:11

Proponuję, aby OP porzucił postawę, że Fortran jest czymś paskudnym, aby znosić wysokowydajne obliczenia naukowe i nurkował w nim entuzjastycznie. Jeśli OP zachowa ten raczej lekceważący sposób myślenia, to jego / jej cała kariera programistyczna Fortran będzie walką. A tak naprawdę to nie ma nic co można zrobić z Fortranem czego nie można zrobić z C++ więc po co się męczyć skoro naprawdę nie chcesz ?

Nie ma nic na liście kul OP, że wielu z nas, którzy pracowali z Fortran przez ostatnie 30 lat nie robi (od czasu powszechnej dostępności kompilatorów Fortran 90, ale niektóre z nich wcześniej też). Tak, są naukowcy obliczeniowi i inżynierowie oprogramowania naukowego, którzy rozumieją wskaźniki, wiedzą, że wiele (błędnych) ludzi zaczyna liczyć na 0 i że zmienne globalne są złe.

Podobnie jak @ MSB polecam książkę Metcalf et al jako źródło informacji o możliwościach i cechach nowoczesnego Fortrana. I, podobnie jak @ MSB, podnoszę Brew na pomysł użycia C lub c++ do owijania bibliotek, dla których istnieją albo odpowiedniki Fortran, albo lepsze podejścia całkowicie. Współpraca standardu 2003 z funkcjami C, które są zaimplementowane w Intel Fortran, ułatwia niż kiedykolwiek bezpośrednie wywołanie bibliotek C.

Wziąłbym problem z OP, że posiadanie kodu modułowego jest celem samym w sobie. Cele to, sugeruję, poprawny, weryfikowalny i sprawdzalny, solidny, niezawodny kod. Modułowość jest jednym ze sposobów wspierania osiągnięcia tych celów, ale jest to taktyka, a nie punkt końcowy. Gdybym myślał, że możemy pisać dobre (w powyższych zmysłach) programy składające się z 10^6 linii kodu bez modułowości, nie przejmowałbym się modułowością.

OK, teraz kilka konkretnych porad, aby dodać do tego, co OP już zamierza zrobić lub zostało powiedziane:

  • użyj rodzajów na deklaracjach zmiennych, aby wyegzekwować wymaganą precyzję; nie zostawiaj tego opcjom kompilatora lub domysłom o tym, co ten kompilator może działać na tym procesorze;
  • używaj operacji tablicowych tam, gdzie to możliwe, zamiast jawnych pętli; pomaga to uczynić kod bezpieczniejszym - czasami kosztem wydajności, ale musisz to sprawdzić indywidualnie;
  • write PURE functions;
  • nie polegaj na pre-procesorach lub innych nie-Fortranowych podejściach do poprawności kodu (etc), napisz swoje twierdzenia i warunki wstępne (etc) w Fortran; pre-procesory (etc) nie przetrwają tak długo, jak dobrze napisane programy Fortran i będą główną barierą dla przenośności teraz i w przyszłości; {]}
  • Jeśli masz dostęp do Intel Fortran uzyskaj dostęp do Intel MKL (i IPP) i używaj tych bibliotek zamiast pisać własny kod;
  • W przeciwieństwie do OpenMP i MPI, oba pasują do Fortrana bardzo dobrze; och, i planują iść równolegle tak szybko, jak to możliwe, jest to o wiele fajniejsze niż programowanie szeregowe;]}
  • ten zbiór standardów kodowania Fortran jest dobrym pierwsze wydanie Code Complete miało o wiele więcej na temat programowania Fortran (77) niż obecne wydanie, ale większość jego porad można zastosować niezależnie od języka, w którym się pisze.

I wreszcie, w dzisiejszych czasach myślę, że programy i Programiści Fortran są lepiej poinformowani pomysłami z programowania funkcyjnego niż pomysłami z programowania obiektowego.

 45
Author: High Performance Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-03 16:47:38

Fortran 90/95/2003 jest zaprojektowany tak, że można pisać kod modułowy, jeśli ktoś chce, poprzez dodanie modułów, prywatne/publiczne, typy zdefiniowane przez użytkownika, itp. Fortran 2003 wprowadza kolejne funkcje obiektowe. Nie ma sensu łączyć się z C, aby dodać malloc, gdy Fortran 90 ma "Alloc", aby bezpośrednio dynamicznie przydzielać tablice Fortran w bezpieczniejszy sposób. Umieszczenie procedur (funkcji i podprogramów) w modułach, a następnie "użycie" modułów spowoduje sprawdzenie interfejsów. Można użyć wielu opcji debugowania / sprawdzania kompilatorów, takich jak sprawdzanie granic indeksu.

Doskonała książka, aby dowiedzieć się o tych i innych cechach: "Fortran 95/2003 Explained" Metcalf, Reid i Cohen. Zdecydowanie dobrym pomysłem jest nauczenie się najlepszych cech nowoczesnego Fortrana, a nie kontynuowanie pisania FORTRAN 77 - jeśli to konieczne, napisz standardy kodowania / przewodnik.

 13
Author: M. S. B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-03 14:49:42

W ciągu ostatnich kilku lat współpracownik i ja opracowaliśmy dość dużą bibliotekę obliczeniową od podstaw w nowoczesnym Fortran z wieloma wymienionymi funkcjami-orientacją obiektową, modularnym / wielokrotnego użytku, spójnym stylem kodu i wieloma innymi (nie wykonaliśmy dobrej roboty z testami jednostkowymi - musimy się tym zająć), a następnie owinąć wszystko, aby zapewnić interfejsy z C++, Pythonem i innymi. Inni wskazali tutaj wszystkie książki i linki, które polecam (i nie tylko), więc nie będę powtarzał oni. Powodem, dla którego publikuję, jest po prostu stwierdzenie, że naprawdę można zrobić te rzeczy z Fortranem i stworzyć coś wspaniałego, więc trzymaj się tego.

Zwrócę również uwagę, jakie masz szczęście, że zaczynasz po tym, jak wiele standardu Fortran 2003 zostało zaimplementowanych we wszystkich głównych kompilatorach. Znajdziesz wiele z tych funkcji (na przykład wskaźniki procedur), które są bardzo pomocne.

 6
Author: Barron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-19 01:33:55

Trochę mi się spieszy, więc wybacz, że odpowiadam w formie checkpointów zamiast rozsądnych zdań.

  • Spróbuj stosować się do standardu (Fortran jest standardowym językiem, a stosując się do standardowych funkcji języka i unikając rozszerzeń specyficznych dla dostawcy, będziesz miał program przenośny między platformami, dla którego możesz być pewien, że kompilator nie będzie sprawiał problemów). Nie wiem skąd ściągnąłem moją kopię, ale jestem pewien, że możesz Pobierz najnowszy szkic (Uwaga; wiele funkcji fortran 2008 lub 2003 w tym zakresie nadal nie są zaimplementowane w currect kompilatora, chociaż wiele z nich jest prawie tam obecnie ... Cray) ze strony J3
  • w przypadku wszystkich pytań dotyczących powyższego serdecznie polecam comp.lang.fortran grupa usenet - nie tylko ma tam bardzo kompetentnych ludzi (np. Pan Richard Maine ... prawdopodobnie będzie skłonny odpowiedzieć na wszelkie standardy pytania dotyczące zgodności, które możesz zadać, z wieloma szczegółami, jeśli ładnie je zadasz ... to samo odnosi się do wielu innych), ale ma również osoby, które pracowały nad problemami na dużą skalę i będą certanly wiedzieć i być chętnym do udzielania porad na temat
  • książki-oprócz wszystkich już wymienionych (Metcalf, Reid i Cohen książka ma również moją rekomendację, również "Fortran 2003 podręcznik" Maine i innych ...), spróbuj znaleźć sobie kopię Stephena J. Chapmana " Fortran 95/2003 dla naukowcy i inżynierowie " [[9]}... zajmuje trochę zbyt pewne stanowisko w niektórych tematach, ale ogólnie bardzo ładna książka, z wieloma "dobrymi praktykami programowania") {]}
  • Również, Nie wiem, czy masz comed across this one "Programowanie obiektowe poprzez Fortran 90/95"

Kilka komentarzy do Twojego tekstu:

( to wszystko może wydawać się" oczywiste " współczesne założenia programistyczne, ale w dziedzicznym świecie fortran większość z nich to duże zmiany w typowy przepływ pracy programisty)

Nawet we współczesnym świecie fortran, niektóre z tych założeń są wątpliwe ... pamiętajcie, Programiści fortran nie są programistami (powtarzam to w formie skondensowanej, tyle razy pisałem o tym na tym forum) ale inżynierami, naukowcami itd. Do nich (nas?) kod nie jest celem, a jedynie narzędziem ... dla profesjonalnych programistów kod jest wszystkim; nie mają nic "poza nim"... dlatego tak bardzo go cenią. Dla inżynierów z USA, jest to jedynie sposób na uzyskanie pożądanego rezultatu ... mając to na uwadze, chociaż dobre praktyki programistyczne płacą później, nie trzeba nalegać na nie tam, gdzie nie ma oczywistej potrzeby.

celem tego wszystkiego jest posiadanie godnego zaufania, łatwego do utrzymania i modułowego kodu. Natomiast w typowym Fortranie modułowość często nie jest głównym celem, A kod jest godny zaufania tylko wtedy, gdy oryginalny programista był bardzo sprytny, a kod nie został zmieniony od tego czasu ! (trochę żartuję, ale niewiele)

Ktoś kiedyś powiedział, a ty nie uwierzyłbyś jak to jest prawdziwe:
"Nie ma nic bardziej trwałego niż tymczasowe rozwiązanie".

jakiś dobry adres URL, porady, referat/książki na ten temat?

Podane kilka wyżej.

Również, pisząc tę odpowiedź, widzę wysoką Perf. Mark zamieścił bardzo ładną odpowiedź, z którą w większości się Zgadzam ... to idzie trochę bardziej szczegółowo o standardowym przestrzeganiu.

Ponadto, moim zaleceniem byłoby zdecydowanie zamieść to pytanie również na komp.lang.fortran ... Domyślam się, że można uzyskać znacznie więcej odpowiedzi jakości tam, a następnie tutaj (wierzę, że nie ma więcej niż 20 lub tak programistów fortran na całym stackoverflow).

Był zestaw wytycznych do pisania kodu opublikowanych swobodnie przez Komitet Unii Europejskiej; byłyby one bardzo przydatne jako część tej odpowiedzi, ale niestety, nie mogę ich znaleźć w moim szybkim wyszukiwaniu w google, i nie mam czasu, aby spojrzeć szeroko. Spróbuj wyszukać w temacie ... może będziesz miał więcej szczęścia.

 4
Author: Rook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-03 16:59:46

Właśnie znalazłem ten dwuczęściowy cykl programowania obiektowego z F2003. Dużo tu fajnych rzeczy:

Część 1: http://www.pgroup.com/lit/articles/insider/v3n1a3.htm

Część 2: http://www.pgroup.com/lit/articles/insider/v3n2a2.htm

Ma świetne przykłady i wyjaśnia wszystko bardzo wyraźnie.

 3
Author: Brenton Huggins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-18 20:35:53

Jeśli chcesz spojrzeć na duży program Fortran w OO przejdź do www.mohid.com. to GPL. Zgadzam się, że pisanie nowoczesnego Fortran OO już nie wystarczy, obowiązkowe jest włączenie funkcjonalnych pojęć programistycznych. Robię pewne badania na ten temat i uważam, że główną brakującą cechą są funkcje lambda (anonimowe). Z drugiej strony myślę, że aby zrobić równoległość lepiej iść trasą MPI, a nie OpenMP.

 1
Author: Ricardo Miranda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-11 12:39:34