Als Teil meines Abschlussprojekts muss ich FORTRAN-Code in C oder C++ konvertieren (egal welche Sprache, solange ich sie verstehe und Sprachen im C-Stil verstehen kann).
Ich habe f2c entdeckt, ein Programm, das angeblich FORTRAN in C konvertiert, und habe versucht, es gemäß den Anweisungen zu installieren, indem ich eine makefile.vc-Datei auf meinem Laufwerk gespeichert und dann ausgeführt habe
copy makefile.vc makefile
nmake
(Hier ist der Teil der README-Datei zur Installation von f2c, der im f2c enthalten ist Download-Seite)
Um f2c auf Linux- oder Unix-Systemen zu kompilieren, kopieren Sie makefile.u in Makefile, bearbeiten Sie Makefile bei Bedarf (siehe die Kommentare darin und unten) und geben Sie „make“ (oder vielleicht „nmake“, je nach System) ein.
Um f2c.exe auf MS Windows-Systemen mit Microsoft Visual C++ zu kompilieren,
Kopieren Sie makefile.vc Makefile nmake
Bei anderen PC-Compilern müssen Sie xsum.c möglicherweise mit -DMSDOS (dh mit MSDOS #definiert) kompilieren.
Wenn Ihr Compiler die ANSI/ISO-C-Syntax nicht versteht (z. B. wenn Sie einen K&R-C-Compiler haben), kompilieren Sie mit -DKR_headers .
Auf Nicht-Unix-Systemen, auf denen Dateien über separate Binär- und Textmodi verfügen, müssen Sie möglicherweise „make xsumr.out“ anstelle von „make xsum.out“ verwenden.
Ich verwende die x64-Bit-Version von Windows Vista und habe „nmake“ ausprobiert, aber ich bekomme
„nmake“ wird nicht als interner oder externer Befehl, ausführbares Programm oder Batchdatei erkannt.
Ich habe Nmake15.exe nach einigem Suchen heruntergeladen, aber es funktioniert nicht auf x64-Bit-Rechnern 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 habe ich bei all dem einen Fehler gemacht, wenn ja, und gibt es eine Möglichkeit, diesen FORTRAN-Code in C oder C++ zu konvertieren?
Ein Wort der Warnung: LanguageA-zu-LanguageB-Konverter produzieren möglicherweise Code, der korrekt ausgeführt wird (obwohl dies allein ziemlich schwierig sein kann), aber so gut wie keiner von ihnen produziert für Menschen lesbar Code…
– Benutzer395760
30. November 2010 um 13:34
Was schlagen Sie dann vor? Ich bin offen für Vorschläge, ich muss diesen FORTRAN-Code nur irgendwie in C oder C++ umwandeln …
– OddCore
30. November 2010 um 13:40 Uhr
Welche Version von Fortran? Es gab mehrere. Wenn sich f2c nicht geändert hat, konvertiert es Fortran 77. Es gibt mindestens zwei neuere Versionen.
Im wissenschaftlichen Rechnen war Fortran während des größten Teils der zweiten Hälfte des 20. Jahrhunderts die vorherrschende Implementierungssprache. Die vielen in dieser Zeit angesammelten Tools ließen sich nur schwer in moderne Software integrieren, die heute von objektorientierten Sprachen dominiert wird.
Ergebnisse
Angetrieben durch die Anforderungen eines großen wissenschaftlichen Softwareprojekts haben wir ein Fortran-zu-C++-Source-to-Source-Konvertierungstool namens FABLE entwickelt. Dies ermöglicht die Weiterentwicklung neuer Methoden auch bei einem Sprachwechsel. Wir berichten über die Anwendung von FABLE in drei großen Projekten und präsentieren detaillierte Vergleiche der Laufzeitleistungen von Fortran und C++.
Schlussfolgerungen
Unsere Erfahrung zeigt, dass die meisten Fortran 77-Codes mit einem geringeren Aufwand (gemessen in Tagen) im Vergleich zur ursprünglichen Entwicklungszeit (oft in Jahren gemessen) konvertiert werden können. Mit FABLE ist es möglich, Legacy-Arbeiten in modernen objektorientierten Umgebungen auf portable und wartbare Weise wiederzuverwenden und weiterzuentwickeln. FABLE ist unter einer uneingeschränkten 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.
Es handelt sich nicht um eine Rezension, sondern um einen Artikel, der von den Autoren des Tools verfasst wurde.
– Vladimir F. Героям слава
1. Okt. 2015 um 8:44
Es handelt sich anscheinend um ein Python-Tool, aber es gibt keine einfache Einrichtung über PIP. Es scheint, dass man ein großes Computational-Chemie-Paket installieren muss, um es zu bekommen. f2c könnte einfacher sein.
– tesch1
14. April 2019 um 15:11 Uhr
f2c ist wirklich der richtige Weg, vorausgesetzt, Sie haben F77-Code. Wenn Sie F90 oder höher haben, hilft f2c nicht. Ich habe f2c viele Male mit großem Erfolg verwendet, solange Sie sich an den Schalter -a erinnern.
Abgesehen davon würde ich f2c als einen der großartigsten Codes aller Zeiten einstufen!
Sie müssen sich darüber im Klaren sein, warum Sie dies tun. Liegt es daran, dass die von Ihnen benötigte Funktionalität NUR in einigen älteren FORTRAN-Versionen 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 leicht zu verstehen – keine Kommentare und Variablen mit Namen wie G(J). Ich habe es mit f2c nach C konvertiert und es lief perfekt. Aber es war noch schwieriger zu verstehen. Zwei Punkte waren, dass FORTRAN von 1 und C von 0 an zählt, also gab es viele i+1 und j-1. Auch Argumente mussten per Referenz implementiert werden.
Später musste ich das in Java ausführen. Immer noch kein anderer Algorithmus, also habe ich C nach Java konvertiert. Das war wirklich schmerzhaft. Und ich habe immer noch nicht verstanden, was passiert ist.
Und nach ein oder zwei Jahren funktionierte es nicht mehr!
Aber zum Glück gibt es mittlerweile mehrere Java-Implementierungen.
Wenn Sie also Ihre tatsächlichen Anforderungen erläutern können, können wir Ihnen vielleicht helfen. ICH Hoffnung dass dies keine Aufgabe ist, denn wenn ja, ist es (meiner Meinung nach) eine schlechte. Wenn es magischen Legacy-Code gibt, empfehlen wir Ihnen, so viel wie möglich zu versuchen, ein modernes Äquivalent zu finden.
Ich muss ein Frontend für Zork in C++ erstellen, aber da ich den Quellcode von Zork nicht finden konnte, habe ich mich für Adventure entschieden und etwas FORTRAN-Quellcode gefunden. Also habe ich das gemacht. Also ja, es ist eine Aufgabe, mein Abschlussprojekt, um genau zu sein.
– OddCore
29. Dezember 2010 um 12:04
Das ist spannend. Ich habe mit Mike Arnautov zusammengearbeitet – siehe en.wikipedia.org/wiki/Colossal_Cave_Adventure der später Code in einer fortgeschritteneren Sprache als FORTRAN entwickelte. YSchlagen Sie vor, Mike zu schreiben, Ihr Problem zu erklären und zu sehen, was er vorschlägt. Der ADVENT-Code ist brillant – das gesamte Spiel in den FORTRAN-Festspeicher der 1970er Jahre zu übertragen, ist genial. Aber Sie müssen sich in den Geist des Designs hineinversetzen. (Mike wird wahrscheinlich von Zork wissen)
– peter.murray.rust
29. Dezember 2010 um 12:35 Uhr
Vielen Dank, Sir, genau das werde ich tun.
– OddCore
29. Dezember 2010 um 13:20 Uhr
Sie sind sich darüber nicht ganz im Klaren, aber es hört sich so an, als ob Sie den Code studieren und ihn dazu in C oder C++ konvertieren möchten. Wenn Sie den Code verwenden möchten, anstatt ihn zu studieren, dann bin ich hier falsch und Sie sollten nach Fortran-Compilern suchen.
Aufgeben. Sie können keine Möglichkeit finden, idiomatisches Fortran in idiomatisches C oder C++ zu übersetzen. Es gibt subtile semantische Unterschiede zwischen den Sprachen, und um alles richtig zu machen, muss das Übersetzungsprogramm sehr präzise sein, viele Dinge berücksichtigen und undurchsichtige Funktionsaufrufe durchführen, und das kann sehr verwirrend sein. Sie erhalten kein lesbares C oder C++.
Stattdessen sollten Sie die entsprechende Version von Fortran erlernen. Wenn Sie C und C++ verstehen, sollte es überhaupt nicht schwer sein, es zu lernen. Es ist nur eine andere Sprache und wird nicht viele neue Konzepte enthalten.
Die Methode, die ich bisher zur Konvertierung verwendet habe, ist halbautomatisch: viele Editor- und Textskripte.
Fassen Sie zunächst alle Fortran-Quellen in einer einzigen Datei zusammen (platzieren Sie ggf. Markierungen, damit die Dateien erneut getrennt werden können).
Als nächstes wandeln Sie die numerischen Beschriftungen in benannte Beschriftungen um (z. B. indem Sie vor ihnen ein L für Gotos und ein F für Formate hinzufügen). Nehmen Sie die entsprechenden Änderungen an den Stellen vor, die auf die Beschriftungen verweisen.
Als nächstes markieren Sie die Label-Fortsetzung-Kombinationen und die Anweisungsfortsetzungen (z. B. mit einer Markierung am Anfang jeder Zeile, wo sie vorkommen). Verbinden Sie dann die Zeilen „label-continue“ und „statement-continuation“ erneut. In einem Editor wie vi würde das bedeuten, eine Reihe von (sagen wir) 1000Js auszuführen und dann einen massiven Ersatz :%s/#/^V^M/g, wenn der Zeilenanfangsmarker ein # ist. Da die Fortsetzungszeilen ebenso wie die Do-Fortsetzungs-Kombinationen speziell markiert wurden, werden sie wieder zusammengefügt.
Stellen Sie sicher, dass die if-Labels und do-Labels getrennt sind (schreiben Sie beispielsweise ein grep-Muster, um die relevanten Zeilen zu extrahieren, und schreiben Sie dann ein einfaches Klammervergleichsprogramm, um sie zu überprüfen). Nach der Trennung können Sie die Do-Continues in Klammern umwandeln.
Setzen Sie if-then-else und dowhile/enddo, subroutine/endsub usw. in Klammern. Machen Sie die Unterroutine ungültig und erfinden Sie falsche Namen für die Grundtypen (z. B. Boolean, Character, Integer, Real, Double, Complex, Complex).
Kommentare werden in C++ // comments konvertiert; sowohl die Spalte 0 als auch ! Kommentare.
Anschließend können Sie die Funktionen erneut prototypisieren. Dabei handelt es sich praktisch um eine KR-zu-ANSI-C-Konvertierung und erfordert ein einfaches Programm, das die Funktionsheader und Variablendeklarationen liest, um sie abzugleichen. Idealerweise möchten Sie die Variablendeklarationen zunächst einzeln in eine Zeile einfügen. Dazu sind außerdem ein Bearbeitungsskript und ein Dienstprogramm erforderlich. Beispielsweise würde ein „Double A, B, C, …“ in „#Double\nA\nB\n“ umgewandelt werden. Anschließend wird ein Dienstprogramm eingerichtet, das allen Nicht-#-Zeilen die jüngste vorangehende #-Zeile voranstellt.
Parameteranweisungen werden wieder mit den Typdeklarationen verbunden und in „const“-Anweisungen umgewandelt. Speicherungen werden in statische Deklarationen umgewandelt. Commons Ich habe noch keine gute Möglichkeit gefunden, damit zu arbeiten.
Als nächstes kommen die HARD-Teile: die Array-Dimensionierung, die Variablen-In/Out-Analyse (um zu bestimmen, welche Variablen als Wert oder als Referenz übergeben werden müssen). Sie sollten sich einen C-Compiler besorgen, der den Referenztyp erkennt, oder C++ verwenden. Für die Neudimensionierung von Arrays müssen Sie möglicherweise auch auf C++ umsteigen, was dies ermöglicht [] neu definiert werden.
Die In-Out-Analyse habe ich noch nicht durchgearbeitet, ebenso die Redimensionierung. Zu diesem Zeitpunkt liegt die relevante Quelle jedoch größtenteils in C oder C++ vor.
Seien Sie gewarnt: Fortran 2010 ermöglicht die parallele Verarbeitung, die über C und sogar C++ hinausgeht (mit Ausnahme ihrer Multithread-Fähigkeiten). Wenn Ihre Programme diese enthalten, wird es viel schwieriger.
A. Shelly
Ich werde nur den allerletzten Teil Ihrer Frage beantworten:
Gibt es eine Möglichkeit, diesen FORTRAN-Code in C oder C++ zu konvertieren?
Ja, das gibt es: Lesen Sie den Fortran-Code und schreiben Sie die entsprechenden C-Anweisungen in eine C-Datei. Beides sind Imperativsprachen. Die Syntax ist anders, aber nicht unmöglich zu dekodieren. Dadurch erhalten Sie wahrscheinlich viel bessere Ergebnisse als mit einem automatischen Konverter und erhalten außerdem ein viel tieferes Verständnis für die Funktionsweise des Originalprogramms.
Wenn ich f2c unter Windows installieren müsste, würde ich Cygwin verwenden. Jetzt gibt es g77. Ich gehe davon aus, dass nicht mehr viele Leute f2c verwenden.
f2c wird immer noch verwendet, wenn Fortran-Compiler nicht verfügbar sind, wenn C-Pakete Netlib-Quellen enthalten usw. Die Installation ist viel einfacher als g77.
– Fred Foo
30. November 2010 um 13:31 Uhr
Nun, ich verstehe den Sinn darin nicht. f2c konvertiert lediglich FORTRAN in C. Wie Sie es darüber hinaus kompilieren, ist eine andere Sache. Ich persönlich habe sowohl MS- als auch Borland-C-Compiler verwendet. Aber die Wahl ist für die Konvertierung wirklich unerheblich.
– David Heffernan
30. November 2010 um 19:30 Uhr
14526400cookie-checkKonvertieren von FORTRAN nach C / C++yes
Ein Wort der Warnung: LanguageA-zu-LanguageB-Konverter produzieren möglicherweise Code, der korrekt ausgeführt wird (obwohl dies allein ziemlich schwierig sein kann), aber so gut wie keiner von ihnen produziert für Menschen lesbar Code…
– Benutzer395760
30. November 2010 um 13:34
Was schlagen Sie dann vor? Ich bin offen für Vorschläge, ich muss diesen FORTRAN-Code nur irgendwie in C oder C++ umwandeln …
– OddCore
30. November 2010 um 13:40 Uhr
Welche Version von Fortran? Es gab mehrere. Wenn sich f2c nicht geändert hat, konvertiert es Fortran 77. Es gibt mindestens zwei neuere Versionen.
– David Thornley
30. November 2010 um 20:21 Uhr
@David Thornley: 4, tatsächlich (Fortran 90, 95, 2003, 2008).
– Janneb
1. Dezember 2010 um 14:51
Ich vermute tatsächlich Lernen FORTRAN kommt nicht in Frage. . .
– Geometrisch
26. September 2015 um 7:57 Uhr