In meinem Computerprogramm 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 unter bestimmten Umständen „besser“ ist oder ob eines besser ist als das andere.

Kommentare

  • Eine Mischung aus einem High und Low-Level-Sprache ist meiner Meinung nach besser als ausschließlich zu verwenden. Z.B. Ich verwende Python + C ++.
  • Die Antworten auf diese Frage sind fast rein subjektiv und daher bin ich ‚ nicht sicher, ob diese Frage angemessen ist.

Antwort

Wie so oft hängt die Auswahl von (1) dem Problem ab, das Sie lösen möchten, (2) dem Fähigkeiten, die Sie haben, und (3) die Leute, mit denen Sie arbeiten (es sei denn, es ist ein Solo-Projekt). Ich werde (3) für den Moment beiseite lassen, weil es von der individuellen Situation jedes Einzelnen abhängt.

Problemabhängigkeit: Fortran zeichnet sich durch eine hervorragende Array-Verarbeitung aus. Wenn Ihr Problem anhand einfacher Datenstrukturen und insbesondere anhand von Arrays beschrieben werden kann, ist Fortran gut angepasst. 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: Das Schreiben guter C ++ – Programme erfordert viel mehr Programmiererfahrung als das Schreiben guter Fortran-Programme. Wenn Sie mit wenig Programm beginnen Wenn Sie Erfahrung haben und nur so viel Zeit haben, um diesen Aspekt Ihres Jobs zu lernen, erzielen Sie wahrscheinlich eine bessere Rendite beim Erlernen von Fortran als beim Erlernen von C ++. Vorausgesetzt natürlich, Ihr Problem ist für Fortran geeignet.

Die Programmierung umfasst jedoch mehr als nur Fortran und C ++. Ich würde jedem empfehlen, der in die Computerwissenschaft einsteigt, mit einem dynamischen Hoch zu beginnen Level-Sprache wie Python. Denken Sie immer daran, dass Ihre Zeit wertvoller ist als die CPU-Zeit!

Kommentare

  • “ Denken Sie immer daran Ihre Zeit ist wertvoller als die CPU-Zeit! “ Als jemand, der in HPC arbeitet, bin ich mit diesem Teil nicht einverstanden. Alles andere ist genau richtig.
  • “ Denken Sie immer daran, dass Ihre Zeit wertvoller ist als die CPU-Zeit! “ As Jemand, der in der wissenschaftlichen Forschung arbeitet, konnte ich ‚ diesem Teil nicht mehr zustimmen.
  • “ Denken Sie immer daran Ihre Zeit ist wertvoller als die CPU-Zeit! “ – Ich ‚ möchte meine 2 Cent einwerfen – mit jeweils mehreren hundert Knoten Wenn mehr als 10 Kerne ein Programm für mehrere Wochen ausführen, kann dies als schreckliche Verschwendung einer äußerst wertvollen Ressource angesehen werden, wenn in ein paar weiteren Wochen ein Code erstellt werden kann, der in nur wenigen Tagen ausgeführt wird. Diese HPC-Cluster sind eine seltene und teure gemeinsame Ressource.
  • “ Denken Sie immer daran, dass Ihre Zeit wertvoller ist als die CPU-Zeit! „, Code für eine Woche, aber für einen Monat, dies ‚ ist ganz normal, Sir!
  • “ Denken Sie immer daran, dass Ihre Zeit wertvoller ist als die CPU-Zeit! „, ich würde lieber einen Monat lang codieren und in einer Woche laufen! – Sobald der Code geschrieben ist, kann mehr getan werden, und andere finden den von Ihnen geschriebenen Code ebenfalls nützlicher.

Antwort

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 mit ausgedrückt werden können Arrays und benötigen keine anderen hoch entwickelten Datenstrukturen, also in Bereichen wie endlichen Differenzen / Elementen, PDE-Lösern, elektronischen Strukturberechnungen. Fortran ist eine domänenspezifische Sprache. Insbesondere denke ich, dass es einfacher ist, schnell zu schreiben Programme in Fortran als in C ++ von einem Wissenschaftler (nicht unbedingt einem Informatikexperten).

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 Diagramme, Netzgeneratoren, symbolische Manipulationen usw.

Es ist auch möglich, Arra zu schreiben y Algorithmen in C ++, aber meiner Erfahrung nach erfordert es viel mehr Informatikkenntnisse und im Allgemeinen mehr Arbeit (d. h. Man muss Klassen für die Array-Manipulation erstellen oder wiederverwenden und die Speicherverwaltung von Hand oder mithilfe einer Bibliothek wie Teuchos von Trilinos durchführen. 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 bevorzuge es für numerisches Rechnen gegenüber C ++. Ich habe mehr als 2 Jahre täglich in C ++ programmiert und fast ein Jahr täglich in modernem Fortran (im Bereich der finiten Elemente). Ich benutze auch viel Python und Cython.

Kommentare

  • Eins für die erste Antwort, die ausgeglichen ist. Ich denke, C ++ und Fortran sind bei weitem nicht die einzigen Möglichkeiten in der heutigen HPC. Ich denke, es ist gut, die Stärken und Schwächen zu kennen, wenn Sie sich für Fortran, C ++ oder Python entscheiden (oder was auch immer Sie mögen). Ich habe 20.000 Zeilen Fortran in einer einzigen Datei gesehen, die über einige Jahrzehnte biologisch gewachsen ist. Ich persönlich würde nichts anderes als isoliertes Heavy-Array-Computing verwenden. Nicht einmal für irgendetwas, das mit der Ausgabe zu tun hat. Bisher für einen voreingenommenen Kommentar.
  • Ich konnte ‚ dieser Antwort nicht mehr widersprechen. Unser Finite-Elemente-Code hätte in Fortran nicht geschrieben werden können. Tatsächlich begann es vor 15 Jahren als eine Mischung aus einfachem C und Fortran (letzteres gilt für die numerisch intensiven Teile der Methode) und wechselte im Laufe mehrerer Jahre allmählich zu reinem C und dann zu C ++. Der Code wurde durchweg kürzer, schneller und verständlicher und war nach jeder Iteration leistungsfähiger. Ich stimme anderen zu, die darauf hinweisen, dass C ++ Ihnen genügend Seil bietet, mit dem Sie sich selbst erschießen können. Wählen Sie die Sprache aus, mit der Sie ‚ am besten vertraut sind.
  • Bill, haben Sie das moderne Fortran verwendet (90 und spätere Ergänzungen?). Dies ist sehr wichtig (ich hätte in meiner Antwort darauf expliziter sein sollen). Natürlich ist “ 20.000 Zeilen Fortran “ oder f77 normalerweise nicht besser als gut geschriebenes C ++.
  • @ OndřejČert í k: Ich denke, wenn Sie glauben, dass moderne Finite-Elemente-Programme “ verwenden, verwenden Sie einfach “ Datenstrukturen, dann haben Sie ‚ in letzter Zeit keine von ihnen angesehen. Versuchen Sie, adaptive Finite Elemente, HP-Methoden oder Multigrid in unstrukturierten Netzen mithilfe einfacher Datenstrukturen zu implementieren. Bill ist genau richtig und ich glaube, ich kann für ihn sprechen, indem ich sage, dass die Verwendung von “ modernem Fortran “ kaum mehr als ein kleines gemacht hätte Unterschied.
  • @WolfgangBangerth, siehe zum Beispiel Phaml ( math.nist.gov/phaml ) für eine Fortran-Implementierung von so ziemlich allem Sie haben es erwähnt.

Antwort

Ich werfe auch meine zwei Cent in letzter Zeit, aber ich “ Ich habe diesen Thread gerade erst gesehen und bin der Meinung, dass für die Nachwelt einige Punkte dringend zu beachten sind.

Beachten Sie im Folgenden, dass ich über C und nicht über C ++ sprechen werde. Warum? Ansonsten sind 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 sie, und wenn wir von Fortran sprechen, denken wir an eine einfache, statische und zwingende Sprache. Dort ist auch C, also werde ich C für Folgendes durch C ++ ersetzen.

Zuerst von Alles in allem ist jede Diskussion über Fortran / C mit besseren Compilern umstritten. Engagierte C / Fortran-Compiler gehören der Vergangenheit an. Sowohl gcc / gfortran als auch icc / ifc sind nur unterschiedliche Frontends für dasselbe Backend, dh Ihr Programm wird vom Front-End in eine abstrakte Beschreibung umgewandelt und dann vom Back-End optimiert und zusammengestellt. Wenn Sie semantisch denselben Code in Fortran oder C schreiben, erzeugt der Compiler in beiden Fällen dieselbe Assembly Das wird genauso schnell laufen.

Dies führt nun zu meinem zweiten Punkt: Warum sehen wir immer noch Unterschiede Erenzen? Das Problem ist, dass die meisten Vergleiche von Fortran-Programmierern durchgeführt werden, die etwas in C versuchen oder umgekehrt. Haben Sie jemals bemerkt, dass 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 „muttersprachliche“ Programmiersprache. Ich habe jedoch auch drei Jahre verbracht Ich arbeite in einer Gruppe, die nur Fortran verwendet, in der ich ein gewisses Maß an Geläufigkeit erreicht habe. Ich würde jedoch niemals alleine etwas in Fortran schreiben, da ich mit C und dem daraus resultierenden Code besser vertraut bin wird besser sein, was auch immer Sie als definieren.

Der Hauptunterschied liegt also im Programmierer, nicht in der Sprache. Es gibt also keine Unterschiede? Nicht ganz. Hier einige Beispiele:

  • SIMD: Ob es sich um SSE, SSE3 oder AltiVec handelt, wenn Sie sie in Fortran verwenden möchten, hoffen Sie besser und beten Sie, dass der Compiler genau was Sie wollen und tut es auch. 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 nur SIMD-Anweisungen, um Schleifen abzuwickeln. Wenn Sie jedoch einen Kernel haben, der auf kurze Datenvektoren auf nicht offensichtliche Weise arbeitet, wird der Compiler ihn höchstwahrscheinlich nicht sehen.

  • Unterschiedliche Hardwarearchitekturen: Die gesamte CUDA-Architektur basiert auf Kerneln in C. Ja, die Portland Group verfügt jetzt über eine CUDA -fähiger Fortran-Compiler auch, aber es ist kommerziell und vor allem nicht von NVIDIA. 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 mit C und Fortran einwandfrei. Wenn Sie jedoch eine echte Kontrolle über Ihre Threads wünschen, dh wenn Sie eine vollständig dynamische Berechnung des gemeinsam genutzten Speichers haben, sind Sie mit Fortran in der Kälte unterwegs. In C haben Sie die Standard-Pthreads, die zwar nicht warm und unscharf sind, dies jedoch tun Sie werden immer noch durch den Sturm geführt. Im Allgemeinen werden die meisten Berechnungen, die auf dem Zugriff auf das Betriebssystem beruhen, z. B. Threads, Prozesse, Dateisysteme usw., besser mit C bedient. Oh, und versuchen Sie nicht, Ihre eigenen Berechnungen durchzuführen Vernetzung mit Fortran.

  • Benutzerfreundlichkeit: Fortran liegt näher an Matlab als C. Sobald Sie alle verschiedenen Schlüsselwörter und das Deklarieren von Variablen verstanden haben, sieht der Rest des Codes wie Matlab aus und macht ihn für Benutzer mit eingeschränkter Programmiererfahrung zugänglicher.

  • 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 und nicht direkt. vorwärts und normalerweise völlig undokumentiert. Sie können C von Fortran aus und umgekehrt aufrufen, aber denken Sie nicht, dass es so einfach sein kann, mehr als ein statisches Array von einem zum anderen und zurück zu übergeben.

Das ist alles etwas geeky, Low-Level-Zeug, aber das ist High-Performance-Computing, von dem wir sprechen, richtig? Wenn Sie nicht daran interessiert sind, wie Sie die zugrunde liegende Hardware am besten ausnutzen können Paradigmen, dh Implementierung und / oder Entwicklung von Algorithmen, die am besten für gemeinsam genutzten / verteilten Speicher, Threads und SIMD-Vektorisierung geeignet sind , GPUs, die SIMT verwenden, und so weiter, dann „rechnen Sie nur noch auf einem Computer.

Dies ist viel länger geworden als alles, was ich beabsichtigt habe, also hier“ eine Zusammenfassung – eine Reihe von Mitnehmen Nachrichten der Art:

  • Sie schreiben den besten Code , den Sie können, in der Sprache, 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 schreiben schlechten Code in der einen oder anderen Sprache.
  • Fortran ist eine Abstraktion auf hoher Ebene und lässt Sie nicht direkt auf bestimmte Hardware- / Betriebssystemfunktionen zugreifen, z SIMD, Threads, Netzwerke usw.

Kommentare

  • Gute Antwort. Ich glaube nicht, dass ‚ jedoch Ihr letzter Kommentar unbedingt wahr ist. Ich ‚ bin selbst C-Programmierer, aber Sie erhalten durch gute Programmierpraktiken Zugriff auf Dinge auf niedriger Ebene in Fortran. Der ideale Weg, um Dinge wie SIMD-Operationen zu verwenden, besteht darin, Code zu schreiben, der dies stark vorschlägt (z. B. Blockieren von Schleifen), und den Compiler dies für Sie tun zu lassen. Verwenden Sie zum Threading einfach openMP (pthreads kann auch mit etwas zusätzlicher Arbeit verwendet werden). Fortran hat all die Dinge, die Sie erwähnen, nicht ‚ t, nur auf einer Ebene, die für seinen typischen Benutzer wichtig ist: numerisch.
  • @ Reid.Atcheson: Nun Wenn Sie alles so blockieren, dass der Compiler es abfängt, funktioniert es automatisch sowohl in C als auch in Fortran. Das Problem ist jedoch, inwieweit Sie Ihrem Compiler vertrauen möchten. Und warum möchten Sie ihm vertrauen müssen, wenn Sie genau wissen, was Sie tun möchten? OpenMP führt Threading durch, ja, aber blockweise. Sie können es dazu bringen, verschiedene Thread-Pools dazu zu bringen, verschiedene Dinge zu tun, aber das ist nur eine falsche Verwendung von OpenMP. Pthreads für Fortran sind nur Wrapper für die C-Funktionen. Ich stimme jedoch zu, dass Fortran einfacher ist, wenn Sie ‚ nicht auf Details eingehen.
  • Sicher, dass Sie nicht ‚ Mit dem Compiler wird keine maximale Effizienz von 99% erreicht, aber Sie können leicht ganz nah kommen. Darüber hinaus müssen Sie entweder Intrinsics oder Inline-ASM verwenden. Sie müssen irgendwo Zugeständnisse machen, um die Gesamteffizienz des Programmierers zu gewährleisten. ‚ ist der Grund, warum Programmiersprachen überhaupt existieren. In dem Stadium, in dem Sie tatsächlich verrückt genug sind, um auf die Details von Intrinsics oder ASM einzugehen (ich war schon einige Male), ist Fortran keine ‚ keine Krücke. Sie ‚ wissen sowieso, wie Sie Ihren zusammengestellten handoptimierten Code verknüpfen können.
  • @ Reid.Atcheson: Nun, ich ‚ d argumentieren, dass bei parallelen HPC-Anwendungen die Spitzeneffizienz möglicherweise weit unter 99% liegt … Und die gcc-Vektortypen machen die Verwendung von Intrinsics zu einem Problem 🙂
  • @Pedro, Genialer Beitrag. Absolut brilliant. Vielen Dank für die Veröffentlichung.Ich habe es gerade beim zufälligen Stöbern in interessanten Threads gefunden.

Antwort

Aus meinen 15 Jahren des Denkens über wissenschaftliche Software : Wenn Ihr Code 25% schneller ausgeführt wird, weil Sie ihn in Fortran schreiben, das Schreiben jedoch viermal so lange dauert (keine STL, Schwierigkeiten bei der Implementierung komplexer Datenstrukturen usw.), gewinnt Fortran nur, wenn Sie einen erheblichen Teil davon ausgeben Ihr Tag dreht die Daumen und wartet darauf, 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, ohne zu berücksichtigen, dass er möglicherweise langsamer als möglich ist Sie haben es in Fortran geschrieben.

Antwort

Mein Ansatz war es, C ++ für alles außer für Rechenkerne zu verwenden, die normalerweise am besten sind in der Versammlung geschrieben; Dadurch erhalten Sie die gesamte Leistung des herkömmlichen HPC-Ansatzes, können jedoch die Schnittstelle vereinfachen, indem Sie beispielsweise Rechenkerne wie SGEMM / DGEMM / CGEMM / ZGEMM in eine einzige Routine überladen, z. B. Gemm. Natürlich kann die Abstraktionsebene viel höher angehoben werden, indem rohe Zeiger vermieden und zu undurchsichtigen Klassen gewechselt werden. Dies ist jedoch ein guter erster Schritt.

Ich finde, der größte Nachteil von C ++ ist überwiegend die Verlängerung der Kompilierungszeit. Nach meiner Erfahrung machen die Einsparungen bei der Entwicklungszeit dies jedoch mehr als wett. Ein weiterer Nachteil ist, dass C ++ – Compiler von Anbietern tendenziell mehr Fehler aufweisen als Compiler von Anbietern C und Fortran. Ich glaube, ich habe im vergangenen Jahr fast zehn Fehler in C ++ – Compilern festgestellt.

Nach alledem denke ich, dass das Rückgängigmachen von wissenschaftlichen Paketen, die in Low-Level-Sprachen (und Fortran) geschrieben wurden, der Fall ist die Zurückhaltung, bequeme Schnittstellen für ausgefeilte Datenstrukturen bereitzustellen: Die meisten Menschen sind mit der Fortran BLAS-Schnittstelle zufrieden, da sie nur Zeiger und führende Dimensionen zur Beschreibung von Matrizen benötigt, aber nur wenige Leute würden argumentieren, dass die übliche 40-Ganzzahl-Fortran-Schnittstelle mit geringer Dichte und direktem Löser ist alles in der Nähe von bequem (vgl. UHM, SuperLU, PETSc und Trilinos).

Zusammenfassend argumentiere ich, Assembly für Low-Level-Rechenkerne zu verwenden, aber für alles andere übergeordnete Sprachen, insbesondere wenn nicht triviale Datenstrukturen verwendet werden.

Beachten Sie, dass dies der Fall ist Der Beitrag führte zu diesem Vergleich der Leistung von C und Fortran auf dem Kernel $ y: = \ alpha x + y $ .

Kommentare

  • Warum ‚ vertrauen Sie nicht einem Standard-C-Compiler mit entsprechender Optimierung zum Kompilieren kleiner Kernel? Auf dieser Ebene der Codegröße und -komplexität ist der Unterschied, was ein Compiler daraus ziehen könnte, unklar.
  • Ich habe mit mehreren Leuten gesprochen, die mir gesagt haben, dass ihr Fortran trotz angemessener Einschränkung der Verwendung war immer noch schneller als ihr C- und / oder C ++ – Code für einige Operationen wie eine explizite Matrixtransponierung. Ich ‚ sage nicht, dass es ‚ unmöglich ist, den C- oder C ++ – Code so schnell zu machen, aber dass der Fortran-Compiler dazu neigt Ein besserer Job.
  • Ich habe die gleiche Erfahrung mit dem Schlüsselwort “ “ (mein einfacher Fortran-Code war immer etwas schneller). Mein Fachwissen ist jedoch begrenzt, und ich habe einfach keine Zeit, in das Verständnis der von gcc generierten Baugruppe zu investieren. ‚ Also benutze ich einfach Fortran, es ist ‚ einfach und ‚ schnell.
  • @JackPoulson: Der Compiler Argumentation ist etwas, was ich ziemlich oft von der Fortran-Community höre. Leider können die meisten Compiler, z. Verwenden Sie für gcc oder ifc / icc verschiedene Sprach-Frontends für dasselbe Backend. Die Maschinerie zur Optimierung und Codegenerierung ist identisch, und daher sind die Unterschiede in den Ergebnissen höchstwahrscheinlich auf Unterschiede in der Vertrautheit des Programmierers mit der zugrunde liegenden Sprache zurückzuführen …
  • Nur um ein wenig Perspektive zu geben zu der oft wiederholten, selten validierten Behauptung, dass Fortran auf numerischen Kerneln schneller ist: Vor einiger Zeit stellten wir fest, dass der spärliche Matrixvektor in Trilinos ‚ Epetra-Paket 30% langsamer war als der in Deal.II. Ersteres wurde in Fortran 77 geschrieben, letzteres in C ohne Verwendung von ‚ einschränken ‚. Beide hatten ungefähr 10-15 Codezeilen. Heute verwendet Trilinos den Code, der aus dem Deal.II gehisst wurde. Ich ‚ bin sicher, dass man viele Fälle finden kann, in denen F77 schneller als C ist. Der Punkt ist, dass ‚ nicht mehr so universell ist heute.

Antwort

Da ich neu hier bin, habe ich alte Fragen durchgesehen und diese gefunden. Hoffentlich ist es kein Tabu, alte zu beantworten!

Da dies noch niemand erwähnt hat, dachte ich mir, ich würde es tun. Fortran 2003 wird fast vollständig von den meisten großen Compilern (Intel, IBM, Cray, NAG, PCG) unterstützt, sogar gcc mit dem (in Kürze) neueste Version 4.7. Fortran 2003 (und 2008) ist eine objektorientierte Sprache, wenn auch etwas ausführlicher als C ++. Eines der Dinge, die ich an Fortran für nett halte, ist die Tatsache, dass das Standardkomitee das wissenschaftliche Rechnen als primäres Publikum ansieht (ich danke Damian Rouson, dass er mich neulich darauf hingewiesen hat).

Ich spreche das alles nicht an, damit C ++ – Programmierer zu Fortran-Programmierern werden, sondern damit Fortran-Leute wissen, dass sie jetzt mehr Optionen haben, als zu C ++ zu wechseln oder objektorientierte Konzepte in Fortran 90/95 zu emulieren.

Eins Ich möchte hinzufügen, dass es mit Kosten verbunden ist, auf dem neuesten Stand zu sein, was in den Compilern implementiert ist. Wenn Sie jetzt ein großes Projekt in Fortran 2003 durchführen, werden Sie auf Fehler stoßen und Ihren Compiler ständig aktualisieren müssen (insbesondere Wenn Sie gcc) verwenden, obwohl dies in den letzten Monaten erheblich besser geworden ist!

Antwort

Das Problem mit C ++ ist dass Sie zahlreiche Chancen haben, die Leistung zu beeinträchtigen, indem Sie beispielsweise STL, Ausnahmen und Klassen blind verwenden (virtueller Overhead plus Alignm) Probleme), Überlastung des Bedieners (redundantes Neu / Löschen) oder Vorlagen (endlose Kompilierung und kryptische Fehler scheinen harmlos zu sein, aber Sie können auf diese Weise Stunden verschwenden).

Je mehr Sie jedoch einen besseren Zugriff auf allgemeine Bibliotheken und möglicherweise eine bessere Sichtbarkeit Ihres Codes erhalten (obwohl dies stark vom Feld abhängt und Sie immer noch reines C haben). Und Sie können die mangelnde Flexibilität des Fortran immer noch ausgleichen, indem Sie seinen Code in eine Skriptsprache wie R, Lush, Matlab / Scilab oder sogar Python, Ruby oder Lua einbinden.

Kommentare

  • Es ist im Allgemeinen eine schlechte Idee, Techniken auf niedriger Ebene in Hochsprachen anzuwenden. Beispielsweise ist die STL so konzipiert, dass sie auf einer sehr abstrakten Ebene arbeitet. Man muss sich der Schnittstelle bewusst sein wurde entwickelt für, verwenden Sie es für diese Aufgabe und gehen Sie dann den Compilern aus dem Weg.
  • Ich denke, sowohl mbq ‚ s als auch Martin ‚ s Punkte sind unfair. Ja, es gibt Möglichkeiten, sich in den Fuß zu schießen, wenn Sie versuchen, einen numerischen Vektor für lineare Algebrazwecke mit std :: list < double >. Aber das ‚ ist ein dummes Argument: Zumindest C ++ hat eine verknüpfte Listenklasse, die Sie haben kann verwenden, während Fortran nicht ‚ t. Es ‚ ist wie “ Autos fahren mit so hoher Geschwindigkeit, dass Sie gegen eine Wand stoßen und sich verletzen können. Sie sollten stattdessen Pferdekutschen verwenden. “ ‚ Es ist nur eine dumme Idee, eine Hochsprache zu verwerfen, die auch Low unterstützt -level Zeug (zB C ++) für mit High-Level-Funktionen.
  • @WolfgangBangerth Nein, jetzt verletzen Sie Fortran – es ist wie “ Low-Level “ als Bakterien “ weniger entwickelt “ als Menschen . Wenn Sie eine Autoanalogie wünschen, sollte diese eher wie “ sein. Sie können sowohl Jeep als auch Lexus verwenden, um eine sumpfige Nebenstraße zu überqueren, aber die Verwendung der ersten tut weniger weh „.
  • Ich schätze Ihre Meinung, aber ich behaupte, dass Fortran ‚ nicht so entwickelt ist wie C ++: -)

Antwort

Drei Fakten:

  • n-dimensional im F77-Stil Arrays in C: Kein Problem mit dem Modulsystem von CnD (zugegebenermaßen ein schamloser Stecker)

  • F90 ist schlecht entworfen und feindlich gegenüber Build-Umgebungen. (Der Name eines Moduls muss nicht mit seinem Dateinamen übereinstimmen, z. B.)

  • Fortran unterstützt das Refactoring nicht gut Für eine Funktion müssen Sie vier Stellen berühren: Tatsächlicher Code, Variablendeklarationen, Argumentdeklarationen und Argumentliste. C kommt mit zwei Berührungsstellen zurecht. Dies verstärkt den Effekt, dass Daten nicht gut verwaltet werden (absteigend) unten gerippt): Da die Modularität im kleinen Maßstab so schmerzhaft ist, schreibt fast jeder gigantische Unterprogramme.

Ein persönlicher Eindruck:

  • Fortran funktioniert nicht gut zum Verwalten von Daten. Versuchen Sie, einen Zeiger auf eine benutzeropake Datenstruktur in F77 oder F90 zurückzugeben. (transfer(), hier kommen wir)

Kommentare

  • Hallo Andreas! CnD ist interessant, ich wusste ‚ nichts davon. Ah, du hast es geschrieben. 🙂 (f90 unterstützt auch das Slicing, das für Arrays und vor allem für die Array-Syntax für Multiplikation, Addition usw. zugewiesen werden kann.) Ich verwende CMake mit Fortran und es funktioniert hervorragend mit Modulen.Was genau ist die Argumentliste “ „? Ich glaube nicht, dass ich diese verwende, daher werden nur 3 Stellen zum Ändern benötigt. Id id = „409539c747“>

In C müssen Sie normalerweise den tatsächlichen Code, die Parameter und eine Header-Datei ändern, sodass ‚ auch 3 Stellen enthält (definitiv in C ++). Ja, transfer () ist nicht ‚ nicht super nett, aber normalerweise benötigen Sie es in der Praxis nicht ‚.

  • Das Refactoring von modernem fortran ist mit geeigneten IDEs wie Photran in Eclipse trivial.
  • “ Der Name eines Moduls ‚ ‚ muss nicht mit dem Dateinamen übereinstimmen, z. B. “ Sie müssen scherzen, Sie können viele Module in einer Datei haben. Einige von ihnen überspannen nur ein paar Zeilen. Sie sind viel einfacher zu erstellen, wenn Sie nicht für jede Datei eine Datei erstellen müssen.
  • Ich wollte nur hinzufügen, was @ user389 gesagt hat, während Photran großartig ist und die einzige Fortran-IDE ist, die dies zulässt Bei Refactorings schlägt der Parser ständig fehl. Andererseits muss ‚ nicht kommentiert werden, dass Eclipse speicherhungrig ist.
  • Answer

    Fortran ist für Array- / Matrixberechnungen optimiert und für jede Art von Textanalyse eine schwierige Aufgabe. C und C ++ stimmen beim numerischen Rechnen möglicherweise nicht mit Fortran überein (es ist eng), aber ich finde es viel einfacher, Text zu verarbeiten und Daten (dh benutzerdefinierte Datenstrukturen) mit C / C ++ zu organisieren.

    As andere haben erwähnt, dynamisch interpretierte Sprachen nicht zu zählen (Python et al.). Sie bieten möglicherweise nicht die Schmelzgeschwindigkeit von Fortan im Voraus, aber Sie können sich mehr auf die Lösung Ihres Rechenproblems als auf alle Details der Implementierung konzentrieren. Oft können Sie eine Lösung in Python implementieren. Wenn die Leistung nicht akzeptabel ist, führen Sie eine Profilerstellung durch, identifizieren Sie die Problembereiche und optimieren Sie diesen Code entweder mit Cython oder implementieren Sie das gesamte Programm in einer kompilierten Sprache erneut. Sobald Sie die Problemlösungslogik ausgearbeitet haben, ist der Rest nur eine Implementierung und sollte mit einem guten Verständnis der Computergrundlagen einfach in einer Vielzahl von Programmiersprachen darzustellen sein.

    Kommentare

    • Das ‚ ist richtig. Zum Parsen von Text verwende ich auch Python.
    • Sie können auch einen Teil eines Python-Skripts in einer kompilierten Sprache implementieren, z. C ++ und haken Sie es ein. Boost Python, Swig usw.

    Antwort

    Ich arbeite derzeit in einem der nationalen Labors Von den Leuten um mich herum sind Maschinenbauingenieure. Sie unterhalten sich mit einigen Leuten in den HPC-Gruppen und machen hauptsächlich Linux und meistens C ++. Die Gruppe, in der ich mich gerade befinde, verwendet hauptsächlich Desktop-Anwendungen und wir verwenden Windows in absteigender Reihenfolge: C #, FORTRAN, Python, VBA und VB (6, nicht .NET). Einige der Simulations-Engines , die wir verwenden, wurden in anderen nationalen Labors in FORTRAN geschrieben.

    Antwort

    Entschuldigung für das Ausgraben Ein alter Thread, aber es scheint, dass Fortran auch im Jahr 2015 häufig verwendet wird.

    Ich bin gerade auf this gestoßen (alternativ link ) Liste, bei der es sich im Wesentlichen um eine Liste von 13 Codes handelt, die von der OCLF-Einrichtung von DOE 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 für den Code zu finden (basierend auf einer schnellen Google-Suche) und habe Folgendes gefunden:

    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 

    Also von 13 Codes, mindestens 10 (basierend auf meiner Schnellsuche) scheinen in Fortran geschrieben zu sein. Nicht schlecht für eine 50 Jahre alte Sprache.

    HINWEIS: Mir ist klar, dass Sprachvergleiche nutzlos sind, aber angesichts der Anzahl der Leute (insbesondere C ++ – Benutzer), die Fortran schlecht reden, dachte ich, es könnte sich lohnen, es zu erwähnen.

    Kommentare

    • Ich bin anderer Meinung, weil meine Erfahrung in den nationalen Labors eher das Gegenteil war. Die meisten neuen Projekte, die ich bei Lawrence Livermore sehe, sind in C ++ geschrieben, und die meisten neuen (oder aktiv gewarteten) Open-Source-Bibliotheken auf dem neuesten Stand der Technik in ODE-Solvern, FEM-Diskretisierungen und universellen wissenschaftlichen Computerbibliotheken scheinen in C oder C ++ zu sein. Fortran scheint hauptsächlich in Projekten verwendet zu werden, die vorhandene / Legacy-Bibliotheken verwenden. Ich sehe ‚ nicht viele große, neue Projekte mit Fortran, unabhängig davon, was ich über die Sprache denke.
    • Einige Codes der Dichtefunktionaltheorie sind ebenfalls geschrieben Fortran enthält VASP und CASTEP , obwohl, wie @GeoffOxberry hervorhebt, neu Projekte tendieren möglicherweise zu C ++.
    • @blochwave Wie Sie im Link lesen können, beziehen sich die Projekte auf eine neue Maschine (mit Beschleunigern usw.), die 2018 online sein wird.Es ist also nicht so, als würden sie einen 25-Jahres-Code nehmen und ihn kompilieren, in der Hoffnung, mit guter Leistung zu laufen. Ich bin mir ziemlich sicher, dass große Teile der Codes in der obigen Liste wie im neuen Code neu geschrieben wurden oder wurden. Eine Reihe von “ neuen “ Klimacodes befinden sich ebenfalls in Fortran und werden von vielen Agenturen in einer Reihe von Ländern verwendet.

    Antwort

    Ich denke, Jack P. versucht zu sagen, dass Sie mischen und anpassen sollten. Eine gute Software wird sorgfältig geschichtet. Verschiedene Ebenen können natürlicher oder effizienter verschiedenen Sprachen zugeordnet werden. Sie sollten für jede Ebene die am besten geeignete Sprache auswählen. Sie sollten auch verstehen, wie Sprachen zusammenarbeiten können, was sich auf die Sprache auswirken kann, die Sie für welche Ebene auswählen.

    Eine bessere Frage ist, welche Beispiele für hervorragend gestaltete Software es gibt, die es wert sind, studiert zu werden, um zu lernen, wie man mehrschichtige Software entwirft.

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.