Μεταγλωττιστές Βελτιστοποίηση

Σχετικά έγγραφα
Μεταγλωττιστές Βελτιστοποίηση

να βελτιώσει βρόχους να αντικαθιστά κλήσεις σχέση κόστους υλοποίησης και ωφέλειας χρήσης

Βελτιστοποίηση Κώδικα. Γιώργος Μανής

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 12 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

Προχωρημένες έννοιες προγραμματισμού σε C

ιαφάνειες παρουσίασης #3

Αποτελέσματα προόδου

Πληροφορική 2. Αλγόριθμοι

Η γλώσσα προγραμματισμού Strange

ιαφάνειες παρουσίασης #6

ΠΡΟΤΕΙΝΟΜΕΝΑ ΘΕΜΑΤΑ ΔΟΜΗΜΕΝΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Γ ΕΠΑΛ

ιαφάνειες παρουσίασης #7

- Αναπαράσταση ακέραιας τιµής : - Εύρος ακεραίων : - Ακέραιοι τύποι: - Πράξεις µε ακεραίους (DIV - MOD)

ιαφάνειες παρουσίασης #3

Γλώσσες Προγραμματισμού Μεταγλωττιστές

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΜΟΣ Εντολές επιλογής και αποφάσεων 1 ο Φύλλο Εργασιών Εισαγωγικές ασκήσεις για την εντολή if ΑΠΑΝΤΗΣΕΙΣ

Προγραμματιστικές Τεχνικές

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Η γλώσσα προγραμματισμού EEL

Προγραμματισμός PASCAL

Μέρος 2 Κατασκευή Συντακτικού Αναλυτή

Pascal, απλοί τύποι, τελεστές και εκφράσεις

ιαφάνειες παρουσίασης #5

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 9 ο

Παράλληλη Επεξεργασία Κεφάλαιο 6 ο Σύγχρονος Παραλληλισμός

TO ΥΠΟΠΡΟΓΡΑΜΜΑ ΣΥΝΑΡΤΗΣΗ

ιαφάνειες παρουσίασης #4

Κεφάλαιο 4 Σημασιολογία μιας Απλής Προστακτικής Γλώσσας

Εισαγωγή στην Ανάλυση Αλγορίθμων (1) Διαφάνειες του Γ. Χ. Στεφανίδη

Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού

Προγραμματισμός Ι (HY120)

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

ιαφάνειες παρουσίασης #11

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ ΠΡΩΤΗ ΠΡΟΟΔΟΣ ΣΤΗΝ «ΟΡΓΑΝΩΣΗ ΚΑΙ ΣΧΕΔΙΑΣΗ Η/Y»

Ανάλυση της Ορθότητας Προγραμμάτων

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Ανάλυση της Ορθότητας Προγραμμάτων

Ανάλυση της Ορθότητας Προγραμμάτων (HR Κεφάλαιο 4)

Αντίρριο, 14/03/2017 Προδιαγραφές Εργαστηριακής Εργασίας για το μάθημα «Μεταγλωττιστές»

Μεταγλωττιστές 2019 Θέμα εργασίας

Λύσεις Σειράς Ασκήσεων 5

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 11 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

ιαφάνειες παρουσίασης #5 (β)

Γραπτές εξετάσεις στο μάθημα: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (Θ) Εισηγητής: Γεωργίου Χρήστος ΘΕΜΑΤΑ & ΑΠΑΝΤΗΣΕΙΣ. Β. Χαρακτήρας(Αλφαριθμητικά)

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Διάλεξη 6: Δείκτες και Πίνακες

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ.

Σειρά Προβλημάτων 5 Λύσεις

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

Λύσεις Σειράς Ασκήσεων 5

ιαφάνειες παρουσίασης #4

Quicksort. Πρόβλημα Ταξινόμησης. Μέθοδοι Ταξινόμησης. Συγκριτικοί Αλγόριθμοι

ΜΑΘΗΜΑ / ΤΑΞΗ : ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / ΕΠΑΛ ΣΕΙΡΑ: ΗΜΕΡΟΜΗΝΙΑ:

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ Τελικό επαναληπτικό διαγώνισμα Επιμέλεια: Δρεμούσης Παντελής

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

ιαφάνειες παρουσίασης #5

IMPLICIT NONE INTEGER :: a, b, c

εισαγωγικές έννοιες Παύλος Εφραιμίδης Δομές Δεδομένων και

Βασικοί τύποι δεδομένων (Pascal) ΕΠΑ.Λ Αλίμου Γ Πληροφορική Δομημένος Προγραμματισμός (Ε) Σχολ. Ετος Κων/νος Φλώρος

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Κανονική εξέταση, Φεβρουάριος 2005

Μορφοποίηση της εξόδου

Σκοπός. Εργαστήριο 6 Εντολές Επανάληψης

Σχολικό Βιβλίο - Κεφάλαιο 7 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ PASCAL ΠΑΡΟΥΣΙΑΣΗ 13

Δομές ελέγχου. ομαδοποίηση εντολών εκτέλεση εντολών υπό συνθήκη επανάληψη εντολών

ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ : ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΤΑΞΗ : Γ ΛΥΚΕΙΟΥ ΣΠΟΥΔΕΣ ΟΙΚΟΝΟΜΙΑΣ & ΠΛΗΡΟΦΟΡΙΚΗΣ ΔΙΑΓΩΝΙΣΜΑ ΠΕΡΙΟΔΟΥ : ΜΑΪΟΥ

Είδη εντολών. Απλές εντολές. Εντολές ελέγχου. Εκτελούν κάποια ενέργεια. Ορίζουν τον τρόπο με τον οποίο εκτελούνται άλλες εντολές

Εισαγωγή στον Προγραμματισμό

Κεφάλαιο 7: Υποπρογράμματα. Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

FORTRAN & Αντικειμενοστραφής Προγραμματισμός ΣΝΜΜ 2017

Εντολή Δεδομένα Περιεχόμενα μετά την εκτέλεση 1 read(x) 122 x= 2 read(a,b,c) a= b= c= 3 read(d,e)

1o Φροντιστήριο ΗΥ240

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

Υπολογισμός - Εντολές Ελέγχου

Η ΔΟΜΗ ΕΠΑΝΑΛΗΨΗΣ Εντολές Επανάληψης REPEAT UNTIL, FOR, WHILE

Αναφορά (1/2) Μπορούμε να ορίσουμε μια άλλη, ισοδύναμη αλλά ίσως πιο σύντομη, ονομασία για ποσότητα (μεταβλητή, σταθερή, συνάρτηση, κλπ.

Δομές ελέγχου ροής προγράμματος

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ 2014

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

add $t0,$zero, $zero I_LOOP: beq $t0,$s3, END add $t1, $zero,$zero J_LOOP: sub $t2, $s3, $t0 add $t2, $t2, $s1 int i, j, tmp; int *arr, n;

ΜΑΘΗΜΑ / ΤΑΞΗ : ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / Γ ΕΠΑΛ ΣΕΙΡΑ: ΗΜΕΡΟΜΗΝΙΑ: 27/01/2013

ΤΕΙ ΙΟΝΙΩΝ ΝΗΣΩΝ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ - ΕΙΣ

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL) (PASCAL ) Μεταβλητές- Τύποι- Τελεστές

ΚΕΦΑΛΑΙΟ 1ο 3ο. ΚΕΦΑΛΑΙΟ 5ο 6ο. ΚΕΦΑΛΑΙΟ 7ο. Δομημένος Προγραμματισμός - Γενικές Ασκήσεις Επανάληψης

ιαφάνειες παρουσίασης #2

Φροντιστήριο. Παραγωγή τελικού κώδικα. Παραγωγή τελικού κώδικα

Δομές Δεδομένων & Αλγόριθμοι

Διάλεξη 09: Αλγόριθμοι Ταξινόμησης I

Σχεδίαση και Ανάλυση Αλγορίθμων

ΑΠΑΝΤΗΣΕΙΣ. H διαδικασία ανεύρεσης λογικών λαθών περιλαμβάνει : β- Σωστό. Διαπίστωση του είδους του λάθους γ- Σωστό δ- Λάθος

Εισαγωγή στην Ανάλυση Αλγορίθμων (2-3)

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Θεωρητικό Μέρος. int rec(int n) { int n1, n2; if (n <= 5) then return n; else { n1 = rec(n-5); n2 = rec(n-3); return (n1+n2); } }

Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου. Πληροφορική II. Ενότητα 2 : Αλγόριθμοι. Δρ. Γκόγκος Χρήστος

Ανάπτυξη και Σχεδίαση Λογισμικού

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 8 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

Προγραμματιστικές Τεχνικές

Αλγόριθμοι Ταξινόμησης Μέρος 2

Transcript:

Βελτιστοποίηση (i) Μεταγλωττιστές Βελτιστοποίηση Νίκος Παπασπύρου nickie@softlab.ntua.gr Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχ. Υπολογιστών Εργαστήριο Τεχνολογίας Λογισμικού Πολυτεχνειούπολη, 15780 Ζωγράφου Μετασχηματισμός που βελτιώνει τον κώδικα σε ταχύτητα εκτέλεσης σε απαιτήσεις μνήμης και στα δύο Παραπλανητικός όρος! Θεωρητικά, ηλύσητουπροβλήματοςείναι αδύνατη Βελτιστοποίηση (ii) Κριτήρια εφαρμογής μετασχηματισμών βελτιστοποίησης διατηρείται η σημασία των προγραμμάτων κατά μέσο όρο, ο κώδικας βελτιώνεται αξίζει τον κόπο! ασύμφοροι μετασχηματισμοί για τα στάδια ανάπτυξης του προγράμματος Βελτιστοποίηση (iii) Βελτίωση στο επίπεδο του αρχικού κώδικα 2.02n 2 μsec για insertion sort 12n log(2n) μsec για quicksort για n=100,000 ηδιαφοράείναι3 τάξεις μεγέθους! δυστυχώς, ο μεταγλωττιστής γενικά δεν μπορείνααλλάζειτοναλγόριθμο Ο μεταγλωττιστής περιορίζεται σε βελτιώσεις στο επίπεδο του ενδιάμεσου και του τελικού κώδικα Βελτιστοποίηση (iv) Γιατί βελτιστοποίηση στο επίπεδο του ενδιάμεσου κώδικα; Βελτιστοποιητής ενδιάμεσου κώδικα ανάλυση ροής ελέγχου ανάλυση ροής δεδομένων βελτιστοποιητικοί μετασχηματισμοί Παράδειγμα: quicksort procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; if n <= m then return; while i <= j do while a[i] < a[(m+n) div 2] do while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then temp := a[i]; j := j-1 quicksort(a, m, j); quicksort(a, i, n) 1

Ενδιάμεσος κώδικας while i <= j do while a[i] < a[(m+n) div 2] do while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then 27: <=, i, j, 29 temp := a[i]; j := j-1 21 Ενδιάμεσος κώδικας while i <= j do while a[i] < a[(m+n) div 2] do while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then 27: <=, i, j, 29 temp := a[i]; j := j-1 21 Ανάλυση ροής ελέγχου (i) Ανάλυση ροής ελέγχου (ii) Βασική ενότητα: ακολουθία διαδοχικών τετράδων με τις εξής ιδιότητες αν υπάρχουν τετράδες άλματος (υπό συνθήκη ή χωρίς συνθήκη), αυτές βρίσκονται στο τέλος δεν υπάρχει καμία τετράδα (σε ολόκληρο τον ενδιάμεσο κώδικα) που να κάνει άλμα στο εσωτερικό της βασικής ενότητας Γράφος ροής ελέγχου οι κόμβοι είναι οι βασικές ενότητες οι ακμές δείχνουν τα άλματα (και τη διαδοχή) μεταξύ βασικών ενοτήτων 27: <=, i, j, 29 21 Ανάλυση ροής ελέγχου (iii) 27: <=, i, j, 29 21 Ανάλυση ροής ελέγχου (iv) 7: <=, i, j, 13: <, [$1], [$4], 22: >, [$6], [$9], 27: <=, i, j, 28: jump, -, -, 21 40: jump, -, -, 2

Ανάλυση ροής δεδομένων (i) 7: <=, i, j, 13: <, [$1], [$4], 22: >, [$6], [$9], 27: <=, i, j, 28: jump, -, -, 21 40: jump, -, -, Ανάλυση ροής δεδομένων (ii) 7: <=, i, j, 13: <, [$1], [$4], 22: >, [$6], [$9], 27: <=, i, j, 28: jump, -, -, 21 40: jump, -, -, Βελτιστοποιητικοί μετασχηματισμοί (i) Μετασχηματισμοί υψηλού επιπέδου αποτίμηση σταθερών εκφράσεων αλγεβρικοί μετασχηματισμοί απαλοιφή κοινών υποεκφράσεων διάδοση αντιγράφων ενοποίηση κώδικα Μετασχηματισμοί βρόχων μετακίνηση κώδικα απαλοιφή επαγωγικών μεταβλητών αναδιοργάνωση βρόχων απαλοιφή ελέγχου ορίων πίνακα Βελτιστοποιητικοί μετασχηματισμοί (ii) Μετασχηματισμοί χαμηλού επιπέδου απαλοιφή άχρηστου κώδικα ευθυγράμμιση απλοποίηση συνθηκών και αλμάτων Μετασχηματισμοί υποπρογραμμάτων ενσωμάτωση υποπρογράμματος κλήσεις ουράς και συνένωση υποπρογράμματα φύλλα Αποτίμηση σταθερών εκφράσεων Προϋπόθεση: το αποτέλεσμα που υπολογίζεται κατά τη μεταγλώττιση να ταυτίζεται με αυτό που θα υπολογιζόταν κατά την εκτέλεση const int ROWS = 100; const int COLUMNS = 50; int * p = (int *) malloc(rows * COLUMNS * sizeof(int)); ROWS * COLUMNS * sizeof(int) = 100 * 50 * 4 = 20000 Αλγεβρικοί μετασχηματισμοί (i) Προϋπόθεση: να μην προκαλείται μεταβολή στο αποτέλεσμα, ακόμα και αν εμφανιστούν εξαιρέσεις κατά την εκτέλεση των πράξεων Στις πράξεις ακεραίων, π.χ. x + 0 = x x * 0 = 0 x * 1 = x 0 + x = x 0 * x = 0 1 * x = x Εσφαλμένοι μετασχηματισμοί -(-x) x x + y - x y const int ROWS = 100; const int COLUMNS = 50; int * p = (int *) malloc(20000); 3

Αλγεβρικοί μετασχηματισμοί (ii) Στις πράξεις κινητής υποδιαστολής x * 0.0 0.0 Στις λογικές πράξεις b or true = true b and true = b b and false = false b or false = b not (not b) = b Άλλοι μετασχηματισμοί (@x)^ = x @(p^) p Απαλοιφή κοινών υποεκφράσεων (i) Προϋπόθεση: η τιμή της κοινής υποέκφρασης να μην έχει μεταβληθεί από τον προηγούμενο υπολογισμό της Προϋπόθεση: η αποτίμηση της κοινής υποέκφρασης να μην προκαλεί παρενέργειες while i <= j do while a[i] < a[(m+n) div 2] do while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then temp := a[i]; j := j-1 Απαλοιφή κοινών υποεκφράσεων (ii) 7: <=, i, j, 13: <, [$1], [$4], 22: >, [$6], [$9], [$4], 27: <=, i, j, 28: jump, -, -, 21 30: :=, [$11], [$1], -, -, temp 33: :=, [$13], [$6], -, -,[$1] [$12] [$6] 40: jump, -, -, Διάδοση αντιγράφων (i) Τετράδα αντιγραφής: :=, y, -, x Ιδέα: να χρησιμοποιείται το πρωτότυπο y αντί του αντιγράφου x Προϋπόθεση: να μην έχουν μεσολαβήσει άλλες αναθέσεις στις μεταβλητές x ή y :=, y, -, x +, x, 3, $1 :=, $1, -, z par, z, V, - call, -, -, P :=, y, -, x +, y, 3, $1 :=, $1, -, z par, $1, V, - call, -, -, P Γιατί; Επιτρέπει άλλες βελτιστοποιήσεις σε μεταγενέστερο στάδιο Διάδοση αντιγράφων (ii) Η αντίστροφη μορφή του μετασχηματισμού διάδοσης αντιγράφων προσφέρεται για το απλό σχήμα παραγωγής ενδιάμεσου κώδικα της PCL +, i, 1, $1 :=, $1, -, i +, i, 1, i Προϋπόθεση: να μη χρησιμοποιείται αλλού η μεταβλητή $1 (αυτό μπορεί να αποδειχθεί) 7: <=, i, j, 13: <, [$1], [$4], i Διάδοση αντιγράφων (iii) 22: >, [$6], [$4], 27: <=, i, j, j 28: jump, -, -, i j 40: jump, -, -, 4

Ενοποίηση κώδικα Ιδέα: μεταφορά κώδικα που εκτελείται ανεξάρτητα της εκάστοτε ροής εκτέλεσης όσο το δυνατόν νωρίτερα (αργότερα) if i > 0 then x := 2*i; s := s + x*i; i := i-1 s := 0; x := 2*i; i := i-1 x := 2*i; if i > 0 then s := s + x*i s := 0; i := i-1 Μετακίνηση κώδικα (i) Ιδέα: κώδικας που εκτελεί υπολογισμούς αναλλοίωτους κατά την εκτέλεση βρόχων μετακινείται εκτός των βρόχων Προϋπόθεση: να μην προκαλείται μεταβολή της σημασίας του προγράμματος while i <= limit-2 do s := s + a[i] - 4*n; i := i + 1 t1 := limit-2; t2 if i := <= 4*n; t1 then while t2 := i 4*n; <= t1 do while i <= t1 do s := s + a[i] - t2; s i := s i + a[i] 1 - t2; i := i + 1 7: <=, i, j, 13: <, [$1], [$4], 15: +, i, 1, i Μετακίνηση κώδικα (ii) 22: >, [$6], [$4], 27: <=, i, j, 24: -, j, 1, j 28: jump, -, -, 7: <=, i, j, 13: <, [$1], [$4], 15: +, i, 1, i Μετακίνηση κώδικα (iii) 22: >, [$6], [$4], 27: <=, i, j, 28: jump, -, -, 38: -, j, 1, j 40: jump, -, -, 24: -, j, 1, j 38: -, j, 1, j 40: jump, -, -, Απαλοιφή επαγωγικών μεταβλητών (i) Επαγωγική μεταβλητή: χρησιμοποιείται στο εσωτερικό ενός βρόχου και η τιμή της ορίζει μια αριθμητική πρόοδο Ιδέα: αν σε ένα βρόχο υπάρχουν περισσότερες επαγωγικές μεταβλητές, διατηρείταιμίακαιοι άλλες υπολογίζονται μέσω αυτής for i := 1 to n do x := x + 5 x = x 0 + 5*(i-1) Υποβιβασμός ισχύος: διατηρούμε τις μεταβλητές που υπολογίζονται ευκολότερα Απαλοιφή επαγωγικών μεταβλητών (ii) 5: 6: :=, m, n, -, ij 10: 5: 6: :=, +, m, m, n, n, -, $2 ij 10: 11: 6: :=, +, /, m, $2, n, n, -, 2, $2 j$3 10: 11: 12: +, /, array, m, $2, n, 2, a, $2 $3, $4 11: 12: 9: array, /, $2, a, 2, $3, m, $1 $4 18: 22: array, >, [$6], a, [$4], j, $6 12: 18: 9: array, a, $3, m, n, $1 $6 $4 22: 23: >, jump, [$6], -, [$4], -, 7: <=, i, $4, j, $6, 24: -, j, 1, j 27: <=, i, $4, j, $6, 24: 25: -, j, $6, 1, 4, j$6 28: jump, -, -, 13: 9: array, <, [$1], a, [$4], i, $1 13: 14: <, jump, [$1], -, [$4], -, 15: +, i, 1, i 15: 16: +, i, $1, 1, 4, i$1 38: 37: -, +, j, $1, 1, 4, j $1 40: 38: jump, -, j, -, 1, -, j 40: 39: jump, -, $6, -, 4, -, $6 40: jump, -, -, $1 = a + 4*i $6 = a + 4*j i j $1 $6 5

Αναδιοργάνωση βρόχων Απαλοιφή βρόχου: αν το σώμα είναι κενό Ξετύλιγμα βρόχου: αν είναι γνωστό (και μικρό) το πλήθος των επαναλήψεων Αντιστροφή βρόχου: while σε repeat Αποδιακλάδωση: μετακίνηση αναλλοίωτης if if x > 0 then s := s + a[i] s := s - 1 if x > 0 then s := s + a[i] s := s - 100 if x > 0 then s := s + a[i] s := s - 1 Απαλοιφή ελέγχου ορίων πίνακα Παρατήρηση: για γλώσσες που κάνουν τέτοιους ελέγχους και τους υλοποιούν με ενδιάμεσο κώδικα var a : array [1..100] of integer; a[i] for i := 2 to n do a[i] := a[i-1] + 1 i 2 i 1 i-1 1 i 100 i-1 100 1: <, i, :=, 1, 2, 9999 -, i 2: >, i, >, 100, i, n, 9999 13 3: array, <, i, a, 1, i, 9999 $1 4: >, i, 100, 9999 5: array, a, i, $1 9999: χειριστής σφάλματος 6: -, i, 1, $2 7: <, $2, 1, 9999 8: >, $2, 100, 9999 9: array, a, $2, $3 10: +, [$3], 1, [$1] 11: +, i, 1, i 12: jump, -, -, 2 13: 9999: Απαλοιφή άχρηστου κώδικα (i) Απαλοιφή άχρηστου κώδικα (ii) Απροσπέλαστος κώδικας: κώδικας που ποτέ δεν εκτελείται εντοπίζεται κατά τη διάρκεια της ανάλυσης ροής ελέγχου Άχρηστος κώδικας: ακολουθία εντολών που υπολογίζουν τιμές που δε χρησιμοποιούνται Ανάλυση χρόνου ζωής εντοπισμός μεταβλητών που περιέχουν άχρηστες τιμές γίνεται κατά τη διάρκεια της ανάλυσης ροής δεδομένων 9: array, a, m, $1 18: array, a, n, $6 7: <=, $4, $6, 13: <, [$1], [$4], 15: +, i, 1, i 16: +, $1, 4, $1 22: >, [$6], [$4], 24: -, j, 1, j 27: <=, $4, $6, 25: -, $6, 4, $6 28: jump, -, -, 37: +, $1, 4, $1 38: -, j, 1, j 39: -, $6, 4, $6 40: jump, -, -, Ευθυγράμμιση Συνένωση βασικών ενοτήτων Β i και B j όταν στο γράφο ροής ελέγχου από την Β i εξέρχεται μόνο μια ακμή και πηγαίνει στην B j στην Β j εισέρχεται μόνο μια ακμή και είναι από την B i ΟκώδικαςτωνΒ i και B j συνενώνεται Μερικές φορές απαιτεί απαλοιφή αλμάτων και αναδιάταξη περισσότερων βασικών ενοτήτων Απλοποίηση συνθηκών και αλμάτων 9: array, a, m, $1 18: array, a, n, $6 7: <=, $4, $6, 13: <, >=, [$1], [$4], 16: +, $1, 4, $1 22: >, <=, [$6], [$4], 27: <=, >=, $4, $6, BX 28: jump, -, -, BX 37: +, $1, 4, $1 39: -, $6, 4, $6 40: jump, -, -, 25: -, $6, 4, $6 Απλοποίηση συνθήκης: τετράδα 28, βλέπε 27, 7 και 8 Απλοποίηση αλμάτων: τετράδες 13, 22 και 27 6

Ενσωμάτωση υποπρογράμματος (inline expansion) function max (a, b : integer) : integer; if a >= b then result := a result := b y := max(x, 3) if x >= 3 then y := x y := 3 Κλήσεις ουράς και συνένωση (i) (tail calls, tail recursion) procedure p (x : integer); q(x+1) κλήση ουράς procedure q (y : integer); while y > 2 do r(y) όχι κλήση ουράς! function gcd (n, m : integer) : integer; if (n = 0) or (m = 0) then result := n + m if n > m then result := gcd(m, n mod m) result := gcd(n, m mod n) δύο αναδρομικές κλήσεις ουράς! Κλήσεις ουράς και συνένωση (ii) Από απλή αναδρομή σε αναδρομή ουράς if n > 1 then result := n * factorial(n-1) result := 1 if n > 1 then result := tailrec(n*prod, n-1) result := prod result := tailrec(1, n); Κλήσεις ουράς και συνένωση (iii) Απαλοιφή αναδρομής ουράς if n > 1 then result := tailrec(n*prod, n-1) result := prod result := tailrec(1, n); while n > 1 do prod := n*prod; n := n-1 result := prod result := tailrec(1, n); Κλήσεις ουράς και συνένωση (iv) Συνένωση ουράς while n > 1 do prod := n*prod; n := n-1 result := prod result := tailrec(1, n); var prod : integer; prod := 1; while n > 1 do prod := n*prod; n := n-1 result := prod 7