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?
79
Antworten:
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:
Strategien zur Lösung dieser Probleme umfassen:
Konvertieren Sie alle DO-Schleifen in die neuere F90-Syntax
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.
quelle
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.
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
quelle
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.
quelle
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.
quelle
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
GOTO
s 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 schreibenDO i=1,n+1
; du musstest schreibenn1=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.
quelle
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.
quelle
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?
quelle
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.
quelle
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!).
quelle
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.
quelle