Convertendo fonte C para C ++

Como você iria converter um codebase C razoavelmente grande (> 300K), bastante maduro em C ++?

O tipo de C que tenho em mente é dividido em arquivos que correspondem aproximadamente a módulos (isto é, menos granulares do que uma decomposição típica baseada em classe OO), usando funções e dados privados de linkage interno e linkage externo para funções e dados públicos. Variáveis ​​globais são usadas extensivamente para comunicação entre os módulos. Existe um pacote de testes de integração muito extenso, mas nenhum teste de nível de unidade (ou seja, módulo).

Eu tenho em mente uma estratégia geral:

Compile tudo no subconjunto C de C ++ e trabalhe assim.Converta módulos em classes grandes, de modo que todas as referências cruzadas tenham um escopo definido por um nome de classe, mas deixem todas as funções e dados como membros estáticos e façam isso funcionar.Converta classes enormes em instâncias com construtores apropriados e referências cruzadas inicializadas; substituir os acessos de membros estáticos por acessos indiretos, conforme apropriado; e fazer isso funcionar.Agora, abordar o projeto como um aplicativo OO mal-fatorado e escrever testes de unidade onde dependências são tratáveis ​​e decompor em classes separadas onde eles não são; O objetivo aqui seria passar de um programa de trabalho para outro em cada transformação.

Obviamente, isso seria um pouco de trabalho. Há algum estudo de caso / histórias de guerra por aí nesse tipo de tradução? Estratégias alternativas? Outro conselho útil?

Nota 1: o programa é um compilador, e provavelmente milhões de outros programas confiam em seu comportamento não mudar, então reescrever por atacado não é uma opção.

Nota 2: a fonte tem quase 20 anos, e talvez tenha 30% de churn de código (linhas modificadas + adicionado / linhas totais anteriores) por ano. É fortemente mantido e estendido, em outras palavras. Assim, um dos objetivos seria aumentar a manutenção.

[Para o bem da questão, suponha que a tradução paraC ++ é obrigatório, e que deixando em C énão uma opção. O ponto de adicionar essa condição é eliminar as respostas "deixar em C".]

questionAnswers(11)

yourAnswerToTheQuestion