Un binario include metodi che non vengono chiamati nel codice sorgente?

1

[Titolo potenzialmente fuorviante, ma non sono sicuro di come sia il modo migliore per esprimerlo.]

Domanda teorica su compilatori e progettazione del linguaggio.

Dire che sto ri-implementando un metodo in una base di codice. Invece di rimuovere o commentare il metodo che sto re-implementando, lo lascio dove è, per scopi di riferimento e di test, e rimuovo solo tutte le chiamate ad esso. Qualcosa di simile al seguente (in pseudo codice stile C):

public void aMethodToCallFooVariants()
{
   // oldFoo();
   newFoo();
}

private void oldFoo ()
{
   // Some code here that's not very good
}

private void newFoo ()
{
   // Some better code here
}

newFoo è chiamato dal metodo che originariamente chiamava oldFoo, il che significa che oldFoo non è più chiamato da nessuna parte nel codice sorgente, ma è ancora presente nell'elenco.

I compilatori sono abbastanza intelligenti in modo tale che quando eseguo il mio script di compilazione, il codice per oldFoo non è incluso nel file binario compilato, o oldFoo sarà ancora incluso ma non chiamato da nessuna parte? Posso capire se il metodo pubblico sarà ancora incluso, potrebbe essere chiamato da un codice esterno al binario compilato (specialmente se è compilato come una libreria). Ma il metodo privato sarebbe ancora compilato nel binario?

    
posta Jamie Taylor 23.09.2013 - 11:43
fonte

2 risposte

3

Dipende dal compilatore e dal linker e dal modo in cui funziona la eliminazione del codice morto . È importante notare, tuttavia, che in un linguaggio completo di turing (con la riflessione) è indecidibile se una certa parte di codice viene mai raggiunta ( problema di interruzione difficile)

In altre parole, se si utilizza un controllo del codice sorgente, premere il pulsante Elimina e lasciare un messaggio nel commit e / o menzionare nella documentazione del nuovo metodo.

Puoi utilizzare un periodo di transizione in cui contrassegni il metodo deprecato e fai in modo che il compilatore emetta un avviso ogni volta il vecchio la versione è utilizzata.

    
risposta data 23.09.2013 - 11:56
fonte
2

Con i compilatori C e C ++, la risposta è sì - quando un'unità di codice è compilata in codice oggetto (dal compilatore) tutte le funzioni sono elencate esplicitamente. Il linker accetta ciascuno di questi file oggetto e risolve i riferimenti alle funzioni e tutte le funzioni rimaste dopo questo passaggio di collegamento, possono essere scartate. Questo è particolarmente utile per le librerie statiche in cui si desidera includere solo una piccola parte della lib, il resto viene ignorato e non collegato al binario finale.

(ovviamente questo non accade per le librerie dinamiche, in questo caso gli stub presenti nella libreria di importazione non sono collegati in).

    
risposta data 23.09.2013 - 16:48
fonte

Leggi altre domande sui tag