Ich werfe auch meine zwei Cent in letzter Zeit, aber ich habe gerade erst diesen Thread gesehen und ich habe das Gefühl, dass es für die Nachwelt ein paar Punkte gibt, die dringend hervorgehoben werden müssen.
Beachten Sie im Folgenden, dass ich über C und nicht über C ++ sprechen werde. Warum? Ansonsten ist es Äpfel und Orangen, eine vollwertige dynamisch typisierte objektorientierte Sprache mit etwas so Statischem wie Fortran zu vergleichen. Ja, einige moderne Implementierungen der neuesten Fortran-Standards können mehr als nur das, aber nur sehr wenige Menschen verwenden sie tatsächlich. Wenn wir also von Fortran sprechen, denken wir an einfache, statische und zwingende Sprache. Hier ist auch C, daher ersetze ich C durch C ++ für Folgendes.
Erstens ist jede Diskussion darüber, ob Fortran / C bessere Compiler hat, umstritten. Engagierte C / Fortran-Compiler gehören der Vergangenheit an. Sowohl gcc / gfortran als auch icc / ifc sind nur verschiedene Frontends für dasselbe Backend, dh Ihr Programm wird vom Frontend in eine abstrakte Beschreibung umgewandelt und dann vom Backend optimiert und zusammengestellt. Wenn Sie semantisch denselben Code in Fortran oder C schreiben, erzeugt der Compiler in beiden Fällen dieselbe Assembly, die genauso schnell ausgeführt wird.
Das führt jetzt zu meinem zweiten Punkt: Warum sehen wir immer noch Unterschiede? Das Problem ist, dass die meisten Vergleiche von Fortran-Programmierern angestellt werden, die etwas in C versuchen oder umgekehrt. Haben Sie jemals bemerkt, wie die meisten Autoren oder Dichter es vorziehen, in ihrer Muttersprache zu schreiben? Möchten Sie Gedichte in einer Sprache schreiben, in der Sie sich nicht ganz sicher oder zu Hause fühlen? Natürlich nicht ... Ich selbst betrachte C als meine "native" Programmiersprache. Ich habe jedoch auch drei Jahre in einer Gruppe gearbeitet, in der nur Fortran verwendet wurde und in der ich ein gewisses Maß an Geläufigkeit erreicht habe. In Fortran würde ich jedoch niemals alleine etwas schreiben, da ich mit C besser zurechtkomme und der resultierende Code infolgedessen besser ist , wie auch immer Sie das definieren.
Der Hauptunterschied liegt also im Programmierer, nicht in der Sprache. Es gibt also keine Unterschiede? Nicht ganz. Hier einige Beispiele:
SIMD: Ob SSE, SSE3 oder AltiVec, wenn Sie sie in Fortran verwenden möchten, hoffen Sie besser und beten Sie, dass der Compiler genau das errät , was Sie wollen, und tun Sie es. Viel Glück. In C haben Sie im Allgemeinen intrinsische Funktionen für jede Architektur oder in jüngerer Zeit allgemeine SIMD-Vektortypen in gcc . Die meisten Fortran-Compiler verwenden SIMD-Anweisungen nur zum Auflösen von Schleifen. Wenn Sie jedoch einen Kernel haben, der auf nicht offensichtliche Weise mit kurzen Vektoren von Daten arbeitet, wird dieser vom Compiler höchstwahrscheinlich nicht angezeigt.
Unterschiedliche Hardwarearchitekturen: Die gesamte CUDA-Architektur basiert auf Kernels in C. Ja, die Portland Group verfügt jetzt auch über einen CUDA-fähigen Fortran-Compiler , der jedoch kommerziell ist und vor allem nicht von NVIDIA stammt. Gleiches gilt für OpenCL, für das das Beste, was ich finden konnte, ein aktuelles Projekt ist, das nur einige grundlegende Aufrufe unterstützt.
Parallele Programmierung: Ja, sowohl MPI als auch OpenMP funktionieren problemlos mit C und Fortran. Wenn Sie jedoch eine echte Kontrolle über Ihre Threads wünschen, dh wenn Sie über eine vollständig dynamische Shared-Memory-Berechnung verfügen, sind Sie mit Fortran in der Kälte. In C haben Sie die Standard-PThreads, die Sie zwar nicht warm und flockig, aber dennoch durch den Sturm bringen. Im Allgemeinen sind die meisten Berechnungen, die auf dem Zugriff auf das Betriebssystem basieren, z. B. Threads, Prozesse, Dateisysteme usw., besser für C. Oh, und versuchen Sie nicht, Ihr eigenes Netzwerk mit Fortran aufzubauen.
Benutzerfreundlichkeit: Fortran ist näher an Matlab als C. Wenn Sie alle Schlüsselwörter und das Deklarieren von Variablen verstanden haben, sieht der Rest des Codes wie Matlab aus und ist für Benutzer mit eingeschränkter Programmiererfahrung leichter zugänglich.
Interoperabilität: Wenn Sie eine Struktur in C erstellen, ist das Layout der tatsächlichen Daten einfach und deterministisch. Wenn Sie in Fortran Zeigerarrays oder strukturierte Daten verwenden, ist das tatsächliche Layout der Daten stark vom Compiler abhängig, nicht direkt und in der Regel vollständig undokumentiert. Sie können C von Fortran aus aufrufen und umgekehrt, aber denken Sie nicht, dass es möglicherweise so einfach ist, mehr als ein statisches Array von einem zum anderen und zurück zu übergeben.
Das ist alles ein bisschen abgefahren, aber es handelt sich um High-Performance-Computing, oder? Wenn Sie nicht daran interessiert sind, wie Sie die zugrunde liegenden Hardware-Paradigmen am besten nutzen können, dh Algorithmen implementieren und / oder entwickeln, die sich am besten für gemeinsam genutzten / verteilten Speicher, Threads, SIMD-Vektorisierung, GPUs mit SIMT usw. eignen Ich mache nur Mathe auf einem Computer.
Das ist viel länger als alles, was ich vorhatte. Hier ist eine Zusammenfassung - eine Reihe von Mitbringseln:
- Sie erhalten den besten Code schreiben Sie in der Sprache können die Sie am besten kennen.
- Es gibt keinen Unterschied in der Qualität des Codes, der von zwei Compilern erstellt wird, die dasselbe Back-End verwenden - wir sind es , die fehlerhaften Code in der einen oder anderen Sprache schreiben.
- Fortran ist eine Abstraktion auf höchstem Niveau, mit der Sie nicht direkt auf bestimmte Hardware- / Betriebssystemfunktionen zugreifen können, z. B. SIMD, Threads, Netzwerke usw.