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:

  1. Kompilieren alles, was in C++'s C Teilmenge und dass die Arbeit.
  2. 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.
  3. 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.
  4. 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

Schreibe einen Kommentar