Ich weiß nicht, wie die Programmiersprache im Jahr 2000 aussehen wird, aber ich weiß, dass sie FORTRAN heißen wird.
- Charles Anthony Richard Hoar, ca. 1982
In der Branche wird Fortran heute nur noch selten verwendet - in einer der Listen der populären Sprachen belegte es den 28. Platz . Fortran ist jedoch nach wie vor die Hauptsprache für groß angelegte Simulationen physikalischer Systeme - beispielsweise für astrophysikalische Modelle von Sternen und Galaxien (z. B. Flash ), großräumige Molekulardynamik, elektronische Strukturzählcodes ( SIESTA ), Klimamodelle usw. Auf dem Gebiet des Hochleistungsrechnens, von dem eine Teilmenge numerische Simulationen in großem Maßstab sind, werden heute nur zwei Sprachen verwendet - C / C ++ und „modernes Fortran“ (Fortran 90/95/03/08). Beliebte offene MPI- BibliothekenFür diese beiden Sprachen wurden Tools zur Code-Parallelisierung entwickelt. Wenn Sie schnellen Code benötigen, der auf mehreren Prozessoren ausgeführt wird, haben Sie im Allgemeinen nur zwei Optionen. Im modernen Fortran gibt es eine Funktion wie " Coarray ", mit der direkt mit der Sprache in paralleler Programmierung gearbeitet werden kann. Coarray erschien in der Fortran 95-Erweiterung und wurde später in Fortran 2008 aufgenommen.Die aktive Nutzung von Fortran durch Physiker verwirrt häufig Informatiker und andere Personen, die nicht mit diesem Gebiet verwandt sind und Fortran für einen historischen Anachronismus halten.Ich möchte erklären, warum Fortran immer noch nützlich ist. Ich ermutige Studenten, die Physik studieren, nicht, Fortran zu unterrichten - da die meisten von ihnen forschen werden, sollten sie C / C ++ lernen (oder bei Matlab / Octave / Python anhalten). Ich möchte erklären, warum Fortran immer noch verwendet wird, und beweisen, dass dies nicht nur darauf zurückzuführen ist, dass Physiker „hinter der Zeit“ sind (obwohl dies manchmal so ist - letztes Jahr habe ich einen Physikstudenten gesehen, der mit Code gearbeitet hat Fortran 77, während weder er noch sein Manager etwas über Fortran 90 hörten). Informatiker sollten Fortrans Dominanz im numerischen Rechnen als Herausforderung betrachten.Bevor ich mich mit dem Thema befasse, möchte ich die Geschichte diskutieren, denn wenn Leute das Wort "Fortran" hören, stellen sie sich sofort Lochkarten und Code mit nummerierten Zeilen vor. Die erste Fortran-Spezifikation wurde 1954 geschrieben. Das frühe Fortran (damals wurde sein Name in Großbuchstaben FORTRAN geschrieben) war nach modernen Maßstäben eine höllische Sprache, aber es war ein unglaublicher Fortschritt gegenüber früheren Assembler-Programmen. FORTRAN wurde oft mit Lochkarten programmiert, wie Professor Miriam Forman von der Stony Brook University ohne Vergnügen erinnert. Fortran hatte viele Versionen, von denen die bekanntesten die Standards 66, 77, 90, 95, 03 und 08 sind.Es wird oft gesagt, dass Fortran wegen seiner Geschwindigkeit immer noch verwendet wird. Aber ist er der Schnellste? Bei Benchmarksgame.alioth.debian.orgEs gibt einen Vergleich von C und Fortranin mehreren Tests unter vielen Sprachen. In den meisten Fällen sind Fortran und C / C ++ die schnellsten. Lieblings-Python-Programmierer bleiben oft 100-mal in der Geschwindigkeit zurück, aber dies ist in der Reihenfolge der Dinge für den interpretierten Code. Python eignet sich nicht für komplexe numerische Berechnungen, ist aber für andere gut geeignet. Interessanterweise übertrifft C / C ++ Fortran in allen bis auf zwei Tests, obwohl sie sich im Allgemeinen in den Ergebnissen kaum unterscheiden. Die Tests, bei denen Fortran gewinnt, die "physikalischsten", sind die Simulation eines Systems von n Körpern und die Berechnung des Spektrums. Die Ergebnisse hängen von der Anzahl der Prozessorkerne ab. Beispielsweise bleibt Fortran auf dem Quad-Core hinter C / C ++ zurück. Die Tests, bei denen Fortran weit hinter C / C ++ zurückbleibt, lesen und schreiben die meiste Zeit Daten, und in dieser Hinsicht ist Fortrans Langsamkeit bekannt.C / C ++ ist also so schnell wie Fortran und manchmal etwas schneller. Wir sind interessiert an: "Warum raten Physikprofessoren ihren Studenten weiterhin, Fortran anstelle von C / C ++ zu verwenden?"Fortran hat Legacy-Code
Dank der langen Geschichte von Fortran ist es nicht verwunderlich, dass Berge von Physikcode darauf geschrieben sind. Physiker versuchen, die Programmierzeit zu minimieren. Wenn sie also früheren Code finden, werden sie ihn verwenden. Selbst wenn der alte Code nicht lesbar, schlecht dokumentiert und nicht der effizienteste ist, wird der alte bewährte Code eher verwendet als ein neuer. Die Aufgabe der Physiker ist es nicht, Code zu schreiben, sondern die Natur der Realität zu verstehen. Die Professoren haben immer den geerbten Code zur Hand (oft haben sie diesen Code vor Jahrzehnten geschrieben) und geben ihn an ihre Studenten weiter. Dies spart ihnen Zeit und beseitigt Unsicherheiten beim Fehlerkorrekturprozess.Physikstudenten lernen Fortran einfacher als C / C ++
Ich denke, Fortran ist leichter zu lernen als C / C ++. Fortran 90 und C sind sich sehr ähnlich, aber Fortran ist einfacher zu schreiben. C ist eine relativ primitive Sprache, daher beschäftigen sich Physiker, die sich für C / C ++ entscheiden, mit objektorientierter Programmierung. OOP kann nützlich sein, insbesondere in großen Softwareprojekten, aber studieren Sie es viel länger. Sie müssen Abstraktionen wie Klassen und Vererbung studieren. Das OOP-Paradigma unterscheidet sich stark von dem von Fortran verwendeten prozeduralen. Fortran basiert auf einem einfachen prozeduralen Paradigma, das näher an dem liegt, was unter der Haube eines Computers geschieht. Wenn Sie Code optimieren / vektorisieren, um die Geschwindigkeit zu erhöhen, ist es einfacher, mit dem prozeduralen Paradigma zu arbeiten. Physiker verstehen normalerweise, wie Computer funktionieren, und denken in physischen Prozessen, z. B. beim Übertragen von Daten von der Festplatte zum RAM und vom RAM zum Prozessor-Cache.Sie unterscheiden sich von Mathematikern, die es vorziehen, in abstrakten Funktionen und Logik zu denken. Auch dieses Denken unterscheidet sich von objektorientiert. Die Optimierung von OOP-Code ist aus meiner Sicht komplizierter als prozedural. Objekte sind sehr sperrige Strukturen im Vergleich zu den von Physikern bevorzugten Datenstrukturen: Arrays.Leichtigkeit Eins: Fortran Array Arbeit
Arrays oder, wie Physiker sie nennen, Matrizen bilden das Herzstück aller physischen Berechnungen. In Fortran 90+ finden Sie viele Möglichkeiten, mit ihnen zu arbeiten, ähnlich wie in APL und Matlab / Octave. Arrays können kopiert, mit einem Skalar multipliziert und auf sehr intuitive Weise untereinander multipliziert werden:A = B
A = 3.24*B
C = A*B
B = exp(A)
norm = sqrt(sum(A**2))
Hier sind A, B, C Arrays mit einer bestimmten Dimension (z. B. 10 x 10 x 10). C = A * B gibt uns die elementweise Multiplikation von Matrizen, wenn A und B gleich groß sind. Für die Matrixmultiplikation wird C = matmul (A, B) verwendet. Fast alle internen Funktionen von Fortran (Sin (), Exp (), Abs (), Floor () usw.) verwenden Arrays als Argumente, was zu einfachem und sauberem Code führt. Es gibt einfach keinen ähnlichen Code in C / C ++. In einer grundlegenden C / C ++ - Implementierung erfordert das einfache Kopieren eines Arrays das Ausführen von for-Schleifen für alle Elemente oder das Aufrufen einer Bibliotheksfunktion. Wenn Sie in C ein Array mit der falschen Bibliotheksfunktion eingeben, tritt ein Fehler auf. Die Verwendung von Bibliotheken anstelle von internen Funktionen bedeutet, dass der resultierende Code nicht sauber und portabel oder leicht zu erlernen ist.In Fortran funktioniert der Zugriff auf Array-Elemente über die einfache Syntax A [x, y, z], wenn Sie in C / C ++ A [x] [y] [z] schreiben müssen. Elemente von Arrays beginnen mit 1, was dem Verständnis der Physiker für Matrizen entspricht, und in C / C ++ - Arrays beginnt die Nummerierung bei Null. Hier sind einige weitere Funktionen für die Arbeit mit Arrays in Fortran.A = (/ i , i = 1,100 /)
B = A(1:100:10)
C(10:) = B
Zunächst wird der Vektor A durch eine implizite do-Schleife erzeugt, die auch als Array-Konstruktor bezeichnet wird. Dann wird in einem Schritt von 10 ein Vektor B erzeugt, der aus jedem 10. Element von A besteht. Schließlich wird das Array B ausgehend vom 10. Element in das Array C kopiert. Fortran unterstützt das Deklarieren von Arrays mit Null oder negativen Indizes:double precision, dimension(-1:10) :: myArray
Ein negativer Index sieht zunächst albern aus, aber ich habe von ihrer Nützlichkeit gehört - stellen Sie sich zum Beispiel vor, dass dies ein zusätzlicher Bereich für die Veröffentlichung von Klarstellungen ist. Fortran unterstützt auch Vektorindizes . Beispielsweise können Sie die Elemente 1,5 und 7 von einem Array A der Dimension N x 1 in ein Array B der Dimension 3 x 1 übertragen:subscripts = (/ 1, 5, 7 /)
B = A(subscripts)
Fortran unterstützt Array- Masken in allen internen Funktionen. Wenn wir beispielsweise den Logarithmus aller Matrixelemente größer als Null berechnen müssen, verwenden wir:log_of_A = log(A, mask= A .gt. 0)
Oder wir können alle negativen Elemente des Arrays in einer Zeile aufheben:where(my_array .lt. 0.0) my_array = 0.0
Fortran macht es einfach, Arrays dynamisch zuzuweisen und freizugeben. So platzieren Sie beispielsweise ein zweidimensionales Array:real, dimension(:,:), allocatable :: name_of_array
allocate(name_of_array(xdim, ydim))
In C / C ++ erfordert dies den folgenden Eintrag :int **array;
array = malloc(nrows * sizeof(double *));
for(i = 0; i < nrows; i++){
array[i] = malloc(ncolumns * sizeof(double));
}
So geben Sie ein Array in Fortran freideallocate(name_of_array)
In C / C ++ dafürfor(i = 0; i < nrows; i++){
free(array[i]);
}
free(array);
:
In Sprachen wie C / C ++ werden alle Variablen als Wert übergeben, mit Ausnahme von Arrays, die als Referenz übergeben werden. In vielen Fällen ist es jedoch sinnvoller, ein Array als Wert zu übergeben. Lassen Sie die Daten beispielsweise aus Positionen von 100 Molekülen zu verschiedenen Zeitpunkten bestehen. Wir müssen die Bewegung eines Moleküls analysieren. Wir nehmen einen Teil des Arrays (Subarray), der den Koordinaten der Atome in diesem Molekül entspricht, und übergeben ihn an die Funktion. Darin werden wir uns mit einer komplexen Analyse des übertragenen Subarrays befassen. Wenn wir es als Referenz übergeben würden, würden sich die übertragenen Daten nicht in einer Reihe im Speicher befinden. Aufgrund der Art des Speicherzugriffs wäre die Arbeit mit einem solchen Array langsam. Wenn wir es als Wert übergeben, erstellen wir im Speicher ein neues Array, das in einer Reihe angeordnet ist. Zur Freude der Physiker übernimmt der Compiler die ganze schmutzige Arbeit der Speicheroptimierung.In Fortran werden Variablen normalerweise als Referenz und nicht als Wert übergeben. Unter der Haube optimiert der Fortran-Compiler automatisch seine Übertragung, um die Effizienz zu steigern. Aus Sicht des Professors auf dem Gebiet der Optimierung der Speichernutzung sollte dem Compiler mehr vertraut werden als dem Studenten! Als Ergebnis verwenden Physiker selten Zeiger, obwohl Fortran-90 + sie haben .Einige weitere Beispiele für die Unterschiede zwischen Fortran und C.
Fortran bietet verschiedene Optionen zum Verwalten des Compilers bei der Fehlerbehebung und Optimierung. Fehler im Code können in der Kompilierungsphase und nicht während der Ausführung abgefangen werden. Beispielsweise kann jede Variable als Parameter deklariert werden, dh als Konstante.double precision, parameter :: hbar = 6.63e-34
Wenn sich der Parameter im Code ändert, gibt der Compiler einen Fehler zurück. In C heißt das constdouble const hbar = 6.63e-34
Das Problem ist, dass const real sich von simple real unterscheidet. Wenn eine Funktion, die real akzeptiert, const real erhält, wird ein Fehler zurückgegeben. Es ist leicht vorstellbar, wie dies zu Interoperabilitätsproblemen im Code führen kann.Fortran hat auch eine Absichtsspezifikation, die dem Compiler mitteilt, ob das an die Funktion übergebene Argument eine Eingabe, Ausgabe oder sowohl ein Eingabe- als auch ein Ausgabeparameter ist. Dies hilft dem Compiler, den Code zu optimieren und seine Lesbarkeit und Zuverlässigkeit zu erhöhen.Fortran verfügt über weitere Funktionen, die bei unterschiedlichen Frequenzen verwendet werden. Zum Beispiel kann Fortran 95 Funktionen mit dem reinen Modifikator deklarieren. Eine solche Funktion hat keine Nebenwirkungen - sie ändert nur ihre Argumente und keine globalen Variablen. Ein Sonderfall einer solchen Funktion ist die Elementfunktion, die Skalare akzeptiert und zurückgibt. Es wird verwendet, um Array-Elemente zu verarbeiten. Die Information, dass die Funktion rein oder elementar ist, ermöglicht es dem Compiler, zusätzliche Optimierungen durchzuführen, insbesondere beim Parallelisieren von Code.Was erwartet Sie in Zukunft?
In wissenschaftlichen Berechnungen bleibt Fortran die Hauptsprache und wird in naher Zukunft nicht verschwinden. In der UmfrageUnter den Besuchern der Supercomputing Convention-Konferenz 2014, die diese Sprache verwenden, gaben 100% an, dass sie sie in den nächsten 5 Jahren verwenden werden. Aus der Umfrage geht auch hervor, dass 90% eine Mischung aus Fortran und C verwendeten. In Erwartung einer zunehmenden Vermischung dieser Sprachen enthalten die Entwickler der Fortran 2015-Spezifikation mehr Funktionen für die Code-Interoperabilität. Fortran-Code wird zunehmend aus Python-Code aufgerufen. Informatiker, die die Verwendung von Fortran kritisieren, verstehen nicht, dass diese Sprache eindeutig für das angepasst bleibt, wonach sie benannt wurde - FOrmula-ÜBERSETZUNG, Übersetzung von Formeln, dh die Umwandlung physikalischer Formeln in Code. Vielen von ihnen ist nicht bewusst, dass sich die Sprache weiterentwickelt und ständig neue Funktionen enthält.Das Aufrufen des modernen Fortran 90+ alt ist dasselbe wie das Aufrufen des alten C ++, da C 1973 entwickelt wurde. Andererseits ist sogar der neueste Fortran 2008-Standard abwärtskompatibel mit Fortran 77 und dem größten Teil von Fortran 66. Daher ist die Entwicklung der Sprache mit gewissen Schwierigkeiten verbunden. Kürzlich haben Forscher am MIT beschlossen, diese Schwierigkeiten zu überwinden, indem sie eine Sprache für HPC namens Julia entwickelt haben , die erstmals 2012 veröffentlicht wurde. Ob Julia den Platz von Fortran einnimmt, bleibt abzuwarten. Auf jeden Fall vermute ich, dass dies sehr lange dauern wird.