Ich habe kürzlich mehrere Jahre damit verbracht, Legacy-FORTRAN in Java zu übersetzen. Davor habe ich FORTRAN in C übersetzt (für das ich ein einfaches Übersetzungstool geschrieben habe). Nach all dieser Arbeit frage ich mich, wie viele andere ähnliche Übersetzungen von Sprache zu Sprache machen und ob eine automatisierte Vorgehensweise von Vorteil wäre.
Ich kenne F2C, For_C, F2J und andere sowie einige der Übersetzungsseiten, aber keine scheint so erfolgreich zu sein. Nachdem ich die Ausgabe von For_C gesehen habe, kann ich sehen, warum es gerade nicht abgehoben hat. Obwohl es technisch korrekt ist, ist es sehr schwierig zu warten.
Also, ich denke, ich frage mich, ob es ein Tool gibt, das mehr wartbaren, besser verständlichen Code produziert als der Code, den ich gesehen habe, würden Entwickler ihn benutzen? Oder sind Entwickler so abgestumpft, wie viele Posts den generierten Code anzeigen und nicht verwenden möchten, da er niemals so gut sein könnte wie ihr manuell übersetzter Code?
Kurz gesagt, nein. Offensichtlich sind es manchmal Zeitbeschränkungen, aber ...
Selten wird Code, der in einer Sprache geschrieben ist, gut in eine andere übersetzt - jede Sprache hat bestimmte Möglichkeiten, Dinge zu tun, die besser zu den verfügbaren Konstrukten / allgemeinen Bibliotheken / etc passen.
Betrachten wir zum Beispiel ein in C geschriebenes Programm im Vergleich zu etwas in Python geschriebenem - sicherlich können Sie for-Schleifen schreiben und Dinge in Python genauso einfach durchgehen wie in C, aber es ist viel einfacher, Listen-Comprehensions zu verwenden und Nutzen Sie die Funktionen der Sprache.
Ich wäre überrascht, wenn ich ein Beispiel für ein vernünftig großes Programm in einer beliebigen Sprache sehe, das in jedem anderen in "korrekten", gut zu wartenden Code übersetzt werden kann.
Dies wurde in Umwandlung von Fortran 77-Code nach C ++ bereits einigermaßen berücksichtigt , aber ich werde es hier versuchen.
Ich denke, es wird viel Zeit verschwendet, um älteren Code in neue Sprachen zu übersetzen. Es braucht eine phänomenale Menge an Zeit und Energie zu tun, und Sie führen neue Bugs ein, wenn Sie es tun.
Joel erwähnt, warum das Neuschreiben von Grund auf neu ist eine schreckliche Idee in Dinge, die Sie nie tun sollten Teil I und obwohl Mir ist klar, dass das Übersetzen von etwas in eine neue Sprache nicht dasselbe ist wie das Neuschreiben, ich behaupte, dass es nahe genug ist:
Automatisierte Übersetzungswerkzeuge sind nicht wunderbar, weil Sie nichts Wartungsfähiges erhalten. Sie müssen ziemlich genau den alten Code kennen, um den neuen Code zu verstehen, und was haben Sie dann gewonnen?
Um etwas manuell zu portieren, müssen Sie wissen, wie der Code funktioniert, um es gut zu machen. Das Umschreiben von Code wird selten von den ursprünglichen Entwicklern vorgenommen, so dass Sie selten Leute bekommen, die alles verstehen, was beim Umschreiben geschieht. Ich arbeitete in einem Unternehmen, in dem ein Outsourcing-Team eingestellt wurde, um ein komplettes Backend von ColdFusion auf JSP zu übersetzen. Dieses Projekt wurde immer wieder verzögert und verzögert, da das Port-Team den Code überhaupt nicht kannte. Unsere Jungs haben ihr Design nie gemocht und sie haben es nie richtig verstanden, also gab es eine konstante Wiederholung, da alle die Probleme ausarbeiteten, die im ursprünglichen Code gelöst wurden. Dann dauerte die Portierung selbst für immer.
Sie müssen sich auch mit wirklich technischen Inkonsistenzen zwischen Sprachen auskennen. Leute, die zwei Sprachen sehr gut kennen, sind selten.
Speziell für Fortran arbeite ich jetzt an einem Ort, an dem es Millionen von Zeilen alten Fortran-Codes gibt, und niemand wird es umschreiben. Es ist einfach zu viel Risiko. Alte Käfer müßten neu repariert werden, und Hunderte von Mannjahren gingen in die Berechnung ein. Niemand möchte diese Art von Bugs einführen, und es ist wahrscheinlich absolut unsicher, es zu tun.
Anstatt zu portieren, haben wir hybride Codes. Schließlich können Sie Fortran und C / C ++ verknüpfen, und wenn Sie eine C-Schnittstelle für Ihren Fortran-Code erstellen, können Sie sie von Java aus aufrufen. Moderne Codes hier haben C / C ++ - Komponenten, die Aufrufe in alte Fortran-Routinen machen, und wenn Sie dies tun, haben Sie den zusätzlichen Vorteil, dass Fortran-Compiler schnell schreien, so dass der alte Code so schnell läuft wie eh und je.
Ich denke, der beste Weg, dies zu bewältigen, ist, jede Portierung vorzunehmen, die Sie inkrementell durchführen müssen. Erstellen Sie eine leichtgewichtige Benutzeroberfläche um Ihren alten Fortran-Code und rufen Sie die Teile auf, die Sie benötigen, aber portieren Sie die Dinge nur so, wie Sie sie im neuen Teil benötigen. Es gibt auch Komponenten-Frameworks für die Integration von mehrsprachigen Anwendungen, die dies vereinfachen können, aber Sie können Umwandlung von Fortran 77-Code in C ++ für mehr dazu.
Da die Programmierung schwierig ist, kann kein solches Werkzeug wirklich existieren.
Wenn es einfach wäre, eine Sprache in eine andere zu ändern, wäre die Idee des "Compilers" müßig. Sie würden einfach die Sprache, die Sie mögen, in die Sprache der Hardware abbilden, drücken Sie die Taste und fertig.
Es ist jedoch nie so einfach. Jede VM, jede Sprache und jede API-Bibliothek fügt Nuancen hinzu, die nicht automatisiert werden können.
"Ich kann sehen, warum es gerade nicht abgenommen hat. Obwohl es technisch korrekt ist, ist es sehr schwierig zu warten."
Korrigieren Sie sowohl für F2C als auch für Fortran die Sprache zu bearbeiten. Der von den meisten Compilern generierte Objektcode kann nicht einfach von Personen gelesen werden. Entweder ist es grob oder es ist hoch optimiert. Wie auch immer, es sieht nicht so aus, als ob ein Experte in der Assemblersprache für diese Hardware schreiben würde.
Wenn nur das Kompilieren auf einige XSLT-ähnliche Transformationen reduziert werden könnte, die die Klarheit der alten Sprache in der neuen Sprache bewahrt hätten. Wenn es nur einige universelle Lingua Franca des Rechnens gäbe, wäre das der Rosetta-Stein der Programmierung.
Bis jemand das Lingua Franca des Rechnens erfindet, wird jeder Sprachübersetzungsjob hart sein und zu Code führen, der in der neuen Sprache "schwer zu pflegen" ist.
Ich habe f2c verwendet, und ich stimme dem zu, der es stattdessen cc2fc nennen wollte. Es ist keine Möglichkeit, Fortran in etwas zu verwandeln, das vage als C verwendbar ist. Es ist ein Weg, einen C-Compiler zu nehmen und einen Fortran-Compiler daraus zu machen.
Es hat gut funktioniert, diesen Fortran-Code zu verwenden und ihn (über C) in eine Macintosh-Bibliothek umzuwandeln, die ich von Macintosh Common Lisp aus aufrufen konnte. Das waren die Tage.
Tags und Links translation