Compiler

Welcher Rückgabewert und welcher verbleibende Code der obigen Funktion ist richtig, wenn Konstantenpropagierung, Constant Folding und Entfernung von totem Code gründlich angewendet werden?

int h(void) {
    int a = 5;
    int b = a * 3;
    int c = b - a;
    if (c > 100) return 0;
    return c * 2;
}
  1. ASie gibt stets 20 zurück, und die Prüfung der if-Anweisung entfällt
  2. BSie gibt stets 0 zurück, und return c * 2 entfällt
  3. CAlle Berechnungen bleiben erhalten, und zur Laufzeit wird 20 oder 0 zurückgegeben
Antwort und Erläuterung anzeigen

Antwort: A. Sie gibt stets 20 zurück, und die Prüfung der if-Anweisung entfällt

Durch Propagieren von a = 5 lässt sich b = 5 * 3 = 15 und c = 15 − 5 = 10 zusammenfassen. Die Bedingung c > 100 ist dann 10 > 100 und somit stets falsch, sodass der Zweig return 0 nie ausgeführt wird und als toter Code entfernt wird. Das verbleibende return c * 2 ergibt 10 × 2 = 20, und die Funktion besteht nur noch aus return 20;. Da die Bedingung stets falsch ist, wird nie 0 zurückgegeben, und zur Laufzeit sind weder Berechnung noch Prüfung nötig.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Compiler

  1. Welche Aufgabe hat die lexikalische Analyse eines Compilers?
  2. Was leistet die Syntaxanalyse (Parsing) eines Compilers?
  3. Welches ist das am besten geeignete Beispiel für einen Fehler, den die semantische Analyse des Compilers findet?
  4. Welche Eigenschaft des abstrakten Syntaxbaums (AST) ist richtig?
  5. Was ist der Hauptvorteil einer Zwischendarstellung (IR), die im Compiler intern weder von der Quellsprache noch von der CPU abhängt?

Vergleiche zu diesem Thema