2012-06-06 9 views
13

So che le asserzioni possono essere abilitate/disabilitate in fase di esecuzione per il debug e la produzione, rispettivamente. Tuttavia ho trovato che le asserzioni aumentano anche la dimensione del file binario generato (circa 100-200 byte nell'esempio sotto).Compilazione senza asserzioni

In C e C++, possiamo farlo in fase di compilazione con #define NDEBUG prima dello #include <assert.h>.

Esiste un modo per il compilatore Java di eseguire automaticamente questa operazione? Mi piacerebbe lasciarli nel codice sorgente per scopi di debug in seguito. Ma non voglio nemmeno che il binario risultante sia più grande del necessario (abbiamo un limite di dimensione come requisito di progettazione).

codice C:

//#define NDEBUG 
#include <assert.h> 

int main(void) { 
    assert(0); // +200 bytes without NDEBUG, 0 with NDEBUG 
    return 0; 
} 

codice Java:.

public class Test { 
    public static void main(String[] args) { 
     assert(System.nanoTime()==0); // increases binary size by about 200 bytes 
    } 
} 

In risposta alla bn di risposta:

public class Test2 { 
    public static final boolean assertions = false; 

    public static void main(String[] args) { 
     if(assertions) { 
      assert(System.nanoTime()==0); 
     } 
    } 
} 

EDIT: In realtà, sembra per me che questa abilitazione/disabilitazione è una compilazione più utile funzione rispetto al tempo di esecuzione. Voglio dire, quanti utenti finali li abiliteranno? Per quanto riguarda un programmatore durante il processo di debug, sarà probabilmente lui a ricompilare il codice comunque.

+0

Ciò non dimostra che ogni affermazione costa 200 byte, solo quella. – EJP

+1

@EJP: di sicuro.Quello che intendevo era che c'è un aumento non trascurabile causato da affermazioni nel loro complesso. L'importo preciso dipende certamente dalla complessità della dichiarazione. – tskuzzy

+1

Se ti preoccupi di queste cose, hai una lingua sbagliata. – lvella

risposta

2

personalmente non effettuare le seguenti operazioni a causa della complessità aggiunta al codice sorgente ma javac generato lo stesso codice intermedio esatta per main nei seguenti due frammenti:

condizionale afferma

class C { 
    public final static boolean assertions = false; 

    public static void main(String[] args) { 
     if(assertions) { 
      assert(System.nanoTime()==0); 
     } 
    } 
} 

non afferma

class C { 
    public static void main(String[] args) { 
    } 
} 

codice compilato

public static void main(java.lang.String[]); 
    Code: 
     0: return   
    LineNumberTable: 
     line 3: 0 

EDIT

In realtà, mi sembra che questo abilitazione/disabilitazione è una caratteristica fase di compilazione più utile di tempo gestito. Voglio dire, quanti utenti finali saranno abilitati da ?

Non gli utenti finali che li abilitano, è l'assistenza clienti che indica all'utente finale di abilitarli. Mi piacerebbe che fossero abilitati, non disabilitati, per impostazione predefinita.

+0

Perfetto grazie! Sono d'accordo che non è una soluzione molto elegante ma risponde alla mia domanda. – tskuzzy

+0

Sembra che se si inserisca la variabile 'public final boolean static assertions = false;' in una classe separata, in modo che si possa usare l'assert su tutto il codice e semplicemente cambiare la flag in un punto, sarà necessario ricompilare l'intero fonte se questo è cambiato (e ciò è desiderabile, dal momento che vuoi la variabile cancellata dal tuo codice compilato). – lvella

+0

@Ivello perché il compilatore incorpora le finali statiche pubbliche. –

4

Questo non è possibile come una fase di compilazione incorporata. Puoi comunque farlo aggiungendo blocchi condizionali attorno alle tue asserzioni.

Vedere l'articolo "Removing all Trace of Assertions from Class Files" per ulteriori informazioni.

+0

Sembra una buona idea, ma in realtà ha aumentato il binario ancora di più di altri 50 byte. – tskuzzy

+0

Questo non ha molto senso dal momento che il compilatore dovrebbe rimuovere del tutto le istruzioni poiché è ora irraggiungibile. – Robin

+2

@Robin se OP usa 'final' ridurrà la dimensione. –