2016-11-10 8 views
0

Ich frage mich, gibt es eine Fähigkeit, in jeder Programmiersprache, die ich wählen kann, nur einen bestimmten Teil des Codes zu kompilieren. Siehe Beispiel unten.Selektive Kompilierung

Dies ist ein Block von Pseudo-Code ist:

function foo() { 

    if (isDebug) { 
     checkSomethingForDebugging(); 
     print(some debug info); 
    } 

    toSomeFooThings(); 
} 

Dieser Baustein für das Debuggen Zweck ist, möchte ich sie in der Produktion (auch die if-Anweisung) ignorieren.

if (isDebug) { 
    checkSomethingForDebugging(); 
    print(some debug info); 
} 

Eines, was ich tun kann, ist diese Zeilen aus kommentieren

function foo() { 

    //if (isDebug) { 
    // checkSomethingForDebugging(); 
    // print(some debug info); 
    //} 

    toSomeFooThings(); 
} 

Aber was, wenn ich Tausende von Orten wie dieses? Es wird gut sein, wenn es einen Weg gibt (eine Flagge), den ich wählen kann, um einen bestimmten Teil des Codes zu kompilieren oder nicht. Es ist wie ein debugging build. Gibt es dafür in irgendeiner Programmiersprache etwas? Ich habe online gesucht, aber kein Glück.

+0

Sie sollten Interpretationssprachen wie BASIC betrachten. Jede Zeile wird separat interpretiert (übersetzt und ausgeführt). –

+0

@ThomasMatthews Wie Python? Wie kann ich dies in einer Py-Datei erreichen? – mattsun

+0

Python wird nicht interpretiert; Es wird in Bytecode kompiliert, der dann von einer virtuellen Maschine ausgeführt wird. – chepner

Antwort

1

Die meisten Sprachen haben dies nicht, aber Sie könnten sicherlich ein Skript schreiben, das den Quellcode irgendwo in Ihrer Build/Deploy-Pipeline verarbeitet und die Debug-Teile gelöscht hat. Ein fortgeschrittener Weg wäre, den Quellcode richtig zu analysieren und die entsprechenden if Blöcke zu löschen. Für Python wäre das ziemlich einfach mit dem Modul ast oder einfach nach Zeilen suchen, die if is_debug: sagen und dann die Einrückungsebene beobachten. Für andere Sprachen ist es vielleicht schwieriger. Eine einfachere Art und Weise in Bezug auf die Vorverarbeitung Skript wäre abgrenzt Anmerkungen zu verwenden:

// DEBUGONLY 
checkSomethingForDebugging(); 
print(some debug info); 
// ENDDEBUGONLY 

In diesem Fall wird die if Anweisung optional ist abhängig davon, wie genau wollen Sie die Dinge zu tun.

+0

Ich denke, ich habe das Konzept der Vorverarbeitung gelernt, das allgemein für alle Programmiersprachen gelten kann. Vielen Dank. – mattsun

+0

Yelp! 'S Undett-Projekt (https://github.com/Yelp/undebt) könnte in dieser Bemühung von Nutzen sein. – PaulMcG

1

Nun, das hängt vom verwendeten Compiler ab. Zum Beispiel haben Sie in GCC für die Programmiersprache C eine ganze Reihe von Präprozessoranweisungen, die dafür verwendet werden könnten.

Zum Beispiel:

#ifdef DEBUG 
// Your code here... 
#endif /* DEBUG */ 

Und wenn Sie die Debug-Version kompilieren, müssen Sie nur noch einen zusätzlichen Header enthalten, die das DEBUG Makro definiert. Es ist nicht notwendig, irgendeinen Wert zu setzen, sondern nur zu definieren.

#define DEBUG 

Und das ist es.

+0

Wenn ich eine Nicht-Debug-Version kompiliere, wird dieser Teil des Codes überhaupt kompiliert? Ich frage nicht nur den Code Block in 'ifdef', sondern auch den' ifdef' Check selbst. – mattsun

+0

Die ifdef-Prüfung ist nicht Bestandteil des Programms. Der C-Compiler wird zweimal ausgeführt. Die erste führt die Präprozessoranweisungen aus. In diesem Lauf wird entschieden, ob der Code innerhalb der #ifdef-Prüfung kompiliert werden muss. Das zweite Mal wird über das Ergebnis des ersten ausgeführt. Wenn also der erste den Code ausschließt, wird er nicht in der endgültigen Binärdatei enthalten sein. –

+1

Bessere Formulierung, Javier: Compiler läuft einmal, aber es hat mehrere Stufen. – user4581301

1

Es gibt Sprachen (einschließlich C, C++ und C#), die dies mit Präprozessordirektiven wie #if tun können oder #ifdef:

#if DEBUG 
checkSomethingForDebugging(); 
print(some debug info); 
#endif 

Wenn der Code kompiliert wird, wenn das DEBUG Symbol nicht gesetzt ist, wird der Code zwischen den beiden Direktiven wird überhaupt nicht kompiliert (und muss nicht einmal ein gültiger Code sein).

Aber noch wichtiger, warum fragen Sie? Wenn Sie sich Sorgen um die Leistung machen, sind solche Überprüfungen sehr billig (da sie leicht vorhergesagt werden). Und wenn die Checks richtig geschrieben sind (z. B. wenn isDebug eine globale Konstante ist) und kompiliert werden mit einem guten Compiler, they can even be eliminated as dead code, der sie völlig frei macht.

+0

Sie haben Recht, Leistung ist mein Anliegen. Aber ich verstehe auch, dass es sehr billig ist, einen Check zu machen. – mattsun