Konvertierung von FORTRAN nach C / C++
Als Teil von meinem Letzten Jahres-Projekt, ich brauche, um zu konvertieren einige FORTRAN-code in C oder C++ (es ist egal welche Sprache, wie lange ich es verstehen kann, und ich kann verstehen, C-style Sprachen).
Habe ich entdeckt, f2c, ein Programm, das angeblich konvertiert FORTRAN nach C, und versuchte, es zu installieren, nach den Anweisungen, und speichern Sie eine Datei makefile.vc-Datei auf meine Festplatte und dann tut
copy makefile.vc makefile
nmake
(hier ist der Teil der README-Datei zur Installation von f2c in der f2c download-Seite)
Kompilieren f2c auf Linux oder Unix
Systeme, kopiere makefile.u makefile,
edit makefile, falls erforderlich (siehe
Kommentare in und unter), und geben Sie
"machen" (oder vielleicht "nmake", je nach
Ihr system).Kompilieren f2c.exe auf MS-Windows
Systeme mit Microsoft Visual C++,kopieren makefile.vc makefile nmake
Mit anderen PC-Compiler, die Sie möglicherweise benötigen
zum kompilieren xsum.c mit -DMSDOS (d.h.,
mit MSDOS #definiert).Wenn Ihr compiler nicht verstehen
ANSI/ISO-C-syntax (D. H., wenn Sie eine
K&R-C-compiler) kompilieren mit
-DKR_headers .Auf nicht-Unix-Systeme, wo die Dateien haben
separate Binär-und text-Modi, die Sie
möglicherweise müssen Sie zu "machen xsumr.aus" eher
als "make-xsum.aus".
Bin ich mit x64-bit-version von Windows Vista und habe versucht, "nmake", aber ich bekomme
'nmake' nicht anerkannt wird als Befehl interne oder externe, betriebsbereiten Programm oder batch-Datei.
Habe ich heruntergeladen Nmake15.exe nach einigem suchen, aber es funktioniert nicht auf 64-bit-Maschinen und anscheinend gibt es keine version, die funktioniert. Also ich habe die Windows SDK, nachdem er gesagt, dass würde funktionieren, aber es nicht etwas ändern.
Wo ich schief gegangen ist in all diesem, wenn ich haben, und gibt es eine Möglichkeit der Umwandlung von FORTRAN-code in C oder C++?
- Ein Wort der Warnung: LanguageA-zu-languageB-Wandler erzeugen kann, der code läuft korrekt (obwohl dies allein kann sehr schwierig sein), aber über keiner von Ihnen produzieren, für Menschen lesbaren code...
- Was raten Sie dann? Ich bin für Vorschläge offen, ich einfach wirklich machen müssen, dass FORTRAN-code in C oder C++ in irgendeiner Weise...
- Welche version von Fortran? Es wurden mehrere. Wenn f2c hat sich nicht verändert, es konvertiert die Fortran 77. Es gibt mindestens zwei Versionen.
- Thornley: 4, eigentlich (Fortran 90, 95, 2003, 2008).
- Ich nehme an, das lernen tatsächlich FORTRAN ist die Frage . . .
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werde ich beantworten, nur zum letzten Teil Ihrer Frage:
Ja, es ist: Lesen Sie die fortran-code, und schreiben Sie die entsprechende C-Anweisungen in einer C-Datei.
Sie sind sowohl in imperativen Sprachen. Die syntax ist anders, aber nicht unmöglich zu Dekodieren. Dies wird wahrscheinlich geben Ihnen viel bessere Ergebnisse als ein auto-Konverter, und wird Ihnen auch ein viel tieferes Verständnis von, wie das ursprüngliche Programm funktioniert.
Fand ich es ist ein kleines toolkit namens Fabel Fabel - Automatische Fortran zu C++ - Konvertierung die für eine solche Umwandlung.
Gibt es auch ein review von so einem tool. Auszug aus der review-Autoren:
f2c ist wirklich der Weg zu gehen, vorausgesetzt, Sie haben F77-code. Wenn Sie haben, F90 oder später dann f2c nicht helfen. Ich habe verwendet, f2c, viele, viele Male mit großem Erfolg, so lange wie Sie sich erinnern, den -a-Schalter.
Nebenbei würde ich rate, f2c als einer der ganz großen Zeit-codes!
Müssen Sie sich klar, warum Sie dies tun. Ist es, weil die Funktionalität, die Sie brauchen, ist NUR erhältlich in einigen legacy FORTRAN? Ich hatte dieses problem vor vielen Jahren, als brauchte ich eine Allgemeine matrix-inversion Algorithmus, das war nur in FORTRAN. Es war nicht leicht zu verstehen - ohne Kommentare und Variablen, die den Namen G(J). Ich baute es zu C f2c und es lief perfekt. Aber es war auch schwieriger zu verstehen. Zwei Punkte waren, dass FORTRAN zählt ab 1 und C 0, so gab es viele i+1 und j-1. Auch Argumente, die umgesetzt werden musste-by-reference.
Später musste ich dies in Java. Noch keinen anderen Algorithmus, so dass ich konvertiert C zu Java. Das war wirklich schmerzhaft. Und ich wusste immer noch nicht verstehen, was passiert.
Und nach ein oder zwei Jahren funktioniert es nicht mehr!
Aber, zum Glück, jetzt gibt es mehrere Java-Implementierungen.
Also, wenn Sie erklären können, die Ihren tatsächlichen Anforderungen können wir vielleicht helfen. Ich hoffe, dass dies nicht eine Abtretung, denn wenn dem so ist, es ist (IMO) eine schlechte. Wenn es ein magic legacy-code, schlage vor, Sie versuchen so schwer wie möglich zu finden, ein modernes äquivalent.
Die Methode, die ich benutzt habe für den Umbau so weit ist semi-automatisiert: viele-editor und text-scripts.
Erste, kollimieren Ihr alle die Fortran-Quelle in einer einzigen Datei (Marker setzen, die als angemessen zu ermöglichen, um die Dateien wieder getrennt).
Nächste, konvertieren Sie die numerischen Etiketten namens-Etiketten (z.B. hinzufügen eines L, bevor Sie für gotos und F-Formate). Nehmen Sie die entsprechenden änderungen in den Orten, die auf den Etiketten.
Nächste, markieren Sie die label - weiter-Kombinationen und die Anweisung Fortsetzungen (z.B. mit einer Markierung am Anfang jeder Zeile, wo Sie auftreten). Dann re-join the label-weiter-und Verlustrechnung-Fortsetzung-Linien. In einem editor wie vi, das würde bedeuten, dass dabei eine Reihe von (sagen wir) 1000J ist, und dann eine massive ersetzen :%s/#/^V^M/g, wenn die start-of-line marker ist ein #. Da die Fortsetzung Linien wurden speziell markiert, da waren die do-weiterhin combos, dann bekommen Sie wieder.
Gewährleisten, wenn-labels und do-Etiketten getrennt sind (z.B.: schreiben Sie ein grep-pattern zu extrahieren Sie die relevanten Zeilen und schreiben Sie dann eine einfache Klammer-matching-Programm, Sie heraus zu überprüfen). Einmal getrennt, Sie können dann drehen Sie das tun, wird weiterhin in Klammern.
Drehen Sie die wenn-dann-sonst, und dowhile/enddo, Unterprogramm/endsub, etc. in Klammern. Machen Unterprogramm void, pony fake-Namen für die grundlegenden Datentypen (z.B. Boolean, Character, Integer, Real, Double, Complex, Complex).
Kommentare sind Umgerechnet über C++ //Kommentare; sowohl die Spalte 0 und ! Kommentare.
Dann können Sie re-Prototypen der Funktionen. Dies ist effektiv eine KR zu ANSI-C-Konvertierung und erfordert ein einfaches Programm zum Lesen der Funktion Kopf-und Variablen-Deklarationen zu Ihnen passen aus. Idealerweise möchten Sie vielleicht zuerst die Variablen-Deklarationen, wie man zu einer Linie. Dies erfordert auch ein Skript Bearbeiten und ein Dienstprogramm. Zum Beispiel eine "Doppel-A, B, C, ..." würde umgewandelt werden "#Doppelklicken Sie\nA\nB\n"." und dann ein Dienstprogramm so eingestellt ist, Präfix alle nicht-# Zeilen mit der letzten vorhergehenden "# line".
Parameter Aussagen bekommen, wieder zu den Typ-Deklarationen und umgewandelt in "const" - Aussagen. Spart konvertiert werden, um statische Deklarationen. Commons ich habe noch nicht herausgefunden, eine gute Möglichkeit, mit zu arbeiten.
Nun die HARTEN Teile, die als Nächstes kommen: die array-Dimensionierung, - variable in/out-Analyse (um zu bestimmen, welche Variablen übergeben werden müssen, durch einen Wert oder Verweis). Sie sollten einen C-compiler erkennt den Typ der Referenz & oder C++. Für array-redimensioning möglicherweise müssen Sie auch, gehen über zu C++, die es erlaubt [] definiert werden.
Den in-out-Analyse ist etwas, was ich noch nicht durchgearbeitet, ebenso die redimensioning. Aber bei
dieser Punkt, die Quelle ist meist in C oder C++ in diesem Stadium.
Seien Sie gewarnt: Fortran 2010allows parallele Verarbeitung, was darüber hinaus geht C und auch C++ (mit Ausnahme der Multithread-Fähigkeiten). Wenn Sie Programme haben, die diese, Dinge werden viel härter.
Wenn ich installieren musste f2c auf Windows würde ich Cygwin. Jetzt gibt es g77 rechne ich nicht viele Leute verwenden f2c mehr.
f2c
wird immer noch verwendet, wo Fortran-Compiler stehen nicht zur Verfügung, wenn der C-Pakete beinhalten Netzwerkbibliothek Quellen, etc. Es ist viel einfacher zu installieren alsg77
.Ihnen nicht wirklich klar, aber es klingt wie Sie wollen, studieren Sie den code, und um das zu tun, dass Sie wollen, konvertieren Sie es auf C oder C++. Wenn Sie möchten, um den code zu verwenden, anstatt es zu studieren, dann bin ich off-base hier, und Sie sollten für Fortran-Compiler.
Aufgeben. Sie können nicht finden, eine Möglichkeit der übersetzung von idiomatischen Fortran Sprache C oder C++. Es gibt subtile semantische Unterschiede zwischen den Sprachen, und um es zu bekommen Recht, die übersetzung Programm muss sehr präzise sein, und Konto für viele Dinge, und machen Sie obskuren Funktion Aufrufe, und das kann sehr verwirrend sein. Sie erhalten nicht lesbar C oder C++.
Stattdessen sollten Sie lernen, die entsprechende version von Fortran. Wenn Sie verstehen, C und C++, es sollte nicht schwer zu lernen. Es ist nur eine andere Sprache, und es wird nicht viel in der Art von neuen Konzepten.
Haben Sie versucht, die binäre?
gzip
undf2c
sind command-line-Anwendungen. Holen Sie sich 7zip von 7-zip.org, wenn Sie möchten, eine GUI unzip-Programm.f2c module.f
und Sie erhalten eine Dateimodule.c
im aktuellen Verzeichnis. Wenn etwas schief geht,f2c
beschweren, sonst wird es still.f2c
Benutzer-Handbuch unter netlib.org/f2c/f2c.1 und beachten Sie, dass die tatsächlich zu kompilieren, der resultierende C-code, müssen Sie dief2c.h
- Datei und eine Fortran-Laufzeit-Bibliothek.Haben Sie MS Visual Studio installiert? Wenn dem so ist, nmake ist auf der Visual Studio Kommandozeile (nicht wird die übliche Kommando-Zeile). Wenn nicht, vielleicht versuchen Sie herunterladen und installieren Sie diese?
Direkte Konvertierung zu/von FORTRAN zu C oder prozedurale version von C++ sollte nicht kompliziert sein und wird empfohlen, vor allem, weil Sie lernen, die innere Funktion von FORTRAN-Implementierung.
Automatische tools wie
f2c
produzieren chaotisch-code mit doppelten Unterstrich wie diese:__i
(ich war der Schleifenzähler-variable).