Rzucam też swoje dwa centy trochę za późno, ale dopiero co widziałem ten wątek i czuję, że dla potomnych jest kilka kwestii, które desperacko trzeba poczynić.
Zauważ, że będę mówić o C, a nie C ++. Dlaczego? Cóż, inaczej jabłka i pomarańcze porównują pełnoprawny, dynamicznie typowany obiektowy język z czymś tak statycznym jak Fortran. Tak, niektóre współczesne implementacje najnowszych standardów Fortran mogą zrobić coś więcej, ale bardzo niewiele osób z nich korzysta, więc kiedy mówimy o Fortranie, myślimy o języku prostym, statycznym i imperatywnym. Tam też jest C, więc zamienię C na C ++ dla następujących.
Przede wszystkim dyskusja na temat Fortran / C z lepszymi kompilatorami jest dyskusyjna. Dedykowane kompilatory C / Fortran należą już do przeszłości. Zarówno gcc / gfortran, jak i icc / ifc to po prostu różne interfejsy do tego samego zaplecza, tzn. Twój program zostanie przekształcony w abstrakcyjny opis przez interfejs, a następnie zoptymalizowany i złożony przez back-end. Jeśli napiszesz semantycznie ten sam kod w Fortran lub w C, kompilator w obu przypadkach utworzy ten sam zestaw, który będzie działał równie szybko.
To prowadzi teraz do mojej drugiej kwestii: dlaczego wciąż widzimy różnice? Problem polega na tym, że większość porównań przeprowadzają programiści Fortrana próbujący czegoś w C lub odwrotnie. Czy zauważyłeś kiedyś, jak 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 pewny siebie lub w domu? Oczywiście, że nie ... Sam uważam C za mój „rodzimy” język programowania. Spędziłem jednak również trzy lata pracując w grupie, która korzystała wyłącznie z Fortranu, w której osiągnąłem pewien poziom biegłości. Jednak nigdy nie napisałbym niczego samodzielnie w Fortranie, ponieważ czuję się bardziej komfortowo z językiem C, w wyniku czego powstały kod będzie lepszy , bez względu na to, jak go zdefiniujesz.
Główną różnicą jest programista, a nie język. Więc nie ma różnic? Cóż, niezupełnie. Oto kilka przykładów:
SIMD: Bez względu na to, czy chodzi o SSE, SSE3 czy AltiVec, jeśli chcesz ich używać w Fortranie, lepiej miej nadzieję i módl się, aby kompilator zgadł dokładnie, co chcesz i tak robi. Powodzenia. W C na ogół masz funkcje wewnętrzne dla każdej architektury lub, ostatnio, ogólne typy wektorów SIMD w gcc . Większość kompilatorów Fortran będzie używać tylko instrukcji SIMD 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ąder w C. Tak, grupa Portland ma teraz także kompilator fortran kompatybilny z CUDA , ale jest komercyjny, a co najważniejsze, nie pochodzi od NVIDIA. To samo dotyczy OpenCL, dla którego najlepsze, co mogłem znaleźć, to 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ć rzeczywistą kontrolę nad swoimi wątkami, tj. Jeśli masz w pełni dynamiczne obliczenia z pamięcią współużytkowaną, Fortran nie będzie ci zimno. W C masz standardowe wątki, które, choć nie są ciepłe i rozmyte, nadal prowadzą cię przez burzę. Ogólnie rzecz biorąc, większość obliczeń opartych na dostępie do systemu operacyjnego, np. Wątki, procesy, system plików itp., Lepiej jest obsługiwać w języku C. Och, i nie próbuj tworzyć sieci z Fortranem.
Łatwość użycia: Fortran jest bliższy Matlabowi niż C. Po zapoznaniu się z wszystkimi różnymi słowami kluczowymi i sposobem deklarowania zmiennych, reszta kodu wygląda jak Matlab, dzięki czemu jest bardziej dostępny dla użytkowników o ograniczonym doświadczeniu programistycznym.
Interoperacyjność: kiedy tworzysz strukturę w C, układ rzeczywistych danych jest prosty i deterministyczny. W Fortran, jeśli używasz tablic wskaźników lub danych strukturalnych, faktyczny układ danych jest silnie zależny od kompilatora, nie jest prosty i zwykle całkowicie nieudokumentowany. Możesz zadzwonić do C z Fortran i odwrotnie, ale nie zaczynaj myśleć, że może być tak łatwo przekazać coś więcej niż statyczną tablicę z jednej strony na drugą iz powrotem.
To wszystko jest trochę dziwaczne, na niskim poziomie, ale mówimy o obliczeniach o wysokiej wydajności, prawda? Jeśli nie jesteś zainteresowany tym, jak najlepiej wykorzystać podstawowe paradygmaty sprzętowe, tj. Wdrażanie i / lub opracowywanie algorytmów, które są najlepsze dla pamięci współużytkowanej / rozproszonej, wątków, wektoryzacji SIMD, GPU korzystających z SIMT i tak dalej, to jesteś po prostu wykonuję matematykę na komputerze.
Stało się to znacznie dłużej niż cokolwiek, w co uczestniczyłem, więc oto podsumowanie - zestaw pewnego rodzaju wiadomości:
- Będziesz pisać najlepszą kod Państwo może w języku, który cię znasz najlepiej.
- Nie ma różnicy w jakości kodu wytwarzanego przez dwa kompilatory, które używają tego samego zaplecza - to my piszemy zły kod w tym czy innym języku.
- Pomimo poczucia niskiego poziomu, Fortran jest dość wysokim poziomem abstrakcji i nie pozwala na bezpośredni dostęp do niektórych funkcji sprzętu / systemu operacyjnego, np. SIMD, wątków, sieci itp.