Come estrarre il percorso del codice attivo da un algoritmo complesso

6

Sono rimasto perplesso ultimamente da un'idea intrigante.

Mi chiedo se esiste un metodo (noto) per estrarre il codice sorgente eseguito da un grande algoritmo complesso. Proverò ad elaborare questa domanda:

Scenario: esiste questo complesso algoritmo in cui una grande quantità di persone ha lavorato per molti anni. L'algoritmo crea le descrizioni delle misure per un dispositivo di misurazione complesso.

L'input per l'algoritmo è un ampio set di parametri di input, chiamiamola la ricetta. Sulla base di questa ricetta, l'algoritmo viene eseguito e la ricetta determina quali funzioni, cicli e costruzioni if-then-else vengono seguite all'interno dell'algoritmo. Quando l'algoritmo è finito, un insieme di parametri di misurazione calcolati formerà l'output. E con questi parametri di misurazione dell'uscita il dispositivo può eseguire la sua misura.

Ora, c'è un problema. Poiché l'algoritmo è diventato così complesso e ampio nel tempo, è molto difficile trovare la propria strada nell'algoritmo quando si desidera aggiungere nuove funzionalità per le ricette. Fondamentalmente una persona vuole modificare solo le funzioni ei blocchi di codice che sono interessati dalla sua ricetta, ma deve scavare nell'intero algoritmo e analizzare il codice per vedere quale codice è rilevante per la sua ricetta, e solo dopo quello elaborare nuove funzionalità può essere aggiunto nel posto giusto. Anche per semplici aggiunte, le persone tendono a perdersi nell'enorme quantità di codice complesso.

Soluzione: estrai il percorso del codice attivo? Ho fatto un brainstorming su questo problema, e penso che sarebbe bello se ci fosse un modo per elaborare l'algoritmo con i parametri di input (la ricetta) e per estrarre solo le funzioni attive e i blocchi di codice in un nuovo set di file sorgente o struttura del codice. In realtà sto parlando di estrarre codice sorgente reale qui.

Quando il codice attivo viene estratto e isolato, questo si tradurrà in un sottoinsieme di codice sorgente che è solo una frazione della struttura del codice sorgente originale, e sarà molto più facile per la persona analizzare il codice, capire il codice e apportare le sue modifiche. Alla fine le modifiche potrebbero essere unite al codice sorgente originale dell'algoritmo, o forse il codice sorgente estratto modificato può anche essere eseguito da solo, come se fosse una versione "lite" dell'algoritmo originale.

Informazioni aggiuntive: stiamo parlando di un algoritmo con codice C e C ++, circa 200 file e forse 100K linee di codice. Il codice è compilato e compilato con un ambiente di sviluppo personalizzato basato su Visual Studio.

Quindi ...: non so davvero se questa idea sia semplicemente ingenua e stupida, o se sia fattibile con la giusta quantità di ingegneria del software. Posso immaginare che ci siano state situazioni più simili nel mondo dell'ingegneria del software, ma non lo so.

Ho una certa esperienza con l'ingegneria del software, ma sicuramente non al livello di progettazione di sistemi complessi e di grandi dimensioni.

Apprezzerei qualsiasi tipo di risposta, suggerimento o commento.

Grazie in anticipo!

    
posta user3417322 13.03.2014 - 22:04
fonte

3 risposte

1

Penso che dipenda da cosa vuoi ottenere ... Vuoi migliorare il codice? parallelizzare il codice? puliscilo? capisci?

Oltre all'ottimo commento dato da @Calphool, quello che ho fatto in casi simili (ma non con il codice di linee 100K per essere onesti) è questo:

  • Cerca chi ha scritto il codice. O l'ha usato. Chiedendo loro cosa dovevo sapere, questo ti risparmia un sacco di tempo. Questo può sembrare stupido, ma non lo è.

  • Ho creato un grafico delle dipendenze. Dai un'occhiata a questo per un esempio.

  • A seconda di cosa devi fare, puoi misurare il tempo di esecuzione di alcune (o tutte) funzioni.

  • Inizia a giocarci ... ma con strumenti moderni, come git. Se possibile, inizia ad aggiungere alcuni test.

Se vuoi vedere quali funzioni vengono chiamate, puoi semplicemente stampare le funzioni chiamate (dai un'occhiata a questa domanda ). È possibile aggiungere un printf a ciascuna funzione utilizzando uno script, ma non penso che sia una buona idea. Inoltre, devi pensare a come passerai attraverso l'output generato.

Dopo aver saputo cosa vuoi e prima di implementare le mie implementazioni, cerco di isolare la parte su cui ho bisogno di lavorare. Significa, pulisco un po 'il codice, metto un file diverso se necessario, lo compilo e lo collaudo. Solo allora procedo a modificare effettivamente la funzionalità di aggiunta del codice o qualsiasi altra cosa debba essere fatta. Ciò può anche includere il codice di porta per utilizzare strumenti di costruzione moderni, se necessario.

I miei due centesimi.

    
risposta data 04.06.2015 - 11:34
fonte
1

Il problema sembra essere simile alla scrittura di casi di test con una buona copertura del codice Esistono strumenti per la generazione automatica di casi di test basati sull'analisi del codice.

Questo è un link a un documento su uno strumento per i programmi C:

carta Klee (anche come pdf )

Lo strumento genera dati di input di test che dovrebbero coprire diversi rami nel codice.

Non ho mai lavorato con questo, ma forse può essere modificato per fare ciò che stai cercando. Non sono sicuro di come si adatti a Visual Studio ...

    
risposta data 07.07.2015 - 18:58
fonte
0

Il taglio dei programmi dinamico è un modo possibile, anche se non necessariamente pratico con 100k di codici.

Ad esempio, se il tuo codice originale è:

if (recipe.has_option_x) {
   foo();
} else {
   bar();
}

E se tagli il tuo programma supponendo che recipe.has_option_x sia false , puoi ridurre la dimensione del codice effettivamente chiamato a bar() . Come al solito, i limiti teorici impediranno a uno strumento di sapere sempre con certezza se un ramo del tuo programma può essere rimosso in sicurezza.

La pagina di Wikipedia ha alcuni link a strumenti esistenti. Vedi anche Affinamento dinamico in C / C ++ .

    
risposta data 04.06.2015 - 16:19
fonte

Leggi altre domande sui tag