Βελτιστοποίηση του ενδιάμεσου κώδικα

Η βελτιστοποίηση του κώδικα μετασχηματίζει τον κώδικα σε μια μορφή που παράγει τα ίδια αποτελέσματα με τον αρχικά αλλά βελτιωμένα κάποια κριτήρια απόδοσης. Τέτοια κριτήρια μπορεί να είναι: Η βελτιστοποίηση μπορεί να απαλλάξει τον προγραμματιστή από αντιπαραγωγικές αλλαγές του κώδικα που έχουν ως στόχο να ικανοποιήσουν τα κριτήρια αυτά και να του επιτρέψει να συγκεντρωθεί σε άλλα ποιοτικά στοιχεία του παραγόμενου κώδικα όπως την ορθότητα, την ασφάλεια, τη διαθεσιμότητα, τη συντηρησιμότητα, και τη μεταφερσιμότητα. Συχνά βελτιστοποιήσεις που γίνονται από τον προγραμματιστή έρχονται σε αντίθεση με τα παραπάνω ποιοτικά στοιχεία.

Ορισμένες κοινές βελτιστοποιήσεις είναι οι παρακάτω:

Απαλοιφή κοινών υποεκφράσεων
Εκφράσεις με κοινά στοιχεία υπολογίζονται μόνο μια φορά. Για παράδειγμα η ακολουθία:
x = b / c;
y = 42 + b / c;
μετασχηματίζεται στην ακολουθία:
x = b / c;
y = 42 + x;
Μετακίνηση κώδικα βρόχων (loop code motion)
Εκφράσεις που δεν αλλάζουν μέσα σε ένα βρόχο μετακινούνται έξω από αυτόν. Για παράδειγμα η ακολουθία:
{
        int a, b, z;

        a = 8; b = 4;
        for (i = 0; i < 10; i++) {
                z = a / b;
                printf("%d\n", z);
        }
}
μετασχηματίζεται στην ακολουθία:
{
        int a, b, z;

        a = 8; b = 4;
        z = a / b;
        for (i = 0; i < 10; i++) {
                printf("%d\n", z);
        }
}
Απαλοιφή άχρηστου κώδικα
Κώδικας που δεν εκτελείται ποτέ απαλείφεται. Για παράδειγμα η ακολουθία:
{
        int a, q;

        q = 48;
        return (q);
        a = q / 2;
}
μετασχηματίζεται στην ακολουθία:
{
        int a, q;

        q = 48;
        return (q);
}
Απαλοιφή κλήσεων σε συναρτήσεις (function inlining)
Κλήσεις σε συναρτήσεις μετασχηματίζονται σε απευθείας χρήση του αντίστοιχου κώδικα. Για παράδειγμα η ακολουθία:
int
sqr(int a)
{
        return (a * a);
}

main()
{
        printf("%d\n", sqr(12));
}
μετασχηματίζεται στην ακολουθία:
main()
{
        printf("%d\n", (12 * 12));
}
Απαλοιφή αναδρομής από το τέλος συνάρτησης (tail recursion elimination)
Αναδρομή στο τέλος μιας συνάρτησης μετασχηματίζεται σε βρόχο. Για παράδειγμα η ακολουθία:
foo()
{
        printf("foo\n");
        foo();
}
μετασχηματίζεται στην ακολουθία:
foo()
{
        for (;;)
                printf("foo\n";);
}