W moim programie doktoranckim z informatyki pracujemy prawie wyłącznie w językach C ++ i Fortran. Wygląda na to, że niektórzy profesorowie wolą jednego od drugiego. Zastanawiam się, który z nich jest „lepszy” lub czy w pewnych okolicznościach jest lepszy od drugiego.
Komentarze
- Połączenie wysokich a moim zdaniem język niskiego poziomu jest lepszy niż używanie wyłącznie jednego z nich. Na przykład. Używam Python + C ++.
- Odpowiedzi na to pytanie będą prawie czysto subiektywne, dlatego ' nie jestem pewien, czy to pytanie jest właściwe.
Odpowiedź
Jak często, wybór zależy od (1) problemu, który próbujesz rozwiązać, (2) umiejętności, które posiadasz i (3) ludzie, z którymi pracujesz (chyba że jest to projekt solowy). Zostawię na chwilę (3) na bok, ponieważ zależy to od indywidualnej sytuacji każdego.
Zależność od problemu: Fortran przoduje w przetwarzaniu tablic.Jeśli twój problem można opisać w kategoriach prostych struktur danych, aw szczególności tablic, Fortran jest dobrze przystosowany.Programiści Fortranu kończą używanie tablic nawet w nieoczywistych przypadkach (np. Do przedstawiania wykresów). C ++ lepiej nadaje się do złożonych i wysoce dynamicznych struktur danych.
Zależność od umiejętności: pisanie dobrych programów w C ++ wymaga dużo więcej doświadczenia w programowaniu niż pisanie dobrych programów w języku Fortran. Jeśli zaczynasz z niewielkim programem zdobywając doświadczenie i mając tylko tyle czasu na nauczenie się tego aspektu swojej pracy, prawdopodobnie uzyskasz lepszy zwrot z inwestycji, ucząc się języka Fortran niż ucząc się C ++. Zakładając, oczywiście, że Twój problem jest odpowiedni dla języka Fortran.
Jednak programowanie to coś więcej niż tylko język Fortran i C ++. Polecam każdemu, kto zajmuje się informatyką, aby zacząć od dynamicznego haju -poziomowy język, taki jak Python. Zawsze pamiętaj, że Twój czas jest cenniejszy niż czas procesora!
Komentarze
- ” Zawsze pamiętaj o tym twój czas jest cenniejszy niż czas procesora! ” Jako ktoś, kto pracuje w HPC, nie zgadzam się z tą częścią; wszystko inne jest na miejscu.
- ” Zawsze pamiętaj, że Twój czas jest cenniejszy niż czas procesora! ” Jak ktoś, kto zajmuje się badaniami naukowymi, nie mógłbym ' zgadzać się z tą częścią.
- ” Zawsze pamiętaj, że Twój czas jest cenniejszy niż czas procesora! ” – ' chciałbym dorzucić moje 2 centy – używając kilkuset węzłów, każdy z ponad 10 rdzeniami do uruchomienia jakiegoś programu przez kilka tygodni można uznać za okropne marnotrawstwo najcenniejszego zasobu, jeśli kilka kolejnych tygodni mogłoby wyprodukować kod działający tylko w kilka dni. Te klastry HPC są rzadkim i drogim wspólnym zasobem.
- ” Zawsze pamiętaj, że Twój czas jest cenniejszy niż czas procesora! „, kod przez tydzień, ale działający przez miesiąc, to ' jest całkiem zwyczajny!
- ” Zawsze pamiętaj, że Twój czas jest cenniejszy niż czas procesora! „, wolałbym kodować przez miesiąc i uruchamiać w tydzień! – można zrobić więcej, gdy kod zostanie napisany, a dla innych napisany przez Ciebie kod będzie bardziej przydatny.
Odpowiedź
Myślę, że zarówno C ++, jak i Fortran są wystarczająco dobre i działają dobrze.
Jednak myślę, że Fortran jest lepszy do numerycznych obliczeń naukowych, do algorytmów, które można wyrazić za pomocą tablice i nie potrzebują innych skomplikowanych struktur danych, więc w dziedzinach takich jak różnice / elementy skończone, solwery PDE, obliczenia struktur elektronicznych. Fortran jest językiem specyficznym dla domeny. W szczególności myślę, że łatwiej jest pisać szybko programy w Fortranie niż w C ++, wykonane przez naukowca (niekoniecznie eksperta informatyki).
C ++ jest językiem ogólnego przeznaczenia, więc można w nim wyrazić dowolny algorytm i jest zdecydowanie lepszy dla algorytmów, których nie można wyrazić za pomocą tablic, z pola HPC prawdopodobnie jakieś wykresy, generatory siatek, manipulacja symboliczna i tak dalej.
Możliwe jest również zapisanie tablic y algorytmów w C ++, ale z mojego doświadczenia wynika, że wymaga to znacznie większej wiedzy informatycznej i ogólnie więcej pracy (tj. trzeba tworzyć lub ponownie używać klas do manipulacji tablicami i obsługiwać zarządzanie pamięcią ręcznie lub przy użyciu jakiejś biblioteki, takiej jak Teuchos z Trilinos). Osoby nie będące ekspertami piszą całkiem dobre programy w języku Fortran, ale okropne programy w C ++ (mówię z własnego doświadczenia).
Zastrzeżenie: Osobiście bardzo lubię Fortran i wolę go od C ++ do obliczeń numerycznych. Spędziłem ponad 2 lata na codziennym programowaniu w C ++ i prawie rok na codziennym programowaniu w nowoczesnym Fortranie (w obszarze elementów skończonych). Często używam Pythona i Cythona.
Komentarze
- Zrównoważyliśmy jedną odpowiedź za pierwszą odpowiedź. Myślę, że C ++ i Fortran to zdecydowanie nie jedyne możliwości we współczesnym HPC. Myślę, że dobrze jest znać mocne i słabe strony, kiedy decydujesz się na Fortran, C ++ lub Python (lub cokolwiek chcesz). Widziałem 20 000 linii Fortrana w jednym pliku, organicznie uprawianych przez kilka dekad. Osobiście nie używałbym go do niczego innego niż izolowane, ciężkie obliczenia tablicowe. Nawet nic związanego z produkcją. Jak dotąd dla stronniczego komentarza.
- Nie mogłem ' nie zgodzić się bardziej z tą odpowiedzią. Nasz kod elementów skończonych nie byłby możliwy do napisania w języku Fortran. W rzeczywistości zaczęło się 15 lat temu jako mieszanka zwykłego C i Fortran (ten ostatni dotyczy numerycznie intensywnych części metody) i stopniowo przeniosło się do czystego C, a następnie do C ++ w ciągu kilku lat. Kod był konsekwentnie krótszy, szybszy i łatwiejszy do zrozumienia, a po każdej iteracji był bardziej wydajny. Zgadzam się z innymi, którzy zwracają uwagę, że C ++ daje mnóstwo liny do strzelania. Wybierz język, który ' najbardziej Ci odpowiada.
- Bill, czy korzystałeś z nowoczesnego języka Fortran (wersje 90 i nowsze?). Jest to bardzo ważne (w mojej odpowiedzi powinienem był być bardziej wyraźny). Oczywiście ” 20 000 linii języka Fortran ” lub f77 zwykle nie jest lepsze niż dobrze napisany C ++.
- @ OndřejČert í k: Myślę, że jeśli uważasz, że nowoczesne programy wykorzystujące elementy skończone używają ” prostych „, to znaczy, że ostatnio ' nie przeglądałeś żadnej z nich. Spróbuj zaimplementować adaptacyjne elementy skończone, metody HP lub multigrid na niestrukturalnych siatkach przy użyciu prostych struktur danych. Bill jest na miejscu i myślę, że mogę za niego mówić, mówiąc, że użycie ” nowoczesnego języka Fortran ” przyniosłoby niewiele więcej niż niewielki różnicę.
- @WolfgangBangerth, zobacz na przykład Phaml ( math.nist.gov/phaml ), aby zapoznać się z implementacją w języku Fortran prawie wszystkiego, wspomniałeś.
Odpowiedź
Ja też rzucam swoje dwa centy w pewnym sensie za późno, ale ja ” Dopiero co widzieliśmy ten wątek i czuję, że dla potomności jest kilka punktów, które należy rozpaczliwie poruszyć.
W dalszej części zwróć uwagę, że opowiem o C, a nie o C ++. Dlaczego? Cóż, w przeciwnym razie porównanie pełnego, dynamicznie zorientowanego na typy języka obiektowego z czymś tak statycznym, jak Fortran, to jabłka i pomarańcze. Tak, niektóre współczesne implementacje najnowszych standardów Fortran mogą zrobić więcej niż tylko to, ale w rzeczywistości bardzo niewiele osób używamy ich, więc kiedy mówimy o Fortranie, myślimy o prostym, statycznym i imperatywnym języku. Tam też jest C, więc zamienię C na C ++ w następnych.
Po pierwsze wszystko, jakakolwiek dyskusja o tym, że Fortran / C ma lepsze kompilatory jest dyskusyjna. Dedykowane kompilatory C / Fortran należą już do przeszłości. Zarówno gcc / gfortran, jak i icc / ifc są po prostu różnymi front-endami tego samego zaplecza, tj. twojego programu zostanie przekształcony w abstrakcyjny opis przez front-end, a następnie zoptymalizowany i złożony przez zaplecze. Jeśli piszesz semantycznie ten sam kod w języku Fortran lub C, kompilator w obu przypadkach wyprodukuje ten sam zestaw który będzie działał równie szybko.
To teraz prowadzi do mojej drugiej kwestii: dlaczego nadal widzimy różnice erencje? Problem polega na tym, że większość porównań jest dokonywanych przez programistów Fortranu próbujących czegoś w C lub odwrotnie. Czy zauważyłeś, że większość autorów lub poetów woli pisać w swoich językach ojczystych? Czy chciałbyś pisać wiersze w języku, w którym nie czujesz się całkowicie pewnie lub w domu? Oczywiście, że nie … Ja sam uważam C za mój „ojczysty” język programowania. Jednak spędziłem też trzy lata pracuję w grupie, która używa tylko języka Fortran, w której osiągnąłem pewien poziom płynności. Jednak nigdy nie napisałbym niczego samodzielnie w Fortranie, ponieważ czuję się bardziej komfortowo z C i, w konsekwencji, kod wynikowy będzie lepszy , cokolwiek to zdefiniujesz.
Więc główna różnica tkwi w programatorze, a nie w języku. Więc nie ma różnic? Cóż, niezupełnie. Oto kilka przykładów:
-
SIMD: Niezależnie od tego, czy jest to SSE, SSE3 czy AltiVec, jeśli chcesz ich używać w Fortranie, miej nadzieję i módl się, aby kompilator zgadł dokładnie to, czego chcesz i zrób to. Powodzenia. W C generalnie masz wewnętrzne funkcje dla każdej architektury lub, ostatnio, ogólne typy wektorów SIMD w gcc . Większość kompilatorów języka Fortran będzie używać instrukcji SIMD tylko do rozwijania pętli, ale jeśli masz jądro, które działa na krótkich wektorach danych w nieoczywisty sposób, kompilator najprawdopodobniej go nie zobaczy.
-
Różne architektury sprzętowe: cała architektura CUDA jest zbudowana wokół jądra w C. Tak, grupa Portland ma teraz CUDA Kompilator fortranu z obsługą również, ale jest komercyjny, a co najważniejsze, nie pochodzi od firmy NVIDIA. To samo dotyczy OpenCL, dla którego najlepszym, co znalazłem, jest najnowszy projekt , który obsługuje tylko kilka podstawowych wywołań.
-
Programowanie równoległe: Tak, zarówno MPI, jak i OpenMP działają dobrze zarówno z C, jak i Fortranem. Jeśli jednak chcesz mieć prawdziwą kontrolę nad swoimi wątkami, tj. Jeśli masz w pełni dynamiczne obliczenia w pamięci współdzielonej, będziesz na mrozie z Fortranem. W C masz standardowe wątki, które, choć nie są ciepłe i rozmyte, będą nadal pozwala przejść przez burzę. Ogólnie większość obliczeń, które opierają się na dostępie do systemu operacyjnego, np. wątki, procesy, system plików itp., lepiej obsługuje się w C. Och, i nie próbuj wykonywać własnych Praca w sieci z Fortranem.
-
Łatwość użycia: Fortran jest bliższy Matlabowi niż C. Po zapoznaniu się ze wszystkimi różnymi słowami kluczowymi i sposobami deklarowania zmiennych reszta kodu wygląda jak Matlab, dzięki czemu jest bardziej dostępna dla użytkowników z ograniczonym doświadczeniem w programowaniu.
-
Interoperacyjność: kiedy tworzysz strukturę w C, układ rzeczywistych danych jest prosty i deterministyczny. W Fortranie, jeśli używasz tablic wskaźników lub danych strukturalnych, rzeczywisty układ danych jest silnie zależny od kompilatora, a nie prosty do przodu i zwykle całkowicie nieudokumentowane. Możesz wywołać C z języka Fortran i odwrotnie, ale nie myśl, że może być tak łatwo przekazać coś więcej niż statyczną tablicę z jednej do drugiej iz powrotem.
To wszystko jest trochę dziwaczne, niskopoziomowe, ale mówimy o obliczeniach wysokowydajnych, prawda? Jeśli nie jesteś zainteresowany tym, jak najlepiej wykorzystać podstawowy sprzęt paradygmaty, czyli wdrażanie i / lub rozwijanie algorytmów, które są najlepsze dla pamięci współdzielonej / rozproszonej, wątków, wektoryzacji SIMD , GPU używające SIMT i tak dalej, wtedy po prostu robisz matematykę na komputerze.
To trwało znacznie dłużej niż cokolwiek, do czego dążyłem, więc oto podsumowanie – zestaw rzeczy do zrobienia różnego rodzaju wiadomości:
- Napiszesz najlepszy kod, jaki potrafisz , w języku, który Ty znasz najlepiej.
- Nie ma różnicy w jakości kodu tworzonego przez dwa kompilatory korzystające z tego samego zaplecza – to my piszemy zły kod w tym czy innym języku.
- Pomimo wrażenia niskiego poziomu, Fortran jest abstrakcją dość wysokiego poziomu i nie pozwala na bezpośredni dostęp do niektórych funkcji sprzętu / systemu operacyjnego, np. SIMD, wątki, sieci itp …
Komentarze
- Dobra odpowiedź. Nie ' nie sądzę, jednak Twój ostatni komentarz jest koniecznie prawdziwy. Sam jestem ' programistą C, ale dzięki dobrym praktykom programistycznym masz dostęp do rzeczy niskiego poziomu w języku Fortran. Idealnym sposobem wykorzystania rzeczy takich jak operacje SIMD jest napisanie kodu, który zdecydowanie to sugeruje (na przykład blokowanie pętli) i pozwolenie kompilatorowi zrobić to za Ciebie. Do tworzenia wątków po prostu użyj openMP (pthreads jest również użyteczny przy dodatkowej pracy). Fortran ma wszystko, o czym wspomniałeś, ' t, tylko na poziomie, który ma znaczenie dla jego typowego użytkownika: numeryczny.
- @ Reid.Atcheson: Cóż , jeśli zablokujesz wszystko w taki sposób, że kompilator to złapie, to będzie działać automagicznie zarówno w C, jak iw Fortranie. Problem w tym, jak bardzo chcesz zaufać swojemu kompilatorowi? I dlaczego chcesz mu ufać w przypadkach, gdy wiesz dokładnie , co chcesz zrobić? OpenMP obsługuje wątki, tak, ale blokowo. Możesz go oszukać, aby różne pule wątków robiły różne rzeczy, ale jest to po prostu niewłaściwe użycie OpenMP. Pthreads dla Fortrana są po prostu opakowaniami dla funkcji C. Zgadzam się jednak, że Fortran jest łatwiejszy, jeśli ' nie znasz szczegółów.
- Na pewno nie ' W zależności od kompilatora uzyskasz pełną 99% szczytową wydajność, ale możesz łatwo podejść całkiem blisko. Poza tym musisz użyć funkcji wewnętrznych lub wbudowanego ASM. Gdzieś trzeba pójść na ustępstwa, jeśli chodzi o ogólną wydajność programisty, to właśnie ' jest powodem, dla którego istnieją języki programowania. Na etapie, na którym jesteś na tyle szalony, aby zagłębić się w szczegóły dotyczące wewnętrznych elementów lub ASM (byłem już kilka razy), Fortran nie jest ' kulą. ' i tak wiesz, jak utworzyć link w złożonym, ręcznie zoptymalizowanym kodzie.
- @ Reid.Atcheson: Cóż, ja ' d argumentuj, że dla równoległych aplikacji HPC możesz skończyć znacznie poniżej 99% szczytowej wydajności … A typy wektorów gcc sprawiają, że używanie elementów wewnętrznych nie jest problemem 🙂
- @Pedro, Genialny post. Absolutnie genialne. Wielkie dzięki za wysłanie.Właśnie go znalazłem podczas losowego przeszukiwania interesujących wątków.
Odpowiedź
Z mojego 15-letniego myślenia o oprogramowaniu naukowym : Jeśli Twój kod działa 25% szybciej, ponieważ piszesz go w języku Fortran, ale napisanie go zajmuje 4 razy dłużej (brak STL, trudności z implementacją złożonych struktur danych itp.), Fortran wygrywa tylko wtedy, gdy wydasz znaczną część Twój dzień kręcąc kciukami i czekając na zakończenie obliczeń. Biorąc pod uwagę, że dla prawie każdego z nas najcenniejszy jest nasz własny czas, wniosek jest taki: używaj języka, który pozwala rozwijać, debugować i testować kod najszybciej, z rozsądkiem ignorując, że może to być wolniejsze niż być może, jeśli napisałeś to w Fortranie.
Odpowiedź
Moje podejście polegało na używaniu C ++ do wszystkiego oprócz jąder obliczeniowych, które zazwyczaj są najlepsze napisane na zgromadzeniu; Kupuje to całą wydajność tradycyjnego podejścia HPC, ale pozwala uprościć interfejs, np. poprzez przeładowanie jąder obliczeniowych, takich jak SGEMM / DGEMM / CGEMM / ZGEMM, w jedną procedurę, powiedzmy Gemm. Oczywiście poziom abstrakcji można podnieść znacznie wyżej, unikając surowych wskaźników i przełączając się na nieprzezroczyste klasy, ale jest to miły pierwszy krok.
Największą wadą C ++ jest przede wszystkim wydłużenie czasu kompilacji, ale z mojego doświadczenia wynika, że oszczędność czasu projektowania to więcej niż rekompensata. Inną wadą jest to, że kompilatory C ++ dostawców mają zwykle więcej błędów niż kompilatory C i Fortran od dostawców. Myślę, że w zeszłym roku napotkałem prawie dziesięć błędów w kompilatorach C ++.
Biorąc to wszystko pod uwagę, myślę, że cofanie pakietów naukowych napisanych w językach niskiego poziomu (i Fortran) jest niechęć do ujawniania wygodnych interfejsów dla wyrafinowanych struktur danych: większość ludzi jest zadowolona z interfejsu Fortran BLAS, ponieważ wymaga on tylko wskaźników i wiodących wymiarów do opisania macierzy, ale niewiele osób argumentowałoby, że zwykły 40-całkowity interfejs solvera rzadkiego bezpośredniego jest czymś zbliżonym do wygodnego (por. UHM, SuperLU, PETSc i Trilinos).
Podsumowując, opowiadam się za używaniem asemblera dla jąder obliczeniowych niskiego poziomu, ale języków wyższego poziomu do wszystkiego innego, szczególnie gdy operujemy na nietrywialnych strukturach danych.
Zauważ, że to post zaowocował porównaniem wydajności C i Fortran na jądrze $ y: = \ alpha x + y $ .
Komentarze
- Dlaczego nie ' t nie ufasz standardowemu kompilatorowi C z włączoną odpowiednią optymalizacją do celów kompilowania małych jąder? Na tym poziomie rozmiaru i złożoności kodu różnica w tym, co kompilator mógłby z niego wyciągnąć, jest niejasna.
- Rozmawiałem z kilkoma osobami, które powiedziały mi, że nawet przy odpowiednim ograniczonym użyciu ich Fortran był nadal szybszy niż ich kod C i / lub C ++ dla niektórych operacji, takich jak jawna transpozycja macierzy. ' Nie mówię, że ' niemożliwe jest stworzenie kodu C lub C ++ tak szybko, ale kompilator Fortran ma tendencję do tego lepsza praca.
- Mam takie same doświadczenia ze słowem kluczowym ” ograniczonym ” (mój prosty kod w języku Fortran to zawsze trochę szybciej). Ale moja wiedza jest ograniczona i po prostu nie ' nie mam czasu na zrozumienie wygenerowanego zestawu z gcc. Więc po prostu używam Fortrana, ' jest proste i ' jest szybkie.
- @JackPoulson: Kompilator kłótnia to coś, co dość często słyszę od społeczności Fortran. Niestety większość kompilatorów, np. gcc lub ifc / icc, używaj interfejsów w różnych językach dla tego samego zaplecza. Maszyna wykonująca optymalizację i generowanie kodu jest identyczna i dlatego różnice w wynikach są najprawdopodobniej spowodowane różnicami w znajomości języka programowania przez programistę …
- Tylko po to, aby dać trochę perspektywy na temat często powtarzanego, rzadko sprawdzanego twierdzenia, że Fortran jest szybszy na jądrach numerycznych: Jakiś czas temu zauważyliśmy, że rzadkie mnożenie macierzy wektorów w pakiecie Trilinos ' Epetra było o 30% wolniejsze niż ten w transakcji. II. Pierwsza została napisana w prostym Fortranie 77, druga w prostym języku C bez użycia ' ogranicz '. Oba miały około 10-15 linii kodu. Dziś Trilinos używa fragmentu kodu zaczerpniętego z transakcji. II. Jestem ' na pewno można znaleźć wiele przypadków, w których F77 jest szybszy niż C. Chodzi o to, że nie jest to ' t uniwersalne, więc nie jest to już uniwersalne dzisiaj.
Odpowiedź
Ponieważ jestem tu nowy, przejrzałem stare pytania i znalazłem to. Miejmy nadzieję, że odpowiadanie na stare pytania nie jest tabu!
Ponieważ nikt inny o tym nie wspomniał, pomyślałem, że tak. Fortran 2003 jest prawie w pełni obsługiwany przez większość głównych kompilatorów (intel, ibm, cray, NAG, PCG), a nawet gcc z (wkrótce) najnowsza wersja 4.7.0 Fortran 2003 (i 2008) to język zorientowany obiektowo, choć nieco bardziej rozwlekły niż C ++. Jedną z rzeczy, które moim zdaniem są miłe w Fortranie, jest fakt, że komisja standaryzacyjna postrzega „obliczenia naukowe” jako swoich głównych odbiorców (dziękuję Damianowi Rousonowi za wskazanie mi tego któregoś dnia).
Mówię o tym wszystkim nie po to, aby programiści C ++ stali się programistami Fortranu, ale po to, aby ludzie z Fortran wiedzieli, że mają teraz więcej opcji oprócz przejścia na C ++ lub emulacji koncepcji obiektowych w Fortran 90/95.
Jeden zastrzeżenie Dodam, że bycie na krawędzi tego, co zostało zaimplementowane w kompilatorach, wiąże się z kosztami. Jeśli podejmiesz teraz duży projekt w Fortran 2003, natkniesz się na błędy i będziesz musiał ciągle aktualizować swój kompilator (zwłaszcza jeśli używasz gcc), chociaż poprawiło się to znacznie w ciągu ostatnich kilku miesięcy!
Odpowiedź
Problem z C ++ jest taki że masz wiele szans na zrujnowanie wydajności, na przykład przez ślepe używanie STL, wyjątków, klas (wirtualne obciążenie plus alignm ent problemy), przeciążenie operatorów (redundantne nowe / usunięte) lub szablony (niekończąca się kompilacja i tajemnicze błędy wydają się niegroźne, ale w ten sposób można marnować godziny).
Jednak im więcej zyskujesz lepszy dostęp do bibliotek ogólnych i być może lepszą widoczność twojego kodu (chociaż to mocno zależy od dziedziny, a nadal masz czyste C). Nadal możesz zrekompensować brak elastyczności Fortrana, opakowując jego kod w język skryptowy, taki jak R, Lush, Matlab / Scilab, a nawet Python, Ruby lub Lua.
Komentarze
- Generalnie złym pomysłem jest stosowanie technik niskiego poziomu w językach wysokiego poziomu. Na przykład STL jest zaprojektowany tak, aby działał na bardzo abstrakcyjnym poziomie. Należy być świadomym interfejsu jest przeznaczony, użyj go do tego zadania, a następnie wyjdź z drogi kompilatorów.
- Myślę, że zarówno mbq ' si, jak i Martin ' punkty są niesprawiedliwe. Tak, istnieją sposoby, aby strzelić sobie w stopę, jeśli spróbujesz zaimplementować wektor numeryczny do celów algebry liniowej za pomocą std :: list < podwójne >. Ale to ' to głupi argument: przynajmniej C ++ ma połączoną klasę listy, którą może być używany, podczas gdy Fortran nie ' t. ' lubi mówić ” Samochody jeżdżą z tak dużą prędkością, że można uderzyć w ścianę i doznać obrażeń; zamiast tego powinieneś używać powozów konnych. ” To ' to tylko głupi pomysł, aby wyrzucić język wysokiego poziomu, który obsługuje również niski -poziomowe rzeczy (np. C ++) dla posiadania funkcji wysokiego poziomu.
- @WolfgangBangerth Nie, teraz szkodzisz Fortranowi – to jest ” niskiego poziomu „, ponieważ bakterie są ” mniej rozwinięte ” niż ludzie . Jeśli potrzebujesz analogii do samochodu, powinna być bardziej podobna do „. Możesz używać jeepa i Lexusa do przejechania bagnistej drogi, ale użycie pierwszego boli mniej „.
- Doceniam twoją opinię, ale uważam, że Fortran nie jest ' tak rozwinięty jak C ++: -)
Odpowiedź
Trzy fakty:
-
N-wymiarowy w stylu F77 tablice w C: Nie ma problemu z użyciem CnD (co prawda bezwstydna wtyczka)
-
System modułowy F90 jest źle zaprojektowany i nieprzyjazny dla środowisk budowania. (nazwa modułu nie musi pasować do nazwy pliku, np.)
- Fortran nie obsługuje dobrze refaktoryzacji. Wyciąganie części funkcjonalności funkcji wymaga dotknięcia czterech miejsc: aktualnego kodu, deklaracji zmiennych, deklaracji argumentów i listy argumentów. C ma dwa miejsca do dotknięcia. To potęguje efekt braku dobrego zarządzania danymi (malejąco poniżej): Ponieważ modułowość na małą skalę jest tak bolesna, prawie każdy pisze gigantyczne podprogramy.
Jedno osobiste wrażenie:
- Fortran nie działa dobrze do zarządzania danymi. Spróbuj zwrócić wskaźnik do nieprzezroczystej dla użytkownika struktury danych w F77 lub F90. (
transfer()
, nadchodzimy)
Komentarze
- Cześć Andreas! CnD jest interesujący, nie ' o tym nie wiedziałem. Ach, napisałeś to. 🙂 (f90 obsługuje również dzielenie na plasterki, przypisuje się do tablic i co najważniejsze – składnia tablicowa do mnożenia, dodawania itd.) Używam CMake z Fortranem i działa świetnie z modułami.Czym dokładnie jest ” lista argumentów „? Nie ' nie wydaje mi się, żebym ich używał, więc do modyfikacji potrzebne są tylko 3 miejsca. W C zazwyczaj trzeba zmodyfikować rzeczywisty kod, parametry i plik nagłówkowy, więc ' ma również 3 miejsca (zdecydowanie w C ++). Tak, transfer () nie ' nie jest super fajny, ale zazwyczaj ' nie potrzebujesz tego w praktyce.
- Refaktoryzacja nowoczesnego fortranu jest trywialna w przypadku odpowiednich IDE, takich jak Photran in Eclipse.
- ” Moduł ' nazwa nie ' nie musi pasować do nazwy pliku, np. ” Żartujesz, możesz mieć wiele modułów w jednym pliku. Niektóre z nich obejmują tylko kilka linii. Są znacznie łatwiejsze do utworzenia, jeśli nie musisz tworzyć pliku dla każdego z nich.
- Chciałem tylko dodać to, co powiedział @ user389, podczas gdy Photran jest świetny i jest jedynym Fortranem IDE, który pozwala refaktoryzacji, jego parser cały czas zawodzi. Z drugiej strony ' nie ma potrzeby komentowania faktu, że Eclipse jest głodny pamięci.
Odpowiedź
Fortran jest zoptymalizowany pod kątem obliczeń tablicowych / macierzowych i jest bardzo trudny do pracy przy każdym typie analizy tekstu. C i C ++ mogą nie pasować do Fortran w obliczeniach numerycznych (jest blisko), ale wydaje mi się, że znacznie łatwiej jest przetwarzać tekst i organizować dane (tj. Niestandardowe struktury danych) w C / C ++.
Jak inni wspominali, nie liczcie dynamicznych języków interpretowanych (Python i in.). Mogą one nie oferować z góry szybkości Fortana, ale pozwalają skupić się bardziej na rozwiązaniu problemu obliczeniowego niż na wszystkich szczegółach implementacji. Często możesz zaimplementować rozwiązanie w Pythonie, a jeśli wydajność jest nie do zaakceptowania, wykonaj pewne profilowanie, zidentyfikuj obszary problemowe i albo zoptymalizuj kod za pomocą Cythona, albo ponownie zaimplementuj cały program w skompilowanym języku. Po dopracowaniu logiki rozwiązywania problemów reszta to tylko implementacja i przy dobrym zrozumieniu podstaw obliczeń powinna być łatwa do przedstawienia w różnych językach programowania.
Komentarze
- To ' ma rację. Do parsowania tekstu używam również Pythona.
- Możesz także zaimplementować część skryptu Pythona w skompilowanym języku, np. C ++ i podłącz go. Np. Zwiększ Python, Swig itp.
Odpowiedź
Obecnie pracuję w jednym z laboratoriów krajowych. Większość ludzi wokół mnie to inżynierowie mechanicy. Rozmawiając z niektórymi z grup HPC, „zajmują się głównie Linuksem, a głównie C ++. Grupa, w której obecnie jestem, zajmuje się głównie aplikacjami komputerowymi i używamy systemu Windows oraz w porządku malejącym: C #, FORTRAN, Python, VBA i VB (6, nie .NET). Niektóre z silniki symulacyjne , których używamy, zostały napisane w innych laboratoriach krajowych w FORTRAN.
Odpowiedź
Przepraszamy za kopanie stary wątek, ale wydaje się, że nawet w 2015 roku Fortran jest często używany.
Właśnie natknąłem się na (alternatywnie link ), która jest w zasadzie listą 13 kodów zatwierdzonych przez ośrodek OCLF DOE do uruchomienia na maszynie 300-petaFLOPS Summit, która zostanie udostępniona badaczom w 2018 roku . Próbowałem znaleźć główny język używany w kodzie (na podstawie szybkiego wyszukiwania w Google) i oto co znalazłem:
XGC Fortran SPECFEM Fortran ACME Fortran (Bunch of climate codes) DIRAC Fortran (Mostly) FLASH Fortran GTC Fortran HACC C/C++ LS-DALTON Fortran (some C) NAMD C/C++ NUCCOR Fortran NWCHEM Fortran QMCPACK C++ RAPTOR Fortran
Więc na 13 przynajmniej 10 kodów (na podstawie mojego szybkiego wyszukiwania) wydaje się być napisanych w języku Fortran. Nieźle jak na język sprzed 50 lat.
UWAGA: Zdaję sobie sprawę, że porównania językowe są bezużyteczne, ale biorąc pod uwagę liczbę osób (szczególnie użytkowników C ++), którzy znają język Fortran, pomyślałem, że warto o tym wspomnieć.
Komentarze
- Nie zgadzam się, ponieważ moje doświadczenia z laboratoriów krajowych są wręcz przeciwne. Większość nowych projektów, które widzę w Lawrence Livermore, jest napisanych w C ++, a większość nowych (lub aktywnie utrzymywanych) najnowocześniejszych bibliotek open-source w solwerach ODE, dyskretyzacjach FEM i bibliotekach naukowych ogólnego przeznaczenia wydaje się być w C lub C ++. Wydaje się, że Fortran jest używany głównie w projektach, które korzystają z istniejących / starszych bibliotek; Nie ' nie widzę wielu dużych, nowych projektów używających języka Fortran, niezależnie od tego, co myślę o języku.
- Niektóre kody teorii funkcjonału gęstości napisane również w Fortran obejmuje VASP i CASTEP , chociaż jak wskazuje @GeoffOxberry, nowy projekty prawdopodobnie skłaniają się ku C ++.
- @blochwave Jak można przeczytać w linku, projekty dotyczą nowej maszyny (z akceleratorami itp.), która będzie dostępna online w 2018 roku.Więc to nie tak, że biorą 25-letni kod i kompilują go, mając nadzieję, że będą działać z dobrą wydajnością. Jestem całkiem pewien, że duża część kodów z powyższej listy została przepisana lub została przepisana, tak jak w nowym kodzie. Wiele ” nowych ” kodów klimatycznych jest również w języku Fortran i jest używanych przez wiele agencji w wielu krajach.
Odpowiedź
Jack P. Myślę, że próbuje powiedzieć, że powinieneś mieszać i dopasowywać. Dobry kawałek oprogramowania jest starannie ułożony. Różne warstwy mogą być mapowane bardziej naturalnie lub wydajniej w różnych językach. Powinieneś wybrać najbardziej odpowiedni język dla każdej warstwy. Powinieneś także zrozumieć, w jaki sposób języki mogą współdziałać, co może wpłynąć na wybór języka dla danej warstwy.
Lepszym pytaniem jest, jakie przykłady świetnie zaprojektowanego oprogramowania są warte przestudiowania, aby dowiedzieć się, jak projektować oprogramowanie warstwowe.