Konwertowanie źródła C na C ++

W jaki sposób zmieniłbyś dość duży (> 300K), dość dojrzały kod C na C ++?

Rodzaj C, który mam na myśli, jest podzielony na pliki mniej więcej odpowiadające modułom (tj. Mniej szczegółowym niż typowa dekompozycja oparta na klasach OO), z wykorzystaniem wewnętrznego połączenia zamiast prywatnych funkcji i danych oraz zewnętrznego powiązania dla publicznych funkcji i danych. Zmienne globalne są szeroko stosowane do komunikacji między modułami. Dostępny jest bardzo rozbudowany pakiet testów integracyjnych, ale nie ma testów poziomu jednostek (tj. Modułów).

Mam na myśli ogólną strategię:

Skompiluj wszystko w podzestawie C C ++ i uruchom to.Konwertuj moduły na wielkie klasy, tak aby wszystkie odsyłacze były określane nazwą klasy, ale pozostawiając wszystkie funkcje i dane jako elementy statyczne i działaj.Konwertuj ogromne klasy na instancje za pomocą odpowiednich konstruktorów i zainicjowanych odsyłaczy; zastąp dostęp do statycznych elementów pośrednimi dostępami, stosownie do potrzeb; i to działa.Teraz podejdź do projektu jako źle opracowanej aplikacji OO i napisz testy jednostkowe, w których zależności są traktowalne, i rozłóż na oddzielne klasy, w których nie są; celem byłoby przejście od jednego programu roboczego do drugiego przy każdej transformacji.

Oczywiście byłoby to sporo pracy. Czy są jakieś studia przypadków / historie wojenne na temat tego rodzaju tłumaczeń? Alternatywne strategie? Inne przydatne porady?

Uwaga 1: program jest kompilatorem i prawdopodobnie miliony innych programów polega na tym, że jego zachowanie się nie zmienia, więc hurtowe przepisywanie nie jest opcją.

Uwaga 2: źródło ma prawie 20 lat i ma prawdopodobnie 30% odchylenia kodu (linie zmodyfikowane + dodane / poprzednie linie całkowite) rocznie. Innymi słowy jest mocno utrzymany i rozszerzony. Zatem jednym z celów byłoby zwiększenie trwałości.

[Ze względu na pytanie załóżmy, że tłumaczenie naC ++ jest obowiązkowe, a pozostawienie go w C jestnie opcja. Celem dodania tego warunku jest wyeliminowanie odpowiedzi „zostaw to w C”.]

questionAnswers(11)

yourAnswerToTheQuestion