Esiste uno strumento di refactoring C ++ funzionante? [chiuso]


161

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 ciò che posso trovare più e più volte negli ultimi anni: SlickEdit, Eclipse CDT. Non erano affatto utilizzabili.

SOMMARIO : Ho preso tempo e valutato "Visual Assist X" e "Refactor for C ++". Entrambi hanno alcune caratteristiche impressionanti, ma entrambi sono tutt'altro che perfetti. L'estrazione di un grande blocco di codice di solito non è soddisfacente senza modifiche manuali e quindi non paga.

"Visual Assist X" ha delle belle funzioni come il completamento automatico molto più completo ecc. Ma porta a così tanto sfarfallio e rallenta molto in determinati punti.

A mio avviso quindi la risposta è: "No, non esiste uno strumento di refactoring pronto per la produzione per C ++"

AGGIORNAMENTO Marzo 2015 Per quanto riguarda la risposta di hdoghmens oggi ho provato Resharper per C ++. Il suo link https://www.jetbrains.com/resharper/ non dice nulla sul 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 Resharper. Nessun codice sorgente modificato.

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

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

bool myclass::do_work123(<unknown long Color>int& Filled*&, long, int&)

Forse è per questo che C ++ non è elencato nella pagina principale.

Secondo me la risposta a questa domanda è ancora "NO" .


11
Preferito questo. Il problema con C ++ è la sua sintassi molto complessa e sensibile al contesto. Senza analizzare effettivamente la fonte completa, non puoi essere sicuro di cosa significhi un identificatore.
DevSolar,


4
Eclipse funziona davvero abbastanza bene, devi solo consentirgli di usare più memoria modificando eclipse.ini
n0rd

3
Se stai ancora monitorando gli strumenti di refactoring per C ++, tieni presente che noi di JetBrains stiamo attualmente lavorando sul supporto C ++ in ReSharper e un IDE C ++ multipiattaforma separato
Jura Gorohovsky,

1
@RED SOFT ADAIR sei famoso. Dai un'occhiata a
George C.

Risposte:


38

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


8
Sfortunatamente, Refactor per C ++ non funziona bene (se non del tutto) con basi di codice di grandi dimensioni.
Daniel Rose,

1
Cosa succede specificamente con Refactor per C ++ e basi di codice di grandi dimensioni?
Ira Baxter,

2
@IraBaxter È semplicemente rotto. Le opzioni di refactoring non vengono visualizzate o non vengono completate. Ci sono strani messaggi di errore o nessuno.
Daniel Rose,

4
Refactor per C ++ non funziona bene anche per piccole codebase, è rotto e inutilizzabile.
kovarex,

3
@Nils: puoi fornire un esempio specifico di ciò che non capisce?
Ira Baxter,

41

Visual Assist e Visual Studio semplificano notevolmente la gestione di basi di codice di grandi dimensioni. Visual assist è bravo a rintracciare come viene utilizzata una classe o un membro ed è più efficace nel rinominarlo senza falsi positivi rispetto alla ricerca e alla sostituzione.


23

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

Google ha già realizzato uno strumento di refactoring su larga scala utilizzando clang .


2
Ma c'è qualche risultato che un semplice mortale esterno a Google potrebbe usare?
Jan Hudec,

1
@JanHudec: Dai un'occhiata al tutorial collegato da qui: commenti.gmane.org/gmane.comp.compilers.clang.devel/23203
HighCommander4

17

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

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


9

Il nostro DMS Reengineering Toolkit è un motore di trasformazione progettato per eseguire trasformazioni complesse su grandi quantità di codice, incluso C ++. È stato utilizzato per apportare modifiche affidabili su sistemi di milioni di righe di codice. Funziona utilizzando analizzatori e trasformatori di lingue accurati dal compilatore.

Ha un parser C ++ completo con risoluzione di nome e tipo, crea AST di codice, può applicare trasformazioni procedurali o sorgente-sorgente (con sintassi della superficie C ++) per rivedere quegli alberi e rigenerare l'output compilabile con commenti conservati. (Modifica: 7/07/2011: ora fa C ++ 1X nella misura in cui comprendiamo lo standard :)

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

DMS viene anche utilizzato per creare strumenti di analisi della fonte arbitrari. Gli esempi includono il rilevamento di cloni, la copertura dei test, la differenza intelligente (confronto delle strutture del codice sorgente e operazioni di modifica astratte anziché linee con semplice inserimento ed eliminazione), ecc.

Ciò che non è (attualmente) è uno strumento di refactoring interattivo. Riteniamo che per eseguire bene la maggior parte dei refactoring, siano necessari un controllo approfondito e analisi del flusso di dati. DMS ha macchine generiche per supportare questo, e quel macchinario è implementato per C, COBOL e Java a questo punto, con C ++ che sarà il prossimo in linea. Questo è un lavoro duro. Non vedrai molti strumenti di refactoring C ++ serio da nessuno fino a quando questo tipo di problema non sarà risolto bene. Per prima cosa hai bisogno di un parser C ++ completo: -}

EDIT 7/5/2011: Sembra che stiamo andando a correre nella versione interattiva. Abbiamo vinto un SBIR del Dipartimento dell'Energia di Fase I per indagare su come farlo. Vedi http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx (Cerca disegni semantici 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 del flusso di controllo completo del codice C ++.

EDIT 15/9/2014: ora disponi di un motore di analisi / trasformazione front-end C ++ 14 ben in mano. Anche rinominare abbastanza affidabile a questo punto: -}


Non sembra esserci un collegamento per valutare questo strumento nella pagina di download semanticdesigns.com/Products/RegisterEval.html Al momento sono disponibili una versione di prova e prezzi per VS2010 o VS2008?
SmacL

Per uno strumento di refactoring, "non aspettarti un risultato in fretta". Il nostro compito di ricerca e sviluppo di fase I è terminato e stiamo richiedendo fondi per la fase II. Per discutere di DMS e mezzi per valutarlo, contattare l'azienda. Non è il tipo di cose che "scarichi per valutare", allo stesso modo in cui Enterprise Oracle non è un elemento di download.
Ira Baxter l'

... DMS è in grado di trasformare VS2008 / VS2010, ma non come uno strumento interattivo, e ci sono limitazioni rispetto alle direttive del preprocessore. (La buona notizia è che pensiamo di aver risolto un grosso problema con questi, e lo applicheremo in un programma di ricerca e sviluppo di Fase II).
Ira Baxter l'

Grazie per il feedback, ma non sembra il tipo di strumento che sto cercando. Non ho bisogno di interattivo, solo qualcosa che può eseguire trasformazioni ragionevolmente semplici su una base di codice di grandi dimensioni, senza costare un braccio e una gamba, ad esempio cambiando il numero di parametri che una chiamata accetta, cambiando un parametro del puntatore in un riferimento. VisualAssist è vicino ma deve solo andare un po 'oltre.
SmacL

3
... lo scopo di DMS è abilitare la codifica e l'applicazione priva di errori di trasformazioni di codice, siano esse "refactoring" o "no". Sì, è difficile e non ci siamo ancora. Siamo più vicini a IMNSHO di qualsiasi altro strumento che ho visto per C ++ e non c'è nulla di sbagliato nelle nostre basi di strumenti. Ciò che resta sono i cattivi problemi con il preprocessore, la scala del codice e lo sforzo di codificare la semantica del C ++ in modo adeguato per consentire tali trasformazioni. E sarò il primo a dire che questo è un GRANDE progetto.
Ira Baxter,

8

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


6

Attualmente non posso raccomandare alcuno strumento di refactoring per C ++, certamente non per basi di codice di grandi dimensioni di 100k righe e superiori. Spero che questo cambi, come l'OP, e spero che un giorno ci sarà qualcosa. Temo che la lingua stessa potrebbe dover cambiare in modo significativo prima di vedere strumenti davvero validi.

a proposito, SlickEdit ha abbandonato le sue funzioni di refactoring?


Il linguaggio è cambiato in modo significativo, con il rilascio dello standard C ++ 2011. Le ulteriori complicazioni rendono il problema più difficile, non più semplice, perché tutti gli utenti vorranno tutte le funzionalità linguistiche avanzate e una capacità di refactoring: - {
Ira Baxter

2
Avendo recentemente letto le capacità di Slickedit, sembra che determini la definizione corrispondente all'uso di un nome con metodi euristici. Non esegue una ricerca del nome C ++ "corretta". Ciò significa che non puoi fidarti delle sue trasformazioni per essere corrette. Se non ti dispiace ispezionare il suo lavoro, questo potrebbe essere OK per te. Su pacchetti software davvero grandi, probabilmente non va bene. La mia opinione.
Ira Baxter,

4

Consiglio di provare rtags se usi emacs e non l'hai ancora provato (esiste anche un pacchetto per vim). È 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
  • rinominare il simbolo
  • integrazione con i "fixits" di clang

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

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

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

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

Per questi, raccomando di usare un pacchetto semantic-refactor per emacs (non sono sicuro se ci sono alternative per vim)

In generale, gli strumenti basati su clang sembrano molto promettenti. Se siete interessati ad avere maggiori informazioni sugli strumenti Clang per C ++ refactoring, tra cui per i progetti con grande base di codice, ci sono alcuni grandi interventi di Chandler Carruth.


3

Il toolkit di reingegnerizzazione del software DMS fa questo, credo. È un motore di trasformazione del codice, progettato per grandi dimensioni e gestisce C ++. Non ho idea di quanto sia elegante il risultato.


1
DMS è stato utilizzato per automatizzare la ricerca di grandi corpi di codice C ++. Vedi Akers, R., Baxter, I., Mehlich, M., Ellis, B., Luecke, K., Case Study: reingegnerizzazione di modelli di componenti C ++ tramite trasformazione automatica dei programmi, tecnologia informatica e software 49 (3): 275 -291 2007. Disponibile dall'editore
Ira Baxter,

Non so cosa intendi per "output elegante". L'output che ottieni da DMS dipende chiaramente da cosa lo dai e da quali trasformazioni applichi. Se la trasformazione non tocca parte del codice, quella parte del codice è elegante o meno come era in primo luogo. Se tocca il codice, l'eleganza è determinata da quanto siano intelligenti le trasformazioni, proprio come sarebbero le modifiche manuali di un programmatore. Non penso che si tratti di eleganza, ma la formattazione del risultato può essere la stampa "fedeltà" (il formato originale) o uno stile di stampa piuttosto definito.
Ira Baxter,

2

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


2

Il problema sono i modelli C ++. A partire dal 2019 non sono a conoscenza di alcuno strumento di refactoring che supporti i modelli C ++. Ho provato VS2019, VisualAssist, Clion, QtCreator.

Prendi in considerazione un esempio:

#include <iostream>

struct foo { void print() {} };
struct bar { void print() {} };

template <typename T>
void call_print(T&& v) { v.print(); }

void print() {}

int main()
{
    call_print(foo{});
    call_print(bar{});
    return 0;
}

Se eseguo Rinomina refactoring su foo::print, bar::printdovrebbe anche essere rinominato automaticamente. Perché sono collegati tramite call_printistanze del modello di funzione.


1

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

Ha un periodo di prova di 30 giorni e lo abbiamo trovato più veloce e più ricco di funzionalità dell'intellisense integrato nel prodotto Visual C ++ stesso.


2
Non pensavo che potessi usare i plugin con l'edizione express
Yacoby,

3
Ho sicuramente provato a installare VA con VS C ++ express in passato e non ha funzionato.
Quamrana,

Non è possibile installare i plug-in di Visual Studio in modalità isolata (tutte le versioni Express eseguono l'IDE in modalità isolata). Se sei uno studente, puoi scaricare le versioni complete di Visual Studio da DreamSpark o MSDNAA.
Billy ONeal,

1

Se stai cercando di riprogettare la tua base di codice: MOOSE. Ma questa è una vasta raccolta di strumenti di analisi e reingegnerizzazione, non un editor.




1

CLion sembra molto promettente.

Dichiarazione di non responsabilità: non l'ho ancora provato, in quanto ho bisogno di convertire i miei progetti in formato CMake per poterlo utilizzare.


1

Ti consiglio di provare Lattix . Consente di analizzare grandi basi di codice 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 ti aiutano a capire come spostare elementi da una parte della gerarchia a un'altra, interrompere i cicli e spostare sottosistemi in modo da migliorare l'accoppiamento e la coesione dei sottosistemi. Ecco i risultati di Lattix che analizza il kernel Android (1,6 milioni di LOC di C / C ++). Informativa completa: lavoro per Lattix


1

Mi dispiace trovare questa domanda solo così tardi. I miei studenti e assistenti lavorano al refactoring C ++ dal 2006. La maggior parte delle infrastrutture di refactoring dei CDT è stata costruita dal mio team all'istituto di software IFS. da un paio d'anni forniamo a Cevelop la nostra versione di CDT con supporto per refactoring di modernizzazione del codice C ++ ecc. Cevelop può funzionare con basi di codice di grandi dimensioni, se lo spazio di lavoro è impostato correttamente. Disponibile gratuitamente su https://cevelop.com


Molto interessante. L'ho scaricato e non si avvia. Perfavore guarda github.com/Cevelop/Issues/issues/84
RED SOFT ADAIR

0

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

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

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.