Dead code elimination

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Die Seiten Redundanter Code und Dead code elimination überschneiden sich thematisch. Hilf mit, die Artikel besser voneinander abzugrenzen oder zusammenzuführen (→ Anleitung). Beteilige dich dazu an der betreffenden Redundanzdiskussion. Bitte entferne diesen Baustein erst nach vollständiger Abarbeitung der Redundanz und vergiss nicht, den betreffenden Eintrag auf der Redundanzdiskussionsseite mit {{Erledigt|1=~~~~}} zu markieren. Sebastian.Dietrich 19:32, 1. Apr. 2013 (CEST)

Dead code elimination (englisch für Entfernung von totem Code) ist ein Verfahren aus dem Bereich des Compilerbaus, das Anweisungen entfernt, die keinen Einfluss auf den Programmablauf haben. Dadurch verkürzt sich die Laufzeit und das Programm wird kleiner.

Beispiel[Bearbeiten]

Toter Code ist Programmcode, der – unabhängig davon, ob er ausgeführt wird – keinen Einfluss auf den Programmablauf hat. Dazu gehört auch unerreichbarer Code und nicht weiter verwendete Variablenzuweisungen (englisch dead store).

Gegeben sei der folgende Beispielcode in Java:

public int foo(int a, int b)
{
    int c = a + b;    // dead store
    if (true)         // dead code
        c = c;
 
    return (a + b);
 
    a += 3;           // unerreichbarer Code
    return a;
}
  • Die Variable c wird zwar berechnet und zugewiesen, später aber nicht weiter verwendet.
  • Die Bedingung if (1) wird immer zu wahr ausgewertet werden und c ist bereits c.
  • Die Anweisungen a += 3 und return a werden nicht mehr ausgeführt, da bereits zuvor die Funktion verlassen wurde.

Nach der Eliminierung des toten Codes verbleibt nur noch der folgende Funktionsrumpf:

public int foo(int a, int b)
{
    return (a + b);
}

Entstehen von totem Code[Bearbeiten]

Absichtlich[Bearbeiten]

Oft wird absichtlich toter Code erzeugt, um Ausgaben während der Programmentwicklung später zu deaktivieren:

int main()
{
#define DEBUG  0
    int a = 3;
    // ...
    if (DEBUG)
        printf("%d\n", a);
    // ....
    return a;
}

Während der Entwicklungsphase kann hier der Wert von a ausgegeben werden, falls das Makro DEBUG auf 1 (wahr) gesetzt wird. Wenn diese Kontrollausgabe nicht mehr benötigt wird, setzt man den Wert auf 0 und der Compiler (genauer: Präprozessor) erkennt und entfernt das nun tote Stück Code.

Durch den Compiler[Bearbeiten]

Der Code auch kann durch Transformationen, die der Compiler durchführt, unerreichbar werden, wie z. B. die sogenannte common subexpression elimination (Entfernen gemeinsamer Teilausdrücke).

In der Praxis hat die Ausgereiftheit der Analyse einen entscheidenden Einfluss auf den Anteil des gefundenen unerreichbaren Codes. Z. B. kann durch constant folding und einfache Flussanalyse gezeigt werden, dass der Funktionsaufruf xyz() im folgenden Beispiel unerreichbar ist:

int i = 2 + 1;
 
if (i == 4)
   xyz();

Einer vollständigen Analyse sind jedoch theoretische Grenzen gesetzt, die eng mit der Entscheidbarkeitsproblematik der theoretischen Informatik verbunden sind.

Öffentliche Wahrnehmung[Bearbeiten]

Im November 2010 veröffentlichte Microsoft eine neue Version des Internet Explorers, der scheinbar alle anderen Browser in puncto JavaScript-Geschwindigkeit weit hinter sich ließ. Es stellte sich jedoch schon bald heraus, dass Microsoft eine spezielle Implementation der dead code elimination nutzte, um sich an die Spitze eines bekannten JavaScript-Benchmarks zu katapultieren. In anderen Benchmarks waren die Resultate eher im Mittelfeld.[1]

Einzelnachweise[Bearbeiten]

  1. Herbert Braun: Browser-Debatte: Hat Microsoft geschummelt? Heise Online. 18. November 2010.