Esiste uno strumento di refactoring C ++ funzionante?

Qualcuno conosce uno strumento di refactoring completo per C ++ che funziona in modo affidabile con basi di codice di grandi dimensioni (circa 100.000 righe)?

Ho provato tutto quello che posso trovare ancora e ancora negli ultimi anni: SlickEdit, Eclipse CDT. Non erano tutti utilizzabili.

RIASSUNTO : Ho impiegato del tempo e ho valutato “Visual Assist X” e “Refactor per C ++”. Entrambi hanno alcune caratteristiche impressionanti, ma entrambi sono tutt’altro che perfetti. L’estrazione di un grande blocco di codice in genere non viene eseguita soddisfacendo senza modifiche manuali, e quindi non ripaga.

“Visual Assist X” ha delle belle funzionalità come un completamento automatico molto più completo, ecc. Ma porta a tanto sfarfallio e rallenta molto in determinati punti.

Secondo me, quindi, la risposta è: “No, non esiste uno strumento di refactoring pronto per la produzione per C ++”

AGGIORNAMENTO Marzo 2015 Per quanto riguarda hdoghens oggi ho provato Resharper per C ++. Il suo link https://www.jetbrains.com/resharper/ non dice nulla su C ++. Ma ho trovato Resharper C ++ che è stato annunciato più di un anno fa qui:

https://www.jetbrains.com/resharper/features/cpp.html

Ho provato con VC2010 usando una base di codice di 20 MB.

Test 1: Metodo di estrazione: genera un’eccezione di Resharper. Nessun codice sorgente modificato.

Test 2: metodo di estrazione con diversa fonte: funziona bene

Test 3: modifica della firma della funzione estratta: risultati in codice C ++ rotto:

bool myclass::do_work123(int& Filled*&, long, int&) 

Forse questo è il motivo per cui C ++ non è elencato nella pagina principale.

Secondo me la risposta a questa domanda è ancora “NO” .

Trovo molto utile Visual Assist X con Visual Studio. Un’altra scelta è Refactor per C ++ .

Visual Assist e Visual Studio semplificano molto il trattamento con codebase di grandi dimensioni. L’assistenza visiva è in grado di rintracciare l’utilizzo di una class o di un membro ed è più efficace nel ridenominarlo senza falsi positivi rispetto alla ricerca e alla sostituzione.

Mi aspetto che Clang cambierà in modo significativo il panorama degli strumenti di refactoring C ++ là fuori nei prossimi due anni. È un compilatore modulare open source che espone un’API per analizzare e analizzare semanticamente il codice C ++. Gli IDE e altri strumenti saranno in grado di utilizzare questa API piuttosto che svolgere il difficile lavoro di scrittura del proprio parser e analizzatore semantico.

Google ha già creato uno strumento di refactoring su larga scala usando clang .

Mozilla ha il proprio strumento di refactoring chiamato Pork ( Wiki , Developer Wiki ). Ecco il blog dello sviluppatore di Pork. Da quello che ho letto, Pork è stato usato con successo nei refactoring di Mozilla.

Il maiale dovrebbe aiutare se vieni da * nix land, per Visual Studio consiglio anche Visual Assist.

Se stai usando emacs, prova Xrefactory . Supporta l’estrazione del metodo, la ridenominazione di classi / funzioni / variabili e l’inserimento / cancellazione / spostamento dei parametri. Ha anche un motore di completamento del codice molto buono / veloce.

Il nostro software DMS Reengineering Toolkit è un motore di trasformazione progettato per eseguire trasformazioni complesse su grandi corpi di codice, incluso C ++. È stato utilizzato per apportare modifiche affidabili su sistemi di milioni di righe di codice. Funziona usando analizzatori e trasformatori di languri accurati al compilatore.

Ha un parser C ++ completo con risoluzione del nome e del tipo, costruisce AST di codice, può applicare trasformazioni procedurali o source-to-source (con syntax di superficie C ++) per rivedere quegli alberi e rigenerare l’output compilabile con i commenti preservati. (Modifica: 1/7/2011: ora C ++ 1X nella misura in cui comprendiamo lo standard 🙂

È stato utilizzato su progetti di reingegnerizzazione su larga scala, tra cui la riprogettazione dei componenti in C ++ e il 100% delle traduzioni completamente automatizzate tra lingue diverse. Puoi leggere questo sul sito.

Il DMS viene anche utilizzato per creare strumenti di analisi delle fonti arbitrari. Gli esempi includono il rilevamento dei cloni, la copertura dei test, la differenza intelligente (comparazione delle strutture del codice sorgente e delle operazioni di modifica astratta piuttosto che le linee con inserimento e cancellazione semplici), ecc.

Quello che non è (al momento) è uno strumento di refactoring interattivo. Crediamo che per fare la maggior parte dei refactoring, è necessario un controllo approfondito e analisi dei dati. Il DMS dispone di un meccanismo generico per supportarlo e, a questo punto, i macchinari vengono implementati per C, COBOL e Java, con C ++ in linea. Questo è un lavoro difficile. Non vedrete molti seri strumenti di refactoring C ++ da nessuno fino a quando questo tipo di problema non sarà risolto bene. Per prima cosa serve un parser C ++ completo: -}

EDIT 7/5/2011: Sembra che stiamo andando a correre alla versione intertriggers. Abbiamo vinto un dipartimento di energia fase SBIR per indagare su come fare questo. Vedi http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx (Cerca Semantic Designs sotto “Texas”). Non aspettarti un risultato in fretta; questo è solo l’inizio del programma pluriennale a 3 fasi per arrivare a uno strumento.

EDIT 8/11/2011: primi progressi … ora gestiamo tutte le direttive C ++ 0x e OpenMP.

EDIT 1/4/2012: esegue l’analisi completa del stream di controllo del codice C ++.

EDIT 15/09/2014: Ora il parser e il motore di trasformazione front-end C ++ 14 sono a portata di mano. Anche rinominare abbastanza affidabile a questo punto: -}

Attualmente non posso raccomandare alcun tool di refactoring per C ++, certamente non per basi di codice di grandi dimensioni di 100k linee e oltre. Speravo che questo potesse cambiare, come l’OP, e spero che un giorno ci sarà qualcosa. Temo che il linguaggio stesso potrebbe dover cambiare in modo significativo prima di vedere degli strumenti davvero validi.

btw, SlickEdit ha abbandonato le sue funzionalità di refactoring?

Penso che il toolkit di rengineering del software DMS . È un motore di trasformazione del codice, progettato per grandi dimensioni e gestisce C ++. Non ho idea di quanto sia elegante l’uscita.

Uno sicuramente deve menzionare Klocwork come una suite di refactoring del codice commerciale. Sembra molto promettente quando si passa attraverso il video dimostrativo.

Consiglio di provare rtags se usi emacs e non l’hai ancora provato (c’è anche un pacchetto per vim disponibile). È un’applicazione client / server basata su clang che indicizza il codice C / C ++, con queste funzionalità incluse:

  • vai a definizione / dichiarazione
  • trova tutti i riferimenti, vai al prossimo / precedente
  • rinomina il simbolo
  • integrazione con “fixits” di clang

Ho deciso di provarlo dopo aver visto questo talk che ha introdotto rtags (ed emacs) per me.

(Devo dire che sono andato così lontano solo dopo che il mio QtCreator non è riuscito a rinominare correttamente alcuni simboli, il che è un ostacolo per il mio utilizzo di questo grande IDE per ora)

Oltre a ciò che è supportato da rtags, ho anche bisogno di alcune funzionalità aggiuntive, tra cui:

  • creare la definizione della funzione / prototipo
  • funzione di estrazione
  • creare metodi getter / setter

Per questi, consiglio di utilizzare un pacchetto semantico refactor per emacs (non sono sicuro se ci sono alternative per vim)

In generale, gli strumenti basati sui clang sembrano molto promettenti. Se sei interessato a maggiori informazioni sugli strumenti di clang per il refactoring in C ++, incluso per progetti con codebase di grandi dimensioni, ci sono alcuni grandi discorsi di Chandler Carruth.

Se si utilizza Visual C ++ (Express Edition è gratuito), è ansible utilizzare Visual Assist da http://www.wholetomato.com (collegamento alle funzionalità di refactoring C ++).

Ha un periodo di prova di 30 giorni e abbiamo trovato che sia più veloce e più ricco di funzionalità che l’intellisense integrato nel prodotto Visual C ++ stesso.

Se stai cercando di riprogettare il tuo codice base: MOOSE. Ma questa è una vasta collezione di strumenti di analisi e reingegnerizzazione, non un editore.

È ora disponibile un’estensione di refactoring C ++ per Visual Studio 2013 di Microsoft: http://visualstudiogallery.msdn.microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194

CLion sembra molto promettente.

Dichiarazione di non responsabilità: non l’ho ancora provato poiché ho bisogno di convertire i miei progetti in formato CMake per poterlo utilizzare.

Ti consiglio di provare Lattix . Consente di analizzare grandi codebase C / C ++ per scoprire l’architettura, identificare dipendenze problematiche e riprogettare il codice per migliorare la modularità e ridurre il debito tecnico. Lattix fornisce anche una serie di algoritmi per aiutare nel processo di refactoring. Questi algoritmi aiutano a capire come spostare elementi da una parte della gerarchia a un’altra, per interrompere i cicli e spostare i sottosistemi in modo che l’accoppiamento e la coesione dei sottosistemi possano essere migliorati. Ecco i risultati di Lattix che analizza il Kernel Android (1,6 milioni di LOC di C / C ++). Full disclosure: lavoro per Lattix

Definetely Resharper Ultimate è la strada da percorrere. Felicità garantita 🙂

Nella versione Beta a partire da marzo 2015.

Ho trovato il seguente plug-in per Visual Studio 2013: Refactoring di Visual C ++ di Microsoft.

È solo un semplice strumento di rinomina ma funziona perfettamente. Aggiunge il seguente menu contestuale dopo aver fatto clic con il pulsante destro del mouse su un simbolo:

inserisci la descrizione dell'immagine qui