Konvertieren von C-Quelle nach C ++
Wie würden Sie gehen über das konvertieren von einer relativ großen (>300 K), ziemlich ausgereift C-Codebasis in C++?
Der Art von C die ich im Auge habe ist aufgeteilt in Dateien entspricht etwa Module (d.h. weniger granular als eine typische OO-Klasse-basierte ZERLEGUNG), verwenden interne Verlinkung statt private Funktionen und Daten, und externe Verknüpfung für öffentlichen Funktionen und Daten. Globale Variablen werden verwendet ausgiebig für die Kommunikation zwischen den Modulen. Es ist eine sehr umfangreiche integration test suite zur Verfügung, aber keine Einheit (z.B. Modul) level-tests.
Habe ich im Hinterkopf, eine Allgemeine Strategie:
- Kompilieren alles, was in C++'s C Teilmenge und dass die Arbeit.
- Konvertieren-Module in großen Klassen, so dass alle Querverweise stammen aus dem Bereich der name einer Klasse, aber verlassen Sie alle Funktionen und Daten als statische Elemente, und dass die Arbeit.
- Konvertieren riesige Klassen in Instanzen mit entsprechenden Konstruktoren und initialisiert Querverweise; ersetzen Sie statische member-Zugriffe mit indirekten Zugriffe als angemessen; und, dass die Arbeit.
- Nun, der Ansatz, den das Projekt als eine schlecht ausgearbeitete OO-Anwendung, und schreiben unit-tests, wo die Abhängigkeiten sind lenkbar, und zerlegen Sie in separaten Klassen, wo Sie nicht sind; das Ziel hier sein würde, um von einem Arbeits-Programm zu einem anderen zu jeder transformation.
Offensichtlich, das wäre ziemlich viel Arbeit. Gibt es Fallstudien /Krieg Geschichten gibt, die auf diese Art der übersetzung? Alternative Strategien? Andere nützliche Ratschläge?
Hinweis 1: das Programm ist ein compiler, und wahrscheinlich Millionen andere Programme verlassen sich auf Ihr Verhalten nicht ändern, also Großhandel umschreiben ist ziemlich viel nicht eine option.
Hinweis 2: die Quelle ist fast 20 Jahre alt und hat vielleicht 30% code churn (Zeilen geändert + Hinzugefügt /bisherige Summe Zeilen) pro Jahr. Es ist stark gepflegt und erweitert, in anderen Worten. Also, eines der Ziele zu verbessern mantainability.
[Wegen der Frage davon aus, dass die übersetzung in C++ obligatorisch ist, und dass Sie verlassen in C ist nicht eine option. Der Punkt, der das hinzufügen dieser Bedingung ist, um Unkraut aus den "lassen Sie es in C" Antworten.]
InformationsquelleAutor der Frage Barry Kelly | 2008-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die gerade erst auf so ziemlich das gleiche vor ein paar Monaten (auf einem zehn-Jahr-alten kommerzielles Projekt, ursprünglich geschrieben, mit "C++ ist nichts anderes als C mit smart
struct
s" Philosophie), würde ich empfehlen die Verwendung der gleichen Strategie, die Sie verwenden würden, um zu Essen ein Elefant: nehmen Sie einen Bissen zu einer Zeit. 🙂So viel wie möglich, es aufgeteilt in Etappen, die getan werden kann mit minimalen Auswirkungen auf die anderen Teile. Aufbau einer Fassade, wie Federico Ramponi vorgeschlagen, ist ein guter Anfang-wenn alles, was hat ein C++ Fassade und kommuniziert über Sie, Sie können ändern Sie die Innenteile der Module mit ziemlicher Sicherheit, dass Sie nicht auf irgendetwas außerhalb von Ihnen.
Hatten wir bereits eine teilweise C++ - interface-system (wegen früherer kleiner refactoring-Aufwand), dieser Ansatz war nicht schwierig in unserem Fall. Einmal hatten wir alles, was die Kommunikation als C++ - Objekte (das dauerte ein paar Wochen, arbeiten auf einem völlig separaten source-code der Niederlassung und Integration alle änderungen in den Hauptzweig, wie Sie genehmigt wurden), war es sehr selten, dass wir nicht kompilieren ein Total funktionierende version, bevor wir uns für den Tag verlassen.
Die Umstellung ist noch nicht fertig, doch-haben wir angehalten, zweimal für Zwischenversionen (es soll ein Punkt-release alle paar Wochen), aber es ist gut auf dem Weg, und kein Kunde hat sich beschwert über irgendwelche Probleme. Unsere QA-Leute haben nur ein problem, dass ich mich erinnere, auch. 🙂
InformationsquelleAutor der Antwort Head Geek
Was:
Warum ist die "übersetzung nach C++ zwingend erforderlich"? Sie können wickeln Sie den C-code, ohne die Schmerzen der Umwandlung in riesigen Klassen und so weiter.
InformationsquelleAutor der Antwort Federico A. Ramponi
Ihre Anwendung hat viele Leute, die daran arbeiten, und ein Bedürfnis nach nicht-werden-kaputt.
Wenn Sie ernst mit der groß angelegten Umwandlung zu ein OO-Stil, was
Sie brauchen, ist massive Transformations-Werkzeuge automatisieren die Arbeit.
Die grundlegende Idee ist, bezeichnen Gruppen von Daten wie Klassen, und dann
Holen Sie sich das tool zum umgestalten des Codes zu bewegen, die Daten in Klassen,
verschieben von Funktionen auf nur die Daten in diesen Klassen,
und überarbeiten Sie alle Zugriffe auf die Daten, um Anrufe auf die Klassen.
Können Sie eine automatisierte preanalysis zu bilden Statistik-Cluster, einige Ideen zu bekommen,
aber müssen Sie noch eine Anwendung bewusst Ingenieur, zu entscheiden, was
Daten, die Elemente, die gruppiert werden sollen.
Ein tool, das dazu in der Lage ist, diese Aufgabe ist unsere DMS Software Reengineering
Toolkit.
DMS hat eine starke C-Parser für das Lesen Ihres Codes, erfasst der C-code
als compiler abstract syntax trees, (und im Gegensatz zu einem herkömmlichen compiler)
können compute-flow-Analysen in Ihrer gesamten 300K SLOC.
DMS hat eine C++ - front-end kann verwendet werden, als "zurück" end;
schreibt man Transformationen, die Karte C-syntax C++ - syntax.
Einer großen C++ - reengineering Aufgabe, auf einem großen Avionik-system gibt
irgendeine Idee, was Sie mit der DMS für diese Art von Aktivität ist wie.
Siehe technische Papiere an
http://www.semdesigns.com/Products/DMS/DMSToolkit.html,
speziell
Re-engineering von C++ - Komponente-Modelle Über Automatische Programm-Transformation
Dieser Prozess ist nicht für schwache Nerven. Aber als jemand
das würde überlegen, manuelle refactoring einer großen Anwendung
ist schon nicht Angst vor harter Arbeit.
Ja, ich bin mit der Gesellschaft verbunden, als dessen Chefarchitekt.
InformationsquelleAutor der Antwort Ira Baxter
Ich würde schreiben C++ Klassen, die über die C-Schnittstelle. Nicht berühren, der C-code verringert die chance vermasselt und beschleunigen den Prozess deutlich.
Sobald Sie Ihre C++ - Schnittstelle; dann ist es eine triviale Aufgabe, kopieren+einfügen den code in Ihre Klassen. Wie Sie bereits erwähnt - in diesem Schritt ist es wichtig zu tun unit-Tests.
InformationsquelleAutor der Antwort nlaq
GCC ist derzeit in midtransition zu C++ von C. begannen Sie durch verschieben alles in die gemeinsame Teilmenge von C und C++, offensichtlich. Dabei haben Sie Hinzugefügt Warnungen GCC-für alles, was Sie fanden, zu finden unter
-Wc++-compat
. Das sollte man auf dem ersten Teil Ihrer Reise.Für die letzten Teile, wenn Sie tatsächlich alles haben, was das kompilieren mit einem C++ - compiler, würde ich den Fokus auf das ersetzen die Dinge, die idiomatischen C++ - Pendants. Zum Beispiel, wenn Sie mit Listen, maps, sets, bitvectors, hashtables, usw., definiert mit C-Makros, werden Sie wahrscheinlich gewinnen viel, indem Sie in C++. Ebenfalls mit OO, du wirst wahrscheinlich feststellen, Vorteile wo Sie bereits mit einem C OO idiom (wie struct inheritence), und wo C++ leisten, mehr Klarheit und bessere Kontrolle über Ihren code.
InformationsquelleAutor der Antwort Paul Biggar
Ihre Liste sieht okay aus, außer ich würde vorschlagen, die überprüfung der test-suite ersten und zu versuchen, so eng wie möglich, bevor Sie irgendeine Codierung.
InformationsquelleAutor der Antwort Paul Nathan
Let ' s werfen eine blöde Idee:
InformationsquelleAutor der Antwort Federico A. Ramponi
Wahrscheinlich zwei Dinge zu beachten, außerdem, wie Sie starten wollen, sind auf das, was Sie wollen Fokusund wo Sie wollen, um stop.
Du feststellen, dass es eine große code-churn, kann dies ein Schlüssel zum Fokus deine Bemühungen. Ich schlage vor, Sie Holen die Teile des Codes, in dem eine Menge von Wartung erforderlich ist, wird die ausgereifte/stabile Teile sind offenbar funktioniert gut genug, so ist es besser, Sie zu verlassen, wie Sie sind, außer wahrscheinlich für einige window-dressing mit Fassaden etc.
Wo Sie wollen zu stoppen, hängt davon ab, was der Grund ist für den Wunsch zum konvertieren in C++. Das kann wohl kaum ein Ziel an sich. Wenn es aufgrund von einigen 3rd-party-Abhängigkeiten, Ihre Bemühungen konzentrieren sich auf die Schnittstelle der Komponente.
Die software, die ich arbeiten auf eine riesige, alte code-Basis, die hat 'konvertiert' von C auf C++ Jahren jetzt. Ich glaube, es war, weil die GUI konvertiert Qt. Auch jetzt ist es noch meist aussieht wie ein C-Programm mit Klassen. Brechen Sie die Abhängigkeiten, verursacht durch die öffentlichen Daten der Mitglieder, und die Umgestaltung der großen Klassen mit prozeduralen monster Methoden in kleinere Methoden und Klassen nie wirklich aus, ich denke, aus folgenden Gründen:
NB. Ich nehme an, Sie wissen, die "Working effectively with Legacy code" - Buch?
InformationsquelleAutor der Antwort andreas buykx
Bemerken Sie, dass Ihr Werkzeug ist ein compiler, und: "Eigentlich, pattern-matching, nicht nur Typ-matching, in dem multiple dispatch noch besser wäre".
Möchten Sie vielleicht einen Blick auf maketea. Es bietet pattern-matching für ASTs, sowie der AST-definition von einer abstrakten Grammatik, und die Besucher, tranformers, etc.
InformationsquelleAutor der Antwort Paul Biggar
Wenn Sie eine kleine oder akademischen Projekt (sagen wir, weniger als 10.000 Zeilen), ein umschreiben ist wahrscheinlich die beste option. Sie können Faktors, wie Sie wollen, und es nicht zuviel Zeit in Anspruch nehmen.
Wenn Sie ein real-Welt-Anwendung, ich würde vorschlagen, sich es zu kompilieren als C++ (was normalerweise bedeutet, in Erster Linie die Festsetzung-up-Funktion, Prototypen und dergleichen), dann die Umgestaltung und OO-Verpackung. Natürlich, ich don ' T abonnieren, der Philosophie, der code muss OO strukturiert, um zu akzeptablen C++ - code. Ich würde tun, eine Stück-für-Stück-Konvertierung -, fortschreibungs-und Umgestaltung, wie Sie benötigen (für die Funktionalität oder für die Einbindung von unit-Tests).
InformationsquelleAutor der Antwort Nick
Hier ist, was ich tun würde:
InformationsquelleAutor der Antwort Sridhar Iyer