Konvertieren von FORTRAN nach C / C ++

7

Als Teil meines Final Year Project muss ich etwas FORTRAN-Code in C oder C ++ konvertieren (es spielt keine Rolle, welche Sprache ich verstehe, und ich kann C-Stil-Sprachen verstehen).

>

Ich habe f2c entdeckt, ein Programm, das angeblich FORTRAN in C konvertiert und versucht hat, es zu installieren, indem ich eine makefile.vc Datei auf meinem Laufwerk speichere und dann

drücke %Vor%

(Hier ist der Teil der README-Datei zur Installation von f2c, der in der f2c Download-Seite enthalten ist)

>
  

Um f2c unter Linux oder Unix zu kompilieren   kopieren Sie makefile.u in makefile,   Editieren Sie bei Bedarf das Makefile (siehe   Kommentare darin und unten) und tippen   "make" (oder vielleicht "nmake", abhängig von   Ihr System).

     

Um f2c.exe unter MS Windows zu kompilieren   Systeme mit Microsoft Visual C ++,

     

Kopieren Sie makefile.vc makefile nmake

     

Mit anderen PC-Compilern benötigen Sie möglicherweise   um xsum.c mit -DMSDOS zu kompilieren (d. h.   mit MSDOS #defined).

     

Wenn Ihr Compiler das nicht versteht   ANSI / ISO C Syntax (d. H. Wenn Sie eine   K & amp; R C Compiler), kompilieren mit   -DKR_headers.

     

Auf Nicht-Unix-Systemen, auf denen Dateien vorhanden sind   separate binäre und Text-Modi, Sie   Möglicherweise muss "xsumr.out" eher "gemacht" werden   als "make xsum.out".

Ich führe x64 Bit-Version von Windows Vista und versuchte "nmake", aber ich bekomme

  

'nmake' wird nicht als interner oder externer Befehl, ausführbares Programm oder Batchdatei erkannt.

Ich habe Nmake15.exe nach einiger Suche heruntergeladen, aber es funktioniert nicht auf x64-Bit-Maschinen und anscheinend gibt es keine Version davon, die das tut. Also habe ich das Windows SDK heruntergeladen, nachdem mir gesagt wurde, dass es funktionieren würde, aber es hat nichts geändert.

Wo bin ich bei all dem falsch gelaufen, wenn ich es getan habe, und gibt es irgendeine Möglichkeit, diesen FORTRAN-Code in C oder C ++ umzuwandeln?

    
OddCore 30.11.2010, 13:25
quelle

11 Antworten

4

Ich werde nur den allerletzten Teil Ihrer Frage beantworten:

  

Gibt es eine Möglichkeit, das zu konvertieren?   FORTRAN-Code in C oder C ++?

Ja, es gibt: Lesen Sie den Fortran-Code und schreiben Sie die entsprechenden C-Anweisungen in eine C-Datei. Sie sind beide Imperativsprachen. Die Syntax ist anders, aber nicht unmöglich zu dekodieren. Dies wird Ihnen wahrscheinlich viel bessere Ergebnisse als ein Auto-Konverter geben, und Sie werden auch ein viel tieferes Verständnis davon bekommen, wie das ursprüngliche Programm funktioniert.

    
AShelly 30.11.2010, 19:38
quelle
3

f2c ist wirklich der Weg zu gehen, vorausgesetzt, Sie haben F77-Code. Wenn du F90 oder später hast, hilft f2c nicht. Ich habe f2c viele Male mit großem Erfolg benutzt, solange du dich an den -a-Schalter erinnerst.

Nebenbei würde ich f2c als einen der besten Codes aller Zeiten bewerten!

    
David Heffernan 30.11.2010 19:31
quelle
3

Die Methode, die ich bisher zur Konvertierung verwendet habe, ist halbautomatisch: viele Editor- und Textskripte.

Zuerst wird die gesamte Fortran-Quelle in eine einzige Datei kollimiert (indem die entsprechenden Markierungen platziert werden, damit die Dateien wieder getrennt werden können).

Konvertieren Sie als Nächstes die numerischen Beschriftungen in benannte Beschriftungen (z. B. Hinzufügen eines L vor ihnen für Gotos und F für Formate). Nehmen Sie die entsprechenden Änderungen an den Stellen vor, die auf die Beschriftungen verweisen.

Als nächstes markieren Sie das Etikett - setzen Sie die Kombinationen und die Fortsetzungen fort (z. B. mit einer Markierung am Anfang jeder Zeile, wo sie vorkommen). Fügen Sie dann die Label-Continue- und Statement-Continuation-Zeilen erneut hinzu. In einem Editor wie vi würde das bedeuten, eine Reihe von (sagen wir) 1000J zu machen und dann einen massiven Ersatz:% s / # / ^ V ^ M / g, wenn der Anfang der Linienmarkierung ein # ist. Da die Fortsetzungszeilen genau wie die Do-Continue-Combos markiert waren, werden sie wieder zusammengefügt.

Stellen Sie sicher, dass if-labels und do-labels getrennt sind (z. B. schreiben Sie ein grep-Muster, um die relevanten Zeilen zu extrahieren, und schreiben Sie dann ein einfaches Bracket-Matching-Programm, um sie auszuprobieren). Nach der Trennung können Sie die Do-Continions in Klammern umwandeln.

Drehen Sie das if-then-else und dowhile / enddo, Unterprogramm / endsub usw. in eckige Klammern. Machen Sie Subroutine void, pony falsche Namen für die Grundtypen (z. B. Boolean, Zeichen, Integer, Real, Double, Complex, Complex).

Kommentare werden in C ++ // Kommentare umgewandelt; Sowohl die Spalte 0 als auch! Kommentare.

Dann können Sie die Funktionen neu prototypieren. Dies ist effektiv eine KR zu ANSI-C-Konvertierung und erfordert ein einfaches Programm, um die Funktionsheader und Variablendeklarationen zu lesen, um sie abzugleichen. Im Idealfall möchten Sie vielleicht zuerst die Variablendeklarationen als eins zu einer Zeile setzen. Dies erfordert auch ein Bearbeitungsskript und ein Dienstprogramm. Zum Beispiel würde ein "Double A, B, C, ..." in "#Double \ nA \ nB \ n" umgewandelt werden. und dann wird ein Dienstprogramm eingerichtet, um allen Nicht-Nicht-Zeilen die letzte vorangehende Zeile voranzustellen.

Parameteranweisungen werden zu den Typdeklarationen zurückgeführt und in "const" -Anweisungen umgewandelt. Saves werden in statische Deklarationen konvertiert. Commons Ich habe noch keinen guten Weg gefunden, damit zu arbeiten.

Nun kommen die HARD-Teile als nächstes: die Array-Bemaßung, die variable In / Out-Analyse (um zu bestimmen, welche Variablen nach Wert oder durch Referenz übergeben werden müssen). Sie sollten einen C-Compiler bekommen, der den Referenztyp & amp; oder benutze C ++. Für die Redimensionierung von Arrays müssen Sie möglicherweise auch zu C ++ übergehen, wodurch [] neu definiert werden kann.

Die In-Out-Analyse habe ich noch nicht durchgearbeitet, ebenso die Redimensionierung. Aber bei Zu diesem Zeitpunkt befindet sich die relevante Quelle meistens in C oder C ++.

Seien Sie gewarnt: Fortran 2010 ermöglicht eine parallele Verarbeitung, die über C und sogar C ++ hinausgeht (mit Ausnahme ihrer Multithread-Fähigkeiten). Wenn Sie Programme in sich haben, werden die Dinge viel schwieriger.

    
Mark Hopkins 21.11.2014 22:45
quelle
2

Wenn ich f2c unter Windows installieren müsste, würde ich Cygwin verwenden. Jetzt gibt es g77 Ich erwarte, dass nicht viele Leute f2c mehr benutzen.

    
user181548 30.11.2010 13:29
quelle
2

Sie sind sich darüber nicht im Klaren, aber es klingt so, als wollten Sie den Code studieren, und um das zu tun, wollen Sie ihn in C oder C ++ umwandeln. Wenn Sie den Code verwenden möchten, anstatt ihn zu studieren, dann bin ich hier offline und Sie sollten nach Fortran-Compilern suchen.

Gib auf. Sie können keine Möglichkeit finden, idiomatisches Fortran in idiomatisches C oder C ++ zu übersetzen. Zwischen den Sprachen gibt es subtile semantische Unterschiede, und um es richtig zu machen, muss das Übersetzungsprogramm sehr präzise sein, viele Dinge berücksichtigen und obskure Funktionsaufrufe machen, und das kann sehr verwirrend sein. Sie erhalten kein lesbares C oder C ++.

Stattdessen sollten Sie die geeignete Version von Fortran lernen. Wenn Sie C und C ++ verstehen, sollte es nicht schwer sein zu lernen. Es ist nur eine andere Sprache, und es wird nicht viele neue Konzepte haben.

    
David Thornley 30.11.2010 20:27
quelle
2

Sie müssen klar sein, warum Sie das tun. Liegt es daran, dass die Funktionalität, die Sie benötigen, NUR in einem älteren FORTRAN verfügbar ist? Ich hatte dieses Problem vor vielen Jahren, als ich einen allgemeinen Matrixinversionsalgorithmus brauchte, der nur in FORTRAN verfügbar war. Es war nicht einfach zu verstehen - keine Kommentare und Variablen wie G (J). Ich habe es mit f2c in C umgewandelt und es lief perfekt. Aber es war noch schwerer zu verstehen. Zwei Punkte waren, dass FORTRAN von 1 und C von 0 zählt, also gab es viele von i + 1 und j-1. Auch Argumente mussten durch Verweis implementiert werden.

Später musste ich das in Java ausführen. Immer noch kein anderer Algorithmus, also habe ich das C nach Java konvertiert. Das war sehr schmerzhaft. Und ich habe immer noch nicht verstanden, was passiert ist.

Und nach ein oder zwei Jahren hat es aufgehört zu arbeiten!

Aber glücklicherweise gibt es jetzt mehrere Java-Implementierungen.

Wenn Sie also Ihre wirklichen Bedürfnisse erklären können, können wir Ihnen vielleicht helfen. Ich hoffe, dass dies keine Aufgabe ist, denn dann ist es (IMO) ein armer. Wenn es einen magischen Legacy-Code gibt, schlagen Sie vor, dass Sie so hart wie möglich versuchen, ein modernes Äquivalent zu finden.

    
peter.murray.rust 05.12.2010 16:54
quelle
2

Ich habe festgestellt, dass es ein kleines Toolkit namens Fabel Fabel - Automatische Fortran zu C ++ Konvertierung gibt ist für eine solche Umwandlung gewidmet.

Es gibt auch eine Überprüfung eines solchen Tools . Auszug aus den Review-Autoren:

  

Hintergrund

     Im wissenschaftlichen Rechnen war Fortran während des größten Teils der zweiten Hälfte des 20. Jahrhunderts die dominierende Umsetzungssprache. Die vielen Werkzeuge, die während dieser Zeit angesammelt wurden, waren schwierig in moderne Software zu integrieren, die jetzt von objektorientierten Sprachen dominiert wird.

     

Ergebnisse

     

Angetrieben von den Anforderungen eines großen wissenschaftlichen Softwareprojekts haben wir ein Fortran-zu-C ++ - Source-to-Source-Konvertierungswerkzeug namens FABLE entwickelt. Dies ermöglicht die Weiterentwicklung neuer Methoden auch beim Sprachenwechsel. Wir berichten über die Anwendung von FABLE in drei Hauptprojekten und präsentieren detaillierte Vergleiche der Fortran- und C ++ - Laufzeitleistungen.

     

Schlussfolgerungen

     

Unsere Erfahrung legt nahe, dass die meisten Fortran 77-Codes mit einer geringen Anstrengung (gemessen in Tagen) im Vergleich zur ursprünglichen Entwicklungszeit (oft in Jahren gemessen) umgewandelt werden können. Mit FABLE ist es möglich, Legacy-Arbeit in modernen objektorientierten Umgebungen auf tragbare und wartbare Weise wiederzuverwenden und weiterzuentwickeln. FABLE ist unter einer nicht einschränkenden Open-Source-Lizenz verfügbar. In FABLE ist die Analyse der Fortran-Quellen von der Generierung der C ++ - Quellen getrennt. Daher könnten Teile von FABLE für andere Zielsprachen wiederverwendet werden.

    
LCFactorization 26.09.2015 07:54
quelle
1

Haben Sie die Binärdatei ausprobiert?

    
Fred Foo 30.11.2010 13:28
quelle
1

Haben Sie MS Visual Studio installiert? Wenn ja, ist nmake in der Visual Studio-Befehlszeile verfügbar ( nicht die normale Befehlszeile). Wenn nicht, versuchen Sie vielleicht, das herunterzuladen und zu installieren?

    
TZHX 30.11.2010 13:29
quelle
1

Die direkte Konvertierung von / nach FORTRAN in C oder in die prozedurale Version von C ++ sollte nicht kompliziert sein und wird hauptsächlich empfohlen, weil Sie die innere Funktionsweise der FORTRAN-Implementierung lernen werden.

Automatische Tools wie f2c erzeugen unordentlichen Code mit doppeltem Unterstrich wie folgt: __i (i ist die Schleifenzählervariable).

    
beniekg 13.05.2016 09:12
quelle
-1

f2c benötigt Cygwin für anständige Ergebnisse und es funktioniert am besten auf F77 und es kann Lesbarkeit aus dem Code entfernen.

Dies ist ein Beitrag "Ich suche nach einem Werkzeug". Es sollte legal sein, aber auf SO ist es verboten. Dies führt zu vielen Möglichkeiten, die Frage neu zu formulieren. "Was ist der richtige Weg, um diesen Schritt zu tun", "gibt es einen besseren Weg, dies zu tun" usw. in der Hoffnung auf "Herr, benutze einfach dieses Werkzeug".

    
sixtytrees 06.08.2016 16:19
quelle

Tags und Links