Преобразование источника C в C ++
Как бы вы пошли на преобразование достаточно большой (>300K), достаточно зрелая кодовая база C для C ++?
Тип C, который я имею в виду, разбивается на файлы, примерно соответствующие модулям (то есть менее детализированные, чем типичная декомпозиция на основе классов ОО), используя внутреннюю связь вместо частных функций и данных и внешнюю связь для открытых функций и данных. Глобальные переменные широко используются для связи между модулями. Существует очень обширный набор тестов интеграции, но нет тестов уровня юнитов (то есть модулей).
Я имею в виду общую стратегию:
Скомпилируйте все в C ++ 'S подмножество и получить, что работает.Преобразуйте модули в огромные классы, чтобы все перекрестные ссылки были ограничены именем класса, но все функции и данные оставались бы статическими членами, и это работает.Преобразуйте огромные классы в экземпляры с соответствующими конструкторами и инициализированными перекрестными ссылками; при необходимости замените статический доступ к элементу косвенным доступом; и заставить это работать.Теперь подойдите к проекту как к нецензурному OO-приложению и напишите модульные тесты, в которых можно отслеживать зависимости, и разложите на отдельные классы, где их нет; цель здесь - переходить от одной рабочей программы к другой при каждом преобразовании.Очевидно, это будет довольно много работы. Существуют ли какие-либо тематические исследования / военные истории о таком переводе? Альтернативные стратегии? Другие полезные советы?
Примечание 1: программа является компилятором, и, вероятно, миллионы других программ полагаются на то, что ее поведение не меняется, поэтому массовое переписывание практически невозможно.
Примечание 2: источнику почти 20 лет, и, возможно, 30% оттока кода (измененные строки + добавленные / предыдущие общие строки) в год. Другими словами, он сильно поддерживается и расширяется. Таким образом, одной из целей будет повышение управляемости.
[Ради вопроса, предположим, что перевод наC ++ является обязательным, и что оставить его в Cне опция. Смысл добавления этого условия состоит в том, чтобы отсеять "оставь это в С " ответы.]