Frage

Ich bin vor kurzem dazu gekommen, eine große Menge an wissenschaftlichem, rechenintensivem FORTRAN-Code zu pflegen.Ich habe Schwierigkeiten, alle Nuancen einer vierzig Jahre alten Sprache zu verstehen, trotz Google und zwei Büchern für Anfänger.Der Code ist voll von „leistungssteigernden Verbesserungen“.Hat jemand Anleitungen oder praktische Ratschläge dafür? de-Optimierung von FORTRAN in CS 101-Stufen?Weiß jemand, wie die FORTRAN-Codeoptimierung funktioniert?Gibt es typische FORTRAN-Fallstricke, die einem Entwickler mit Java/C++/.NET-Kenntnissen, der eine FORTRAN 77/90-Codebasis übernimmt, möglicherweise nicht in den Sinn kommen würden?

War es hilfreich?

Lösung

Man muss irgendwie ein „Gefühl“ dafür bekommen, was Programmierer damals tun mussten.Der Großteil des Codes, mit dem ich arbeite, ist älter als ich und lief auf Maschinen, die „neu“ waren, als meine Eltern noch zur Highschool gingen.

Häufige FORTRAN-Ismen, mit denen ich zu tun habe und die die Lesbarkeit beeinträchtigen, sind:

  • Gemeinsame Blöcke
  • Implizite Variablen
  • Zwei oder drei DO-Schleifen mit gemeinsamen CONTINUE-Anweisungen
  • GOTO ersetzt DO-Schleifen
  • Arithmetische IF-Anweisungen
  • Berechnete GOTOs
  • Äquivalenz REAL/INTEGER/andere in einem gemeinsamen Block

Zu den Lösungsstrategien gehören:

  1. Erhalten Spag / plusFORT, das Geld wert, es löst viele Probleme automatisch und Bug Free(tm)
  2. Wechseln Sie nach Möglichkeit zu Fortran 90, wenn nicht, wechseln Sie zum frei formatierten Fortran 77
  3. Fügen Sie IMPLICIT NONE zu jeder Unterroutine hinzu und beheben Sie dann jeden Kompilierungsfehler. Dies ist zeitaufwändig, aber letztendlich notwendig. Einige Programme können dies automatisch für Sie erledigen (oder Sie können es per Skript ausführen).
  4. Es lohnt sich, alle COMMON-Blöcke in MODULE zu verschieben, eine niedrig hängende Frucht
  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 äquivalente gemeinsame Blockmitglieder entweder in den in einem Modul zugewiesenen ALLOCATABLE-Speicher oder in ihre echten Zeichenroutinen, wenn Hollerith in einem REAL gespeichert wird

Wenn Sie spezifischere Fragen zur Lösung einiger Lesbarkeitsaufgaben haben, kann ich Ihnen Ratschläge geben.Ich verfüge über 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 alle „Probleme“ gestoßen, die Sie möglicherweise gefunden haben.

Andere Tipps

Legacy Fortran Seifenkiste

Ich habe eine ganze Weile dabei geholfen, eine alte Fortran-Codebasis zu pflegen/verbessern, und die meiste Zeit habe ich nachgedacht sechsbuchstabige Variablen liegt am Geld.Dieser Rat ist jedoch eher technisch;Schwieriger wird es, „gute Praktiken“ umzusetzen.

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

Das mag heutzutage wie offensichtliche Dinge klingen, aber auf die Gefahr hin, es zu verallgemeinern, behaupte ich, dass die meisten Fortran-Code-Shops eine tief verwurzelte Kultur haben, einige begannen, bevor der Begriff „Software-Engineering“ überhaupt existierte, und dass sich das im Laufe der Zeit durchsetzt ist „Erledigen Sie es jetzt“.(Dies gilt keineswegs nur für Fortran-Shops.)

Fallstricke umarmen

Aber was tun mit einer bereits vorhandenen, heruntergekommenen alten Codebasis?Ich stimme Joel Spolsky beim Umschreiben zu, nicht.Allerdings meiner Meinung nach sechsbuchstabige Variablen weist auf die zulässige Ausnahme hin: Verwenden Sie Softwaretools für den Übergang zu besseren Fortran-Konstrukten. Vieles kann von Code-Analysatoren erfasst/korrigiert werden (ZUM ÜBERPRÜFEN) und Code-Rewriter (plusFORT).Wenn Sie dies manuell 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 die Behebung von Softwarefehlern entstanden sind. Das ist demütigend.)Ich glaube, es gibt eine solche Statistik Experte für C-Programmierung.)

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

Fortran Dead Tree Library

Im Laufe der Jahre hatte ich als „Qualitätssicherungs-Nörgler“ nur mäßigen Erfolg, aber ich habe herausgefunden, dass Bildung funktioniert, manchmal auch unbeabsichtigt, und dass eines der einflussreichsten Dinge ein Nachschlagewerk ist, das jemand zur Hand hat.Ich liebe und kann es nur wärmstens empfehlen

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

Das Buch ist sogar mit Fortran 77 gut, da es speziell die Konstrukte identifiziert, die nicht verwendet werden sollten, und die besseren Alternativen aufzeigt.Tatsächlich handelt es sich jedoch um ein Lehrbuch, und wenn man wirklich alles über Fortran 95 erfahren möchte, kann es an der Puste enden, weshalb ich es empfehle

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

als Ihre Referenz (sic) für Fortran 95.Seien Sie gewarnt, dass es sich nicht um die klarste Schreibweise handelt, aber der Schleier lüftet sich, wenn Sie wirklich das Beste aus einer neuen Fortran 95-Funktion herausholen möchten.

Es hat mir Spaß gemacht, mich auf die Probleme beim Wechsel von Fortran 77 zu Fortran 90 zu konzentrieren

Migration auf Fortran 90, von Jim Kerrigan

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

Was schließlich den Erben des wundervollen, wunderbaren Klassikers betrifft, Software-Tools, ich nominiere

Klassisches FORTRAN, von Michael Kupferschmid

Dieses Buch zeigt nicht nur, was man „nur“ mit Fortran 77 machen kann, sondern geht auch auf einige der subtileren Probleme ein, die auftreten (z. B. sollte man die EXTERNAL-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 der dritte).

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

  • Es gibt eine Compileroption zum Erzwingen des IMPLICIT NONE-Verhaltens, mit der Sie problematische Routinen identifizieren können, ohne sie zuerst mit der IMPLICIT NONE-Deklaration zu ändern.Dieser Ratschlag erscheint erst dann sinnvoll, wenn ein Build zum ersten Mal aufgrund eines IMPLICIT NONE-Befehls, der in eine Legacy-Routine eingefügt wurde, bombardiert wird.(Was?Bei Ihrer Codeüberprüfung ist das nicht aufgefallen?;-)
  • Es gibt eine Compiler-Option zur Überprüfung der Array-Grenzen, die beim Debuggen von Fortran 77-Code nützlich 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 schon haben Sie einen guten Einstieg in die Syntaxprüfung.Bei einigen kommerziellen Fortran 77-Compilern handelt es sich tatsächlich um Fortran 90-Compiler, die im Fortran 77-Modus ausgeführt werden. Daher ist dies möglicherweise eine relativ triviale Option für alle Ihre Build-Skripte.

Es gibt etwas in der ursprünglichen Frage, vor dem ich warnen möchte.Sie sagen, der Code sei voller „leistungssteigernder Verbesserungen“.Da Fortran-Probleme im Allgemeinen wissenschaftlicher und mathematischer Natur sind, sollten Sie nicht davon ausgehen, dass diese Performance-Tricks dazu dienen, die Kompilierung zu verbessern.An der Sprache liegt es wohl nicht.Bei 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 und sogar die Logik chaotisch erscheinen lassen, aber die Absicht besteht darin, die Lösung schneller zu machen.Wenn Sie nicht genau wissen, was es tut und warum, lassen Sie es in Ruhe.

Selbst einfache Umgestaltungen, wie das Ändern dumm aussehender Variablennamen, können eine große Gefahr sein.Historisch übliche mathematische Gleichungen in einem bestimmten Wissenschaftsbereich verwenden seit den Tagen von Maxwell eine bestimmte Abkürzung.Ein Array namens B(:) in der Elektromagnetik zu sehen, sagt allen Emag-Ingenieuren also genau, worum es geht.Ändern Sie das auf eigene Gefahr.Moralisch: Machen Sie sich mit der Standardnomenklatur der Wissenschaft vertraut, bevor Sie sie umbenennen.

Als jemand mit Erfahrung sowohl in FORTRAN (Variante 77, obwohl es schon eine Weile her ist, dass ich es ernsthaft verwendet habe) als auch in C/C++ fallen mir sofort Arrays ein, auf die man achten sollte.FORTRAN-Arrays beginnen mit einem Index von 1 statt 0 wie in C/C++/Java.Außerdem ist die Speicheranordnung umgekehrt.Wenn Sie also den ersten Index erhöhen, erhalten Sie aufeinanderfolgende Speicherorte.

Meine Frau verwendet FORTRAN immer noch regelmäßig und muss mit C++-Code arbeiten, jetzt, wo ich ihr helfen werde.Wenn während ihrer Konvertierung Probleme auftreten, werde ich versuchen, sie darauf hinzuweisen.Vielleicht helfen sie.

Könnten Sie erklären, was Sie bei der Pflege des Codes tun müssen?Muss man den Code wirklich ändern?Wenn Sie davonkommen könnten, indem Sie nur die Schnittstelle zu diesem Code und nicht den Code selbst ändern, wäre das 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 ist die Implementierung muss Code-Optimierung einschließen, um innerhalb eines angemessenen Zeitrahmens ausgeführt zu werden.Erschwerend kommt hinzu, dass ein Großteil des Codes in diesem Bereich von Wissenschaftlern/Ingenieuren erstellt wird, die zwar Experten auf ihrem Gebiet, aber nicht in der Softwareentwicklung sind.Sagen wir einfach, dass „einfach zu verstehen“ für sie nicht die erste Priorität ist (ich war einer von ihnen und lernte immer noch, ein besserer Softwareentwickler zu werden).

Aufgrund der Art des Problems glaube ich nicht, dass eine allgemeine Frage und Antwort ausreicht, um hilfreich zu sein.Ich schlage vor, dass Sie eine Reihe spezifischer Fragen mit angehängtem Codeausschnitt posten.Beginnen Sie vielleicht mit dem, der Ihnen am meisten Kopfschmerzen bereitet?

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

Ich möchte noch erwähnen, dass komplexe Arithmetik und mehrdimensionale Arrays viele Jahre lang äußerst ineffizient waren.Aus diesem Grund findet man oft umgeschriebenen Code, um komplexe Berechnungen nur mit realen Variablen und Matrizen durchzuführen, die mit einem einzigen linearen Index adressiert werden.

Nun, in gewisser Hinsicht haben Sie Glück, denn Fortran verfügt nicht über viele subtile Flusskontrollkonstrukte oder Vererbung oder ähnliches.Auf der anderen Seite gibt es einige wirklich erstaunliche Fallstricke, wie die arithmetisch berechnete Verzweigung zu einer numerischen Bezeichnung, die implizit typisierten Variablen, die keiner Deklaration bedürfen, und das Fehlen echter Schlüsselwörter.

Ich weiß nichts über die „leistungssteigernden Verbesserungen“.Ich gehe davon aus, dass die meisten von ihnen wahrscheinlich unwirksam sind, da ein paar Jahrzehnte Compiler-Technologie die meisten Hinweise überflüssig gemacht haben.Leider müssen Sie die Dinge wahrscheinlich so belassen, wie sie sind, es sei denn, Sie planen eine umfassende Neufassung.

Auf jeden Fall sollte der Kerncode der wissenschaftlichen Berechnung einigermaßen lesbar sein.Jede Programmiersprache, die Infix-Arithmetik verwendet, wäre eine gute Vorbereitung für das Lesen des Arithmetik- und Zuweisungscodes von Fortran.

Ich liebte FORTRAN, ich habe darin unterrichtet und programmiert.Ich wollte das nur einwerfen.Habe es seit Jahren nicht mehr angerührt.
Ich habe bei COBOL angefangen, aber als ich zu FORTRAN wechselte, fühlte ich mich befreit.Alles ist relativ, ja?Ich unterstütze das oben Gesagte: Erkenne, dass es sich hier um eine PROZEDURALE Sprache handelt – ohne Feinheiten – also nimm es so, wie du es siehst.
Wahrscheinlich frustriert es Sie zunächst einmal.

Ich begann mit Fortran IV (WATFIV) auf Lochkarten und meine ersten Arbeitsjahre waren VS FORTRAN v1 (IBM, Fortran 77-Level).Viele gute Ratschläge in diesem Thread.

Ich würde hinzufügen, dass man unterscheiden muss zwischen Dingen, die getan werden, um das Biest überhaupt zum Laufen zu bringen, und Dingen, die den Code „optimieren“, und Dingen, die besser lesbar und wartbar sind.Ich kann mich erinnern, dass ich mit VAX-Overlays zu tun hatte, als ich versuchte, DOE-Simulationscode auf IBM mit virtuellem Speicher zum Laufen zu bringen (sie mussten entfernt und das Ganze in einen einzigen Adressraum umgewandelt werden).

Ich würde auf jeden Fall damit beginnen, die FORTRAN IV-Kontrollstrukturen sorgfältig auf mindestens FORTRAN 77-Niveau umzustrukturieren, mit angemessener Einrückung und Kommentierung.Versuchen Sie, primitive Kontrollstrukturen wie ASSIGN und COMPUTED GOTO sowie arithmetisches IF und natürlich so viele GOTOs wie möglich loszuwerden (mithilfe von 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 entdeckt habe – Tippfehler in Variablennamen).Achten Sie auf „vorzeitige Optimierungen“, die Sie besser dem Compiler überlassen sollten.

Wenn dieser Kodex weiterleben und wartbar sein soll, sind Sie es sich selbst und Ihren Nachfolgern schuldig, ihn lesbar und verständlich zu machen. Seien Sie einfach sicher, was Sie tun, wenn Sie den Code ändern! FORTRAN hat viele seltsame Konstrukte, die jemanden, der aus der C-Seite der Programmierwelt kommt, leicht zum Stolpern bringen können.Denken Sie daran, dass FORTRAN auf die Mitte der späten 50er Jahre zurückgeht, als es noch keine Wissenschaft über Sprache und Compiler-Design gab ad hoc etwas zusammenhacken (tut mir leid, Dr.B!).

Hier ist noch einer, der 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 um fünf Leerzeichen eingerückt und nichts funktioniert.Auf den ersten Blick scheint alles in Ordnung zu sein, und dann fällt mir endlich auf, dass alle Zeilen in Spalte 6 und nicht in Spalte 7 beginnen.

Für alle, die mit FORTRAN nicht vertraut sind: Die ersten 5 Spalten sind für Zeilennummern (=Beschriftungen), die 6. Spalte ist 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 eigentlich Teil des Vorgängers) und der Code beginnt immer in Spalte 7.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top