In meinem PhD-Programm für Computerwissenschaften arbeiten wir fast ausschließlich in C ++ und Fortran. Es scheint, als würden einige Professoren einander vorziehen. Ich frage mich, welches "besser" ist oder ob eines unter bestimmten Umständen besser ist als das andere.
56
Antworten:
Wie so oft hängt die Wahl von (1) dem Problem ab, das Sie lösen möchten, (2) den Fähigkeiten, die Sie haben, und (3) den Personen, mit denen Sie zusammenarbeiten (es sei denn, es handelt sich um ein Solo-Projekt). Ich werde (3) für den Moment beiseite lassen, weil es von der individuellen Situation eines jeden abhängt.
Problemabhängigkeit: Fortran zeichnet sich durch Array-Verarbeitung aus. Wenn sich Ihr Problem mit einfachen Datenstrukturen und insbesondere Arrays beschreiben lässt, ist Fortran gut geeignet. Fortran-Programmierer verwenden Arrays auch in nicht offensichtlichen Fällen (z. B. zur Darstellung von Diagrammen). C ++ eignet sich besser für komplexe und hochdynamische Datenstrukturen.
Fähigkeitsabhängigkeit: Um gute C ++ - Programme zu schreiben, ist viel mehr Programmiererfahrung erforderlich als um gute Fortran-Programme zu schreiben. Wenn Sie mit wenig Programmiererfahrung anfangen und nur so viel Zeit haben, um diesen Aspekt Ihres Jobs zu erlernen, erhalten Sie wahrscheinlich eine bessere Rendite für das Erlernen von Fortran als für das Erlernen von C ++. Vorausgesetzt natürlich, Ihr Problem passt zu Fortran.
Die Programmierung umfasst jedoch mehr als nur Fortran und C ++. Ich würde jedem empfehlen, der sich mit Computerwissenschaften beschäftigt, um mit einer dynamischen Hochsprache wie Python zu beginnen. Denken Sie immer daran, dass Ihre Zeit wertvoller ist als die CPU-Zeit!
quelle
Ich denke, dass sowohl C ++ als auch Fortran gut genug sind und gut funktionieren.
Ich denke jedoch, dass Fortran besser für numerisches wissenschaftliches Rechnen geeignet ist , für Algorithmen, die mithilfe von Arrays ausgedrückt werden können und keine anderen komplexen Datenstrukturen benötigen, also in Bereichen wie finiten Differenzen / Elementen, PDE-Lösern und elektronischen Strukturberechnungen. Fortran ist eine domänenspezifische Sprache. Insbesondere denke ich, dass es einfacher ist, schnelle Programme in Fortran als in C ++ zu schreiben , und zwar von einem Wissenschaftler (nicht unbedingt einem Informatik-Experten).
C ++ ist eine Allzwecksprache, daher kann man jeden Algorithmus darin ausdrücken, und es ist definitiv besser für Algorithmen, die nicht mit Arrays ausgedrückt werden können, aus dem HPC-Feld, wahrscheinlich einige Graphen, Netzgeneratoren, symbolische Manipulationen und so weiter.
Es ist auch möglich, Array-Algorithmen in C ++ zu schreiben, aber meiner Erfahrung nach erfordert dies viel mehr Informatikkenntnisse und im Allgemeinen mehr Arbeit (dh man muss Klassen für die Array-Manipulation erstellen oder wiederverwenden und die Speicherverwaltung von Hand oder unter Verwendung einiger Methoden handhaben Bibliothek wie Teuchos von Trilinos). Nicht-Experten neigen dazu, ziemlich gute Fortran-Programme zu schreiben, aber schreckliche C ++ - Programme (aus eigener Erfahrung).
Haftungsausschluss: Ich persönlich mag Fortran sehr und ich bevorzuge es für numerische Berechnungen gegenüber C ++. Ich habe über 2 Jahre lang täglich in C ++ programmiert und fast ein Jahr lang täglich im modernen Fortran (im Bereich der finiten Elemente). Ich benutze auch viel Python und Cython.
quelle
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:
quelle
Aus meinen 15 Jahren des Nachdenkens über wissenschaftliche Software: Wenn Ihr Code 25% schneller läuft, weil Sie ihn in Fortran schreiben, aber Sie 4-mal so lange brauchen, um ihn zu schreiben (keine STL, Schwierigkeiten beim Implementieren komplexer Datenstrukturen usw.), dann Fortran Gewinnt nur, wenn Sie einen erheblichen Teil Ihres Tages damit verbringen, mit den Daumen zu drehen und darauf zu warten, dass Ihre Berechnungen abgeschlossen sind. Angesichts der Tatsache, dass für fast alle von uns das Wertvollste unsere eigene Zeit ist, lautet die Schlussfolgerung: Verwenden Sie die Sprache, mit der Sie Ihren Code am schnellsten entwickeln, debuggen und testen können Du hast es in Fortran geschrieben.
quelle
Mein Ansatz war es, C ++ für alles andere als für Rechenkerne zu verwenden, die normalerweise am besten in Assembler geschrieben werden. Auf diese Weise erhalten Sie die gesamte Leistung des herkömmlichen HPC-Ansatzes, können jedoch die Benutzeroberfläche vereinfachen, z. B. indem Rechenkerne wie SGEMM / DGEMM / CGEMM / ZGEMM in einer einzigen Routine, z. B. Gemm, überladen werden. Die Abstraktionsstufe kann deutlich angehoben werden, indem rohe Zeiger vermieden und auf undurchsichtige Klassen umgeschaltet werden. Dies ist jedoch ein guter erster Schritt.
Der größte Nachteil von C ++ ist meines Erachtens die Verlängerung der Kompilierungszeit, aber meiner Erfahrung nach machen die Einsparungen bei der Entwicklungszeit dies mehr als wett. Ein weiterer Nachteil ist, dass Hersteller-C ++ - Compiler tendenziell mehr Fehler aufweisen als Hersteller-C- und Fortran-Compiler. Ich glaube, ich bin im letzten Jahr auf fast zehn Fehler in C ++ - Compilern gestoßen.
Trotzdem denke ich, dass das Rückgängigmachen von wissenschaftlichen Paketen, die in einfachen Sprachen (und Fortran) geschrieben sind, die Zurückhaltung ist, praktische Schnittstellen für anspruchsvolle Datenstrukturen bereitzustellen: Die meisten Menschen sind mit der Fortran BLAS-Schnittstelle zufrieden, da dies nur erforderlich ist Zeiger und führende Dimensionen zur Beschreibung von Matrizen, aber nur wenige Leute würden argumentieren, dass die übliche 40-Integer-Fortran-Sparse-Direct-Solver-Schnittstelle alles andere als praktisch ist (vgl. UHM, SuperLU, PETSc und Trilinos).
Zusammenfassend argumentiere ich, dass Assembly für Low-Level-Rechenkerne verwendet wird, für alles andere jedoch höhere Sprachen, insbesondere wenn nicht-triviale Datenstrukturen verwendet werden.
Beachten Sie, dass dieser Beitrag zu einem Vergleich der Leistung von C und Fortran auf dem Kernely:=αx+y .
quelle
Da ich neu hier bin, habe ich alte Fragen durchgesehen und diese gefunden. Es ist hoffentlich kein Tabu, alte Fragen zu beantworten!
Da dies sonst niemand erwähnt hat, dachte ich mir. Fortran 2003 wird von den meisten großen Compilern (Intel, IBM, Cray, NAG, PCG) fast vollständig unterstützt . Fortran 2003 (und 2008) ist eine objektorientierte Sprache, wenn auch etwas ausführlicher als C ++. Eines der Dinge, die ich an Fortran für gut halte, ist die Tatsache, dass das wissenschaftliche Rechnen des Standardkomitees als Hauptpublikum angesehen wird (ich danke Damian Rouson, der mich neulich darauf aufmerksam gemacht hat).
Ich erwähne dies alles nicht, damit C ++ - Programmierer zu Fortran-Programmierern werden, sondern damit Fortran-Benutzer wissen, dass sie jetzt mehr Optionen haben als nur auf C ++ umzusteigen oder objektorientierte Konzepte in Fortran 90/95 zu emulieren.
Eine Einschränkung, die ich hinzufügen möchte, ist, dass es Kosten verursacht, auf dem neuesten Stand zu sein, was in den Compilern implementiert ist. Wenn Sie gerade ein großes Projekt in Fortran 2003 durchführen, werden Sie über Fehler stolpern und müssen Ihren Compiler ständig aktualisieren (insbesondere, wenn Sie gcc verwenden), obwohl dies in den letzten Monaten erheblich besser geworden ist!
quelle
Das Problem mit C ++ besteht darin, dass Sie zahlreiche Möglichkeiten haben, die Leistung zu beeinträchtigen, beispielsweise durch blindes Verwenden von STL, Ausnahmen, Klassen (virtueller Overhead plus Ausrichtungsprobleme), Überladen von Operatoren (redundantes Neu / Löschen) oder Vorlagen (endloses Kompilieren und kryptische Fehler) scheinen gütig, aber Sie können Stunden auf diese Weise verschwenden).
Je mehr Sie jedoch erhalten, desto besser sind die allgemeinen Bibliotheken und möglicherweise die bessere Sichtbarkeit Ihres Codes (obwohl dies stark vom Feld abhängt und Sie immer noch über reines C verfügen). Und Sie können immer noch die mangelnde Flexibilität des Fortran ausgleichen, indem Sie seinen Code in eine Skriptsprache wie R, Lush, Matlab / Scilab oder sogar Python, Ruby oder Lua schreiben.
quelle
Drei Tatsachen:
F77-artige n-dimensionale Arrays in C: Kein Problem mit CnD ( zugegebenermaßen ein schamloser Stecker)
Das Modulsystem von F90 ist schlecht konzipiert und für die Erstellung von Umgebungen nicht geeignet. (Der Name eines Moduls muss nicht mit dem Dateinamen übereinstimmen, zB)
Ein persönlicher Eindruck:
transfer()
hier kommen wir)quelle
Fortran ist für Array- / Matrix-Berechnungen optimiert und ist für jede Art von Textanalyse eine echte Herausforderung. C und C ++ stimmen möglicherweise nicht mit Fortran im numerischen Rechnen überein (es ist eng), aber ich finde es viel einfacher, Text zu verarbeiten und Daten (dh benutzerdefinierte Datenstrukturen) mit C / C ++ zu organisieren.
Wie andere bereits erwähnt haben, zählen Sie dynamisch interpretierte Sprachen nicht mit (Python et al.). Sie bieten möglicherweise nicht die atemberaubende Geschwindigkeit von Fortan, aber sie ermöglichen es Ihnen, sich mehr auf die Lösung Ihres Computerproblems zu konzentrieren als auf alle Details der Implementierung. Oft können Sie eine Lösung in Python implementieren und, wenn die Leistung nicht akzeptabel ist, ein Profil erstellen, die Problembereiche identifizieren und entweder den Code mit Cython optimieren oder das gesamte Programm in einer kompilierten Sprache erneut implementieren. Sobald Sie die Problemlösungslogik ausgearbeitet haben, ist der Rest nur noch die Implementierung und sollte sich mit einem guten Verständnis der Computergrundlagen problemlos in einer Vielzahl von Programmiersprachen darstellen lassen.
quelle
Ich arbeite derzeit in einem der nationalen Labors. Die meisten Leute um mich herum sind Maschinenbauer. Unterhalten Sie sich mit einigen Leuten in den HPC-Gruppen, meistens mit Linux und meistens mit C ++. Die Gruppe, in der ich mich gerade befinde, beschäftigt sich hauptsächlich mit Desktop-Anwendungen. Wir verwenden Windows und in absteigender Reihenfolge: C #, FORTRAN, Python, VBA und VB (6, nicht .NET). Einige der von uns verwendeten Simulations-Engines wurden in anderen nationalen Labors in FORTRAN geschrieben.
quelle
Es tut mir leid, dass ich einen alten Faden ausgegraben habe, aber es scheint, dass Fortran auch im Jahr 2015 viel benutzt wird.
Ich bin gerade auf diese Liste (alternativer Link ) gestoßen, bei der es sich im Grunde genommen um eine Liste von 13 Codes handelt, die von der DOE-OCLF-Einrichtung für die Ausführung auf der 300-petaFLOPS-Summit-Maschine genehmigt wurden, die den Forschern 2018 zur Verfügung gestellt wird. Ich habe versucht, die Hauptsprache zu finden für den Code (basierend auf einer schnellen Google-Suche) und hier ist, was ich gefunden habe:
Von 13 Codes scheinen also mindestens 10 (basierend auf meiner Schnellsuche) in Fortran geschrieben zu sein. Nicht schlecht für eine 50-jährige Sprache.
ANMERKUNG: Mir ist klar, dass Sprachvergleiche nutzlos sind, aber angesichts der Anzahl der Leute (insbesondere von C ++ - Benutzern), die Fortran schlecht gelaunt haben, hielt ich es möglicherweise für sinnvoll, sie zu erwähnen.
quelle
Ich denke, Jack P. versucht zu sagen, dass Sie mischen und zusammenpassen sollten. Ein gutes Stück Software wird sorgfältig geschichtet. Verschiedene Ebenen können natürlicher oder effizienter auf verschiedene Sprachen abgebildet werden. Sie sollten für jede Ebene die am besten geeignete Sprache auswählen. Sie sollten auch wissen, wie Sprachen zusammenarbeiten können. Dies kann sich darauf auswirken, welche Sprache Sie für welche Ebene auswählen.
Eine bessere Frage ist, welche Beispiele für exzellent gestaltete Software es gibt, die es wert sind, studiert zu werden, um zu lernen, wie man geschichtete Software entwirft.
quelle