FORTRAN lernen In der Neuzeit


79

Ich bin kürzlich dazu gekommen, eine große Menge wissenschaftlich rechenintensiven FORTRAN-Codes zu pflegen. Ich habe Schwierigkeiten, alle Nuancen einer vierzig Jahre alten Sprache in den Griff zu bekommen, trotz Google und zwei Einführungsbüchern. Der Code ist reich an "leistungssteigernden Verbesserungen". Hat jemand irgendwelche Führer oder praktische Ratschläge für de -optimizing Fortran in CS 101 Ebenen? Hat jemand Kenntnisse darüber, wie die FORTRAN-Codeoptimierung funktioniert? Gibt es typische FORTRAN-Fallstricke, die einem Java / C ++ /. NET-Entwickler, der eine FORTRAN 77/90-Codebasis übernimmt, möglicherweise nicht einfallen?


4
Wäre dieser Text für Sie vielleicht interessant? fortranrefactoring.com.ar/papers/...
Rook

2
@DavidSokol Ich habe es genossen, Ihnen im Dinosaurier-TDL-Podcast zuzuhören , insbesondere mit dieser Frage zum Kontext :) Hinweis, der Podcast erwähnt dies nicht, ich habe mich nur daran erinnert, es nach dem Anhören gesehen zu haben.
Tim Post

2
Der Link oben ist tot, das Dokument ist jetzt hier: fortranrefactoring.org/papers/…

Antworten:


89

Man muss ein Gefühl dafür bekommen, was Programmierer früher tun mussten. Die überwiegende Mehrheit des Codes, mit dem ich arbeite, ist älter als ich und lief auf Maschinen, die "neu" waren, als meine Eltern in der High School waren.

Häufige FORTRAN-Ismen, mit denen ich mich befasse und die die Lesbarkeit beeinträchtigen, sind:

  • Gemeinsame Blöcke
  • Implizite Variablen
  • Zwei oder drei DO-Schleifen mit gemeinsam genutzten CONTINUE-Anweisungen
  • GOTOs anstelle von DO-Schleifen
  • Arithmetische IF-Anweisungen
  • Berechnete GOTOs
  • Äquivalenz REAL / INTEGER / other in einem gemeinsamen Block

Strategien zur Lösung dieser Probleme umfassen:

  1. Holen Sie sich Spag / plusFORT , das Geld wert, es löst viele von ihnen automatisch und Bug Free (tm)
  2. Wechseln Sie nach Möglichkeit zu Fortran 90, wenn nicht zu Fortran 77 im Freiformat
  3. Fügen Sie IMPLICIT NONE zu jeder Unterroutine hinzu und beheben Sie dann jeden Kompilierungsfehler, der zeitaufwändig, aber letztendlich notwendig ist. Einige Programme können dies automatisch für Sie tun (oder Sie können es skripten).
  4. Es lohnt sich, alle GEMEINSAMEN Blöcke in MODULE, niedrig hängende Früchte, zu verschieben
  5. Konvertieren Sie arithmetische IF-Anweisungen in IF..ELSEIF..ELSE-Blöcke
  6. Konvertieren Sie berechnete GOTOs in SELECT CASE-Blöcke
  7. Konvertieren Sie alle DO-Schleifen in die neuere F90-Syntax

    myloop: do ii = 1, nloops
        ! do something
    enddo myloop
    
  8. Konvertieren Sie gleichwertige gemeinsame Blockelemente entweder in den in einem Modul zugewiesenen ALLOCATABLE-Speicher oder in ihre wahren Zeichenroutinen, wenn Hollerith in einem REAL gespeichert ist

Wenn Sie spezifischere Fragen zur Ausführung einiger Lesbarkeitsaufgaben hatten, kann ich Ihnen Ratschläge geben. Ich habe eine Codebasis von ein paar hunderttausend Zeilen Fortran, die über einen Zeitraum von 40 Jahren geschrieben wurde und für die ich in irgendeiner Weise verantwortlich bin. Daher bin ich wahrscheinlich auf "Probleme" gestoßen, die Sie möglicherweise gefunden haben.


3
Auch ein schöner Text zum Fortran Refactoring. fortranrefactoring.com.ar/papers/...
Rook

Es ist sehr schwierig, wenn der Code nicht sehr gut organisiert und durch Optimierungsdetails ziemlich verschleiert ist. Die Migration auf den fortran 90-Stil würde Ihnen helfen. Darüber hinaus bieten die späteren Versionen von fortran 2008 Funktionen zur Optimierung.
Zeus

Es sieht so aus, als wäre die plusFORT-Site hierher gezogen: polyhedron.com/?product=plusfort
jrh

32

Legacy Fortran Seifenkiste

Ich habe eine ganze Weile geholfen, eine alte Fortran-Codebasis zu pflegen / zu verbessern, und denke größtenteils, dass Sixletter-Variablen auf dem Geld stehen. Dieser Rat ist jedoch eher technisch; Eine schwierigere Aufgabe besteht darin, "bewährte Verfahren" umzusetzen.

  • Legen Sie einen erforderlichen Codierungsstil und Codierungsrichtlinien fest.
  • Fordern Sie eine Codeüberprüfung (von mehr als nur dem Codierer!) Für alles an, was an die Codebasis gesendet wird. (Die Versionskontrolle sollte an diesen Prozess gebunden sein.)
  • Beginnen Sie mit dem Erstellen und Ausführen von Komponententests. ebenso Benchmark- oder Regressionstests.

Dies mag heutzutage nach offensichtlichen Dingen klingen, aber auf die Gefahr einer Überverallgemeinerung hin behaupte ich, dass die meisten Fortran-Code-Shops eine tief verwurzelte Kultur haben, einige begannen, bevor der Begriff "Software-Engineering" überhaupt existierte, und dass im Laufe der Zeit das dominiert ist "Jetzt erledigen". (Dies gilt keineswegs nur für Fortran-Geschäfte.)

Fallstricke umarmen

Aber was tun mit einer bereits vorhandenen, grottigen alten Legacy-Codebasis? Ich mit Joel Spolsky vereinbaren Umschreiben nicht . Meiner Meinung nach weist sixlettervariables jedoch auf die zulässige Ausnahme hin: Verwenden Sie Software-Tools, um zu besseren Fortran-Konstrukten überzugehen . Vieles kann von Code-Analysatoren ( FORCHECK ) und Code-Umschreibern ( plusFORT ) abgefangen / korrigiert werden . Wenn Sie es von Hand tun müssen, stellen Sie sicher, dass Sie einen dringenden Grund haben. (Ich wünschte, ich hätte einen Hinweis auf die Anzahl der Softwarefehler zur Hand, die durch das Beheben von Softwarefehlern entstanden sind. Das ist demütig. Ich denke, eine solche Statistik befindet sich in der Expert C-Programmierung .)

Die wahrscheinlich beste Offensive beim Gewinn des Fortran-Fallstrickspiels ist die beste Verteidigung: Sie kennen die Sprache ziemlich gut. Um dieses Ziel zu erreichen, empfehle ich ... Bücher!

Fortran Dead Tree Library

Ich hatte im Laufe der Jahre nur bescheidene Erfolge als "QA-Nörgler", aber ich habe festgestellt, dass Bildung manchmal versehentlich funktioniert und dass eines der einflussreichsten Dinge ein Nachschlagewerk ist, das jemand zur Hand hat. Ich liebe und kann es nur empfehlen

Fortran 90/95 für Wissenschaftler und Ingenieure , von Stephen J. Chapman

Das Buch ist sogar gut mit Fortran 77, da es spezifisch die Konstrukte identifiziert, die nicht verwendet werden sollten, und die besseren Alternativen bietet. Tatsächlich handelt es sich jedoch um ein Lehrbuch, dem die Puste ausgehen kann, wenn Sie wirklich wissen möchten, worauf es bei Fortran 95 ankommt, weshalb ich es empfehle

Fortran 90/95 Erklärt von Michael Metcalf & John K. Reid

Seien Sie gewarnt, dass es nicht die klarste Schrift ist, aber der Schleier löst sich, wenn Sie wirklich das Beste aus einer neuen Fortran 95-Funktion herausholen möchten.

Ich habe es genossen, mich auf die Probleme zu konzentrieren, von Fortran 77 nach Fortran 90 zu wechseln

Migration nach Fortran 90 von Jim Kerrigan

Aber das Buch ist jetzt vergriffen. (Ich verstehe O'Reillys Verwendung von Safari einfach nicht. Warum ist nicht jedes ihrer vergriffenen Bücher verfügbar?)

Zum Schluss nominiere ich den Erben des wunderbaren Klassikers Software Tools

Klassisches FORTRAN von Michael Kupferschmid

Dieses Buch zeigt nicht nur, was man mit "nur" Fortran 77 machen kann, sondern es spricht auch über einige der subtileren Probleme, die auftreten (z. B. sollte man die EXTERNE Deklaration verwenden oder nicht). Dieses Buch deckt nicht genau den gleichen Bereich ab wie "Software Tools", aber es sind zwei der drei Fortran-Programmierbücher, die ich als "Spaß" bezeichnen würde ... ( hier ist das dritte ).

Verschiedene Ratschläge, die für fast jeden Fortran-Compiler gelten

  • Es gibt eine Compileroption zum Erzwingen des IMPLICIT NONE-Verhaltens, mit der Sie Problemroutinen identifizieren können, ohne sie zuerst mit der IMPLICIT NONE-Deklaration zu ändern. Dieser Ratschlag erscheint erst nach dem ersten Mal sinnvoll, wenn ein Build-Bomben aufgrund eines IMPLICIT NONE-Befehls in eine Legacy-Routine eingefügt wird. (Was? Deine Codeüberprüfung hat das nicht verstanden? ;-)
  • Es gibt eine Compiler-Option zur Überprüfung der Array-Grenzen, die beim Debuggen von Fortran 77-Code hilfreich sein kann.
  • Fortran 90-Compiler sollten in der Lage sein, fast den gesamten Fortran 77-Code und sogar älteren Fortran-Code zu kompilieren. Aktivieren Sie die Berichtsoptionen auf Ihrem Fortran 90-Compiler, führen Sie Ihren Legacy-Code durch, und Sie haben einen guten Start in die Syntaxprüfung. Einige kommerzielle Fortran 77-Compiler sind tatsächlich Fortran 90-Compiler, die im Fortran 77-Modus ausgeführt werden. Daher ist dies möglicherweise eine relativ triviale Option für alle Build-Skripte.

Die Fortran 90/95 für Wissenschaftler und Ingenieure Link ist tot, aber Sie es auf finden Amazon für rund 50 USD oder 1. Auflage Taschenbuch für rund 25 $
JRH

24

Die ursprüngliche Frage enthält etwas, vor dem ich warnen würde. Sie sagen, der Code ist voll von "leistungssteigernden Verbesserungen". Da Fortran-Probleme im Allgemeinen wissenschaftlicher und mathematischer Natur sind, sollten Sie nicht davon ausgehen, dass diese Leistungstricks dazu dienen, die Zusammenstellung zu verbessern. Es geht wahrscheinlich nicht um die Sprache. In Fortran geht es bei der Lösung selten um die Effizienz des Codes selbst, sondern um die zugrunde liegende Mathematik zur Lösung des Endproblems. Die Tricks können die Kompilierung verlangsamen, sogar die Logik chaotisch erscheinen lassen, aber die Absicht ist, die Lösung schneller zu machen. Wenn Sie nicht genau wissen, was es tut und warum, lassen Sie es in Ruhe.

Selbst einfaches Refactoring, wie das Ändern dumm aussehender Variablennamen, kann eine große Gefahr sein. Historisch übliche mathematische Gleichungen in einem bestimmten Bereich der Wissenschaft haben seit den Tagen von Maxwell eine bestimmte Abkürzung verwendet. Ein Array mit dem Namen B (:) in der Elektromagnetik zu sehen, sagt allen Emag-Ingenieuren genau, wofür gelöst wird. Ändern Sie das auf eigene Gefahr. Moral, lernen Sie die Standardnomenklatur der Wissenschaft kennen, bevor Sie sie ebenfalls umbenennen.


7

Als jemand mit Erfahrung in FORTRAN (77 Geschmacksrichtungen, obwohl es eine Weile her ist, seit ich es ernsthaft verwendet habe) und C / C ++ sind Arrays der Punkt, auf den man sofort achten muss. FORTRAN-Arrays beginnen wie in C / C ++ / Java mit einem Index von 1 anstelle von 0. Auch die Speicheranordnung ist umgekehrt. Wenn Sie also den ersten Index erhöhen, erhalten Sie sequentielle Speicherorte.

Meine Frau verwendet FORTRAN immer noch regelmäßig und hat C ++ - Code, mit dem sie jetzt arbeiten muss, da ich ihr gleich helfen werde. Wenn während ihrer Bekehrung Probleme auftauchen, werde ich versuchen, darauf hinzuweisen. Vielleicht helfen sie.


12
Fortran-Arrays beginnen standardmäßig mit Index 1, können jedoch so deklariert werden, dass sie mit einem beliebigen Wert beginnen.
MSB

6

Ich habe Fortran ab der Version '66 seit 1967 verwendet (auf einer IBM 7090 mit 32.000 Speicherwörtern). Ich habe dann einige Zeit PL / 1 verwendet, bin aber später zu Fortran 95 zurückgekehrt, weil es ideal für die Matrix- / Komplexzahlprobleme geeignet ist, die wir haben. Ich möchte zu den Überlegungen hinzufügen, dass ein Großteil der verschlungenen Struktur alter Codes einfach auf den geringen verfügbaren Speicher zurückzuführen ist, der beispielsweise die Wiederverwendung einiger Codezeilen über berechnete oder zugewiesene GOTOs erzwingt . Ein weiteres Problem ist die Optimierung durch Definition von Hilfsvariablen für jeden wiederholten Unterausdruck - Compiler haben dies einfach nicht optimiert. Außerdem durfte man nicht schreiben DO i=1,n+1; du musstest schreiben n1=n+1;DO i=1,n1. Infolgedessen sind alte Codes mit überflüssigen Variablen überfordert. Als ich einen Code in Fortran 95 umschrieb, überlebten nur 10% der Variablen. Wenn Sie den Code besser lesbar machen möchten, empfehle ich dringend, nach Variablen zu suchen, die leicht entfernt werden können.

Eine andere Sache, die ich erwähnen könnte, ist, dass komplexe arithmetische und mehrdimensionale Arrays viele Jahre lang sehr ineffizient waren. Aus diesem Grund wird häufig Code neu geschrieben, um komplexe Berechnungen nur mit realen Variablen und Matrizen durchzuführen, die mit einem einzigen linearen Index adressiert sind.


5

In gewisser Hinsicht haben Sie Glück, denn Fortran hat nicht viel mit subtilen Kontrollflusskonstrukten, Vererbung oder Ähnlichem zu tun. Auf der anderen Seite gibt es einige wirklich erstaunliche Fallstricke, wie das arithmetisch berechnete Zeug von Verzweigung zu numerischer Beschriftung, die implizit typisierten Variablen, für die keine Deklaration erforderlich ist, das Fehlen echter Schlüsselwörter.

Ich weiß nichts über die "leistungssteigernden Verbesserungen". Ich würde vermuten, dass die meisten von ihnen wahrscheinlich ineffektiv sind, da ein paar Jahrzehnte Compilertechnologie die meisten Hinweise unnötig gemacht haben. Leider müssen Sie die Dinge wahrscheinlich so lassen, wie sie sind, es sei denn, Sie planen eine massive Neufassung.

Auf jeden Fall sollte der wissenschaftliche Kernberechnungscode ziemlich lesbar sein. Jede Programmiersprache, die Infix-Arithmetik verwendet, ist eine gute Vorbereitung für das Lesen von Fortrans Arithmetik- und Zuweisungscode.


5

Können Sie erklären, was Sie bei der Pflege des Codes tun müssen? Müssen Sie den Code wirklich ändern? Wenn Sie davonkommen können, indem Sie nur die Schnittstelle zu diesem Code anstelle des Codes selbst ändern, ist dies das Beste.

Das inhärente Problem beim Umgang mit einem großen wissenschaftlichen Code (nicht nur FORTRAN) besteht darin, dass sowohl die zugrunde liegende Mathematik als auch die Implementierung komplex sind. Fast standardmäßig muss die Implementierung eine Codeoptimierung beinhalten, um innerhalb eines angemessenen Zeitrahmens ausgeführt zu werden. Hinzu kommt, dass in diesem Bereich viel Code von Wissenschaftlern / Ingenieuren erstellt wird, die Experten auf ihrem Gebiet sind, jedoch nicht in der Softwareentwicklung. Sagen wir einfach, dass "leicht zu verstehen" für sie nicht die erste Priorität ist (ich war einer von ihnen und lernte immer noch, ein besserer Softwareentwickler zu sein).

Aufgrund der Art des Problems denke ich nicht, dass eine allgemeine Frage und Antwort ausreicht, um hilfreich zu sein. Ich schlage vor, Sie stellen eine Reihe spezifischer Fragen mit angefügtem Code-Snippet. Beginnen Sie vielleicht mit dem, der Ihnen am meisten Kopfschmerzen bereitet?


4

Ich habe FORTRAN geliebt, ich habe es gelehrt und programmiert. Ich wollte das nur reinwerfen. Ich habe es seit Jahren nicht mehr angefasst.
Ich habe in COBOL angefangen, als ich zu FORTRAN wechselte, fühlte ich mich befreit. Alles ist relativ, ja? Ich würde das oben Gesagte unterstützen - erkennen, dass dies eine VERFAHRENSPRACHE ist - keine Feinheiten - also nimm es so, wie du es siehst.
Wahrscheinlich frustrieren Sie zu Beginn.


2
Ich habe auch diese Phase durchlaufen. Tatsächlich erinnere ich mich an "Best Practices", die die Fallstricke minimierten. Aber dann ging ich weiter zu Lisp, Pascal, C, C ++. Ich muss noch mit Fortran arbeiten. Das eigentliche Problem ist, dass das meiste davon mit sehr wenig Programmiererdisziplin geschrieben wurde. Die Leute unterrichten immer noch Fortran, aber sie unterrichten keine Disziplin.
Mike Dunlavey

3

Ich habe mit Fortran IV (WATFIV) auf Lochkarten begonnen, und meine frühen Arbeitsjahre waren VS FORTRAN v1 (IBM, Fortran 77 Level). Viele gute Ratschläge in diesem Thread.

Ich würde hinzufügen, dass Sie zwischen Dingen unterscheiden müssen, die getan werden, um das Biest überhaupt zum Laufen zu bringen, und Dingen, die den Code "optimieren", und Dingen, die lesbarer und wartbarer sind. Ich kann mich erinnern, wie ich mich mit VAX-Overlays befasst habe, als ich versucht habe, DOE-Simulationscode auf IBM mit virtuellem Speicher auszuführen (sie mussten entfernt und das Ganze in einen Adressraum umgewandelt werden).

Ich würde mit Sicherheit damit beginnen, die FORTRAN IV-Kontrollstrukturen sorgfältig auf mindestens das FORTRAN 77-Niveau umzustrukturieren, mit angemessener Einrückung und Kommentierung. Versuchen Sie, primitive Kontrollstrukturen wie ASSIGN und COMPUTED GOTO und arithmetische IF und natürlich so viele GOTOs wie möglich loszuwerden (mit IF-THEN-ELSE-ENDIF). Verwenden Sie auf jeden Fall IMPLICIT NONE in jeder Routine, um Sie zu zwingen, alle Variablen ordnungsgemäß zu deklarieren (Sie würden nicht glauben, wie viele Fehler ich im Code anderer Leute gefunden habe - Tippfehler in Variablennamen). Achten Sie auf "vorzeitige Optimierungen", die Sie besser vom Compiler selbst ausführen lassen sollten.

Wenn dieser Code weiterhin leben und gewartet werden soll, sind Sie es sich und Ihren Nachfolgern schuldig, ihn lesbar und verständlich zu machen. Seien Sie sich nur sicher, was Sie tun, wenn Sie den Code ändern! FORTRAN hat viele eigenartige Konstrukte, die leicht jemanden stolpern lassen können, der von der C-Seite der Programmierwelt kommt. Denken Sie daran, dass FORTRAN aus der Mitte der späten 50er Jahre stammt, als es keine Wissenschaft der Sprache und des Compiler-Designs gab, sondern nur Ad-hoc- Hacking von etwas (sorry, Dr. B!).


1

Hier ist eine andere, die mich von Zeit zu Zeit gebissen hat. Wenn Sie an FORTRAN-Code arbeiten, stellen Sie sicher, dass Sie alle sechs Anfangsspalten überspringen. Hin und wieder bekomme ich den Code nur fünf Leerzeichen eingerückt und nichts funktioniert. Auf den ersten Blick scheint alles in Ordnung zu sein und dann merke ich endlich, dass alle Zeilen in Spalte 6 statt in Spalte 7 beginnen.

Für alle, die mit FORTRAN nicht vertraut sind, stehen die ersten 5 Spalten für Zeilennummern (= Beschriftungen), die sechste Spalte für ein Fortsetzungszeichen, falls Sie eine Zeile mit mehr als 80 Zeichen haben (geben Sie einfach etwas hier ein und der Compiler weiß, dass diese Zeile ist tatsächlich Teil des vorherigen) und der Code beginnt immer in Spalte 7.


6
Dieser Kommentar gilt für FORTRAN 77 und früher, jedoch nicht für Fortran 90 und höher, das ein Freiform-Quelllayout verwendet.
MSB

3
Außerdem sollen die Zeilen in der 72. Spalte enden, nicht in der 80 ..
Turm
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.