Преобразование источника C в C ++ - PullRequest
41 голосов
/ 14 октября 2008

Как бы вы конвертировали достаточно большую (> 300 КБ), достаточно зрелую кодовую базу C в C ++?

Тип CI, который имеется в виду, разбивается на файлы, примерно соответствующие модулям (т.е. менее детализированные, чем типичная декомпозиция на основе классов ОО), используя внутреннюю связь вместо частных функций и данных и внешнюю связь для открытых функций и данных , Глобальные переменные широко используются для связи между модулями. Доступен очень обширный набор тестов интеграции, но нет тестов уровня юнитов (т.е. модулей).

Я имею в виду общую стратегию:

  1. Скомпилируйте все в подмножестве C C и получите это работающим.
  2. Преобразуйте модули в огромные классы, чтобы все перекрестные ссылки ограничивались именем класса, но оставляли все функции и данные в качестве статических членов, и работали.
  3. Преобразование огромных классов в экземпляры с помощью соответствующих конструкторов и инициализированных перекрестных ссылок; при необходимости замените статический доступ к элементу косвенным доступом; и заставить это работать.
  4. Теперь, подойдите к проекту как к нецензурному OO-приложению, напишите модульные тесты, в которых можно отслеживать зависимости, и разложите на отдельные классы, где их нет; цель здесь - переходить от одной рабочей программы к другой при каждом преобразовании.

Очевидно, это будет довольно много работы. Существуют ли какие-либо тематические исследования / военные истории о таком переводе? Альтернативные стратегии? Другие полезные советы?

Примечание 1: программа является компилятором, и, вероятно, миллионы других программ полагаются на то, что ее поведение не меняется, поэтому массовая перезапись практически невозможна.

Примечание 2: источнику почти 20 лет, и, возможно, 30% оттока кода (измененные строки + добавленные / предыдущие общие строки) в год. Другими словами, он сильно поддерживается и расширяется. Таким образом, одной из целей будет повышение управляемости.

[Ради вопроса, предположим, что перевод на C ++ является обязательным, и что оставить его на C - это , а не вариант. Смысл добавления этого условия состоит в том, чтобы отсеять ответы "оставь это в C".]

Ответы [ 11 ]

1 голос
/ 14 октября 2008

Если у вас небольшой или академический проект (скажем, менее 10000 строк), перезапись, вероятно, ваш лучший вариант. Вы можете учесть это так, как хотите, и это не займет много времени.

Если у вас есть реальное приложение, я бы посоветовал его скомпилировать как C ++ (что обычно подразумевает прежде всего исправление прототипов функций и т. П.), А затем поработать над рефакторингом и переносом ОО. Конечно, я не поддерживаю философию, согласно которой код должен быть ОО-структурированным, чтобы быть приемлемым кодом C ++. Я бы сделал пошаговое преобразование, переписывание и рефакторинг по мере необходимости (для функциональности или для включения модульного тестирования).

...