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

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

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

Transcript

1 Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Παραδείγματα Ενοτήτων 7-9 Ενότητα 7: Ενδιάμεσος κώδικας Άσκηση 7-1: Θεωρήστε τη γλώσσα προγραμματισμού C με τη γνωστή γραμματική και σημασιολογία, καθώς και το παρακάτω πρόγραμμα αυτής: int x,z; void A (int * i) { static int x = 0; x = x + *i; *i = z + x; } void main() { int y = 0; x = z = 1; A(&x); if (x > y) A(&z); else { int j = x; A(&j); z = j; } } Να δώσετε μια μορφή ενδιάμεσου κώδικα σε μορφή αφηρημένου συντακτικού δέντρου για το παραπάνω πρόγραμμα. Συγκεκριμένα, δώστε (α) τον πίνακα δέσμευσης μεταβλητών για κάθε μονάδα του προγράμματος, και (β) το αντίστοιχο δέντρο ενδιάμεσου κώδικα, αν υπάρχει. Σε κάθε πίνακα δέσμευσης αποθηκεύονται οι θέσεις των μεταβλητών στο εγγράφημα δραστηριοποίησης ή στο χώρο στατικών δεδομένων, οι βασικοί τύποι αυτών και πιθανά οι αρχικές τους τιμές. Κάθε εμφάνιση μεταβλητής σε ένα δέντρο συνοδεύεται από την ένδειξη του πίνακα στον οποίο αυτή δεσμεύεται και τον αντίστοιχο δείκτη σε αυτόν. Απάντηση Σε ένα πρόγραμμα της γλώσσας C όλες οι εντολές βρίσκονται μέσα σε συναρτήσεις, συμπεριλαμβανομένης της συνάρτησης του κυρίως προγράμματος που έχει το όνομα main. Όλες οι συναρτήσεις δηλώνονται στο ίδιο επίπεδο εμβέλειας, χωρίς δηλαδή να επιτρέπονται φωλιασμένες δηλώσεις, κάτι που γίνεται για παράδειγμα στην Pascal. Το επίπεδο εμβέλειας στο οποίο δηλώνονται οι συναρτήσεις περιλαμβάνει και δηλώσεις καθολικών τύπων και μεταβλητών. Αν δεν υπάρχουν κι άλλα αρχεία που να συμμετέχουν στη μετάφραση του προγράμματος, αυτό είναι το πιο εξωτερικό επίπεδο εμβέλειας. Από τις δηλώσεις του επιπέδου αυτού θεωρούμε ότι μόνο οι δηλώσεις μεταβλητών συμμετέχουν στον ενδιάμεσο κώδικα, και μάλιστα μόνο στην κατασκευή του πίνακα δέσμευσης των στατικών δεδομένων, όχι δηλαδή στην κατασκευή εκτελέσιμου κώδικα. Ο χώρος στατικών δεδομένων δεν περιλαμβάνει μόνο τις μεταβλητές του εξωτερικού επιπέδου εμβέλειας του προγράμματος, καθώς η τοποθέτηση μιας μεταβλητής στο χώρο αυτό δε σχετίζεται με την εμβέλειά της, παρά μόνο με τη διάρκεια ζωής της. Κάθε μεταβλητή του

2 2 προγράμματος, η οποία έχει διάρκεια ζωής όλη τη διάρκεια εκτέλεσης του προγράμματος, τοποθετείται στο χώρο στατικών δεδομένων. Εκτός λοιπόν από τις καθολικές μεταβλητές, και οι στατικές μεταβλητές της C, μεταβλητές δηλαδή που είναι δηλωμένες με το χαρακτηρισμό static, ανήκουν σε αυτό το χώρο, σε οποιαδήποτε μονάδα κι αν είναι δηλωμένες. Πιο συγκεκριμένα, επειδή μια στατική μεταβλητή έχει διάρκεια ζωής όλη τη διάρκεια εκτέλεσης του προγράμματος, η θέση της στο χώρο δεδομένων πρέπει να είναι σταθερή. Έτσι, όταν το πρόγραμμα εκτελείται, κάθε φορά που ο έλεγχος ροής οδηγεί στη συνάρτηση στην οποία αυτή είναι δηλωμένη, η στατική μεταβλητή θα προσπελαύνεται στην ίδια θέση, και η τιμή της θα διατηρείται μεταξύ διαδοχικών εισόδων στον κώδικα της μονάδας. Παρ όλο που η μεταβλητή έχει εμβέλεια μόνο εκείνη τη συνάρτηση, κι επομένως όταν η μεταγλώττιση αυτής ολοκληρώνεται, η μεταβλητή διαγράφεται από τον πίνακα συμβόλων, μαζί με τις υπόλοιπες μεταβλητές της ίδιας εμβέλειας, η δέσμευση του χώρου δεδομένων για τη μεταβλητή αυτή διατηρείται μέχρι το τέλος της μεταγλώττισης του προγράμματος, γι αυτό και δε μπορεί παρά να γίνεται στο χώρο στατικών δεδομένων. Αντίθετα με τις στατικές μεταβλητές, οι υπόλοιπες τοπικές μεταβλητές μιας συνάρτησης όπως και οι τυπικές παράμετροι της συνάρτησης έχουν διάρκεια ζωής μόνο μία κλήση της συνάρτησης, και δε μπορούν να διατηρήσουν την τιμή τους μεταξύ κλήσεων. Η δέσμευση χώρου δεδομένων γι αυτές γίνεται στο εγγράφημα δραστηριοποίησης της μονάδας, και κατά την εκτέλεση του προγράμματος τοποθετούνται στη στοίβα, γι αυτό και ονομάζονται μεταβλητές στοίβας. Η θέση τους τυπικά μεταβάλλεται από κλήση σε κλήση της συνάρτησης, αν στον κώδικα του προγράμματος η συνάρτηση καλείται από πολλές διαφορετικές θέσεις, ή αν συμμετέχει σε αναδρομή. Τότε, την επόμενη φορά που η ροή ελέγχου οδηγεί στη μονάδα, το εγγράφημα δραστηριοποίησης της μονάδας μπορεί να βρίσκεται σε διαφορετικό σημείο στη στοίβα από το σημείο όπου βρισκόταν την προηγούμενη. Η αρχικοποίηση μιας μεταβλητής στη γλώσσα C γίνεται στην αρχή της διάρκειας ζωής της. Από τα παραπάνω προκύπτει ότι μια αρχικοποίηση μπορεί να γίνει με έναν από τους εξής δύο τρόπους: Αν η μεταβλητή είναι καθολική ή στατική, η αρχική της τιμή τοποθετείται στον πίνακα δέσμευσης, και από εκεί μπορεί να αποθηκευτεί απ ευθείας στο αρχείο τελικού κώδικα που θα παραχθεί από το μεταγλωττιστή. Αυτό συμβαίνει, επειδή η αρχική τιμή δίνεται μία μόνο φορά, στην αρχή εκτέλεσης του προγράμματος. Αν η μεταβλητή είναι μεταβλητή στοίβας, ο μεταγλωττιστής οφείλει να κατασκευάσει κώδικα που θα της δίνει την αντίστοιχη αρχική τιμή κάθε φορά που η ροή ελέγχου οδηγεί στη μονάδα όπου αυτή δηλώνεται, χειριζόμενος ουσιαστικά την αρχικοποίηση σαν έκφραση ανάθεσης. Μπορούμε να θεωρήσουμε ότι ο χώρος στατικών δεδομένων της C ορίζει μια μονάδα, την πιο εξωτερική μονάδα του προγράμματος, στην οποία όμως δεν υπάρχουν εντολές. Έτσι, ο ενδιάμεσος κώδικας αυτής της μονάδας θα είναι μόνο ο πίνακας δέσμευσης του χώρου στατικών δεδομένων. Ο πίνακας αυτός δεν παράγει εκτελέσιμο κώδικα, αλλά συμμετέχει στην παραγωγή τελικού κώδικα για το υπόλοιπο πρόγραμμα, καθορίζοντας επακριβώς (α) τη θέση και το μέγεθος του δεδομένου που θα προσπελαστεί στη μνήμη με κάθε αναφορά στην αντίστοιχη μεταβλητή από τον κώδικα, και (β) την αρχική του τιμή, αν αυτή είναι ορισμένη. Για κάθε άλλη μονάδα πέρα από την παραπάνω εικονική μονάδα, ο χώρος δεδομένων πρέπει εκτός από το χώρο των τοπικών μεταβλητών, να συμπεριλαμβάνει χώρο για τις παραμέτρους της αντίστοιχης συνάρτησης, για την τιμή που αυτή επιστρέφει, αν δεν είναι τύπου void, αλλά και για αποθήκευση της διεύθυνσης επανόδου από τη συνάρτηση. Μπορούμε να θεωρήσουμε αυθαίρετα 1 ότι η διεύθυνση επανόδου, έστω τύπου void*, αποθηκεύεται στη θέση 1, ότι η τιμή αποτελέσματος, αν υπάρχει, αποθηκεύεται στη θέση 2, και ότι οι παράμετροι αποθηκεύονται σε διαδοχικές θέσεις από τη θέση 3 του χώρου δεδομένων της μονάδας. Στη συνέχεια ακολουθούν οι υπόλοιπες μεταβλητές στοίβας της συνάρτησης. Ο μεταγλωττιστής είναι πι- 1 Συνήθως η αυθαιρεσία περιορίζεται από συμβάσεις που υπαγορεύουν οι μεγάλοι κατασκευαστές μεταγλωττιστών και αρχιτεκτονικών για λόγους φορητότητας και συμβατότητας λογισμικού.

3 3 θανό να δεσμεύσει πρόσθετες θέσεις μετά από τις προηγούμενες για αποθήκευση προσωρινών μεταβλητών (όπως για παράδειγμα για διάχυση καταχωρητών). Κάτι τέτοιο συμβαίνει μετά την παραγωγή του ενδιάμεσου κώδικα της μονάδας, γι αυτό και η αρχική μορφή του πίνακα δέσμευσης αυτής δεν τις καλύπτει. Όπως και προηγουμένως, ο πίνακας δέσμευσης δεν παράγει εκτελέσιμο κώδικα, αλλά μόνο καθορίζει τις θέσεις και τα μεγέθη των δεδομένων που προσπελάζονται από τον κώδικα. Επειδή ο χώρος δεδομένων κάθε μονάδας εκτός της εξωτερικής αναφέρεται στη στοίβα, ο αντίστοιχος πίνακας δέσμευσης δεν είναι δυνατό να περιέχει αρχικές τιμές, και αυτές όπως προαναφέρθηκε αποδίδονται με εκφράσεις ανάθεσης. Σύμφωνα με τα παραπάνω, ο πίνακας δέσμευσης της εξωτερικής μονάδας για το πρόγραμμα που μας δίνεται με κάποιον αυθαίρετο συμβολισμό θα είναι: { 1: int; 2: int; 3: int: 0 } υποδηλώνοντας τρεις μεταβλητές τύπου int, οι οποίες αντιστοιχούν στις καθολικές μεταβλητές x και z, καθώς και στη στατική μεταβλητή x της συνάρτησης Α. Η τελευταία από τις τρεις μεταβλητές έχει και αρχική τιμή, ίση με 0. Οι θέσεις των μεταβλητών είναι διαδοχικές, ξεκινώντας από τη θέση 1, και κάνοντας τη δέσμευση με τη σειρά που αυτές εμφανίζονται στο πρόγραμμα. Παρατηρήστε ότι το όνομα των μεταβλητών δεν εμφανίζεται στον πίνακα, επειδή αυτό δε συμμετέχει στον τελικό κώδικα. Μέχρι να ολοκληρωθεί η μεταγλώττιση της μονάδας, όμως, και για να συνδέσουμε κάθε μεταβλητή με την αντίστοιχη δέσμευση, τοποθετούμε τον δείκτη στον πίνακα όπου αποθηκεύεται η παραπάνω πληροφορία και στον πίνακα συμβόλων. Για παράδειγμα, η εγγραφή στον πίνακα συμβόλων για την καθολική μεταβλητή x θα περιέχει την τιμή 1, εφ όσον η πληροφορία δέσμευσης αυτής βρίσκεται στην πρώτη θέση του πίνακα δέσμευσης. Ο πίνακας δέσμευσης της μονάδας της συνάρτησης Α θα είναι: { 1: void*; 2: void; 3: int* } δεσμεύοντας χώρο για τη διεύθυνση επανόδου (θέση 1), καθώς και για τη μοναδική παράμετρο (θέση 3). Η θέση 2 δεσμεύεται, ώστε να εξασφαλιστεί ομοιόμορφη αναφορά σε παραμέτρους για όλες τις συναρτήσεις της γλώσσας, άσχετα αν δε χρησιμοποιείται στην προκειμένη περίπτωση που η συνάρτηση Α δεν επιστρέφει τιμή. Έτσι, η πρώτη παράμετρος θα βρίσκεται πάντα στη θέση 3, η δεύτερη στη θέση 4, κόκ. Παρατηρήστε ότι η τοπική μεταβλητή x δεν περιλαμβάνεται στον πίνακα, επειδή είναι στατική και έχει περιληφθεί στον πίνακα δέσμευσης της εξωτερικής μονάδας του προγράμματος. Ο πίνακας δέσμευσης της μονάδας της συνάρτησης main θα είναι: { 1: void*; 2: void; 3: int; 4: int } Οι δύο μεταβλητές που καλύπτονται από τον πίνακα αυτόν είναι η μεταβλητή y που δηλώνεται στην εμβέλεια της main (θέση 3), και η μεταβλητή j που δηλώνεται σε εμβέλεια εσωτερική της main (θέση 4). Η τελευταία μπορεί να έχει μικρότερη εμβέλεια από την y, αλλά ο χώρος που δεσμεύεται γι αυτήν βρίσκεται στο εγγράφημα δραστηριοποίησης της main, κι επομένως η δέσμευση γίνεται στον ίδιο πίνακα δέσμευσης. Όπως και παραπάνω, έτσι και εδώ δεσμεύτηκαν δύο θέσεις για λόγους ομοιομορφίας, μια που στη γενική περίπτωση η main δέχεται παραμέτρους. Οι δηλώσεις των μεταβλητών σε ένα πρόγραμμα C και αφού προηγηθεί ο απαιτούμενος σημασιολογικός έλεγχος τύπων μετατρέπονται από το μεταγλωττιστή σε δεσμεύσεις στο χώρο δεδομένων. Μια αναφορά σε δηλωμένη μεταβλητή, από την άλλη μεριά, θα αναπαρασταθεί στον ενδιάμεσο κώδικα από την ένδειξη του πίνακα όπου έχει δεσμευτεί χώρος γι αυτή, και από τον αντίστοιχο δείκτη. Επειδή η C δεν υποστηρίζει φωλιάσματα συναρτήσεων, κάθε αναφορά σε μια μεταβλητή επιλύεται είτε στο τρέχον εγγράφημα δραστηριοποίησης στη στοίβα, είτε στο χώρο στατικών δεδομένων. Έτσι, η ένδειξη του πίνακα μπορεί να γίνει απλά με το χαρακτηρισμό GLOBAL, όταν η μεταβλητή τοποθετείται στο χώρο στατικών δεδομένων, ή από την ένδειξη LOCAL, όταν αυτή τοποθετείται στο εγγράφημα δραστηριοποίησης. Για παράδειγμα, στην έκφραση x>y της συνάρτησης main η αναφορά στην x αναπα-

4 4 ριστάται με το ζεύγος (GLOBAL: 1) ενώ η αναφορά στην y αναπαριστάται με το ζεύγος (LOCAL: 3). Σε κάθε αναφορά μιας μεταβλητής, η πληροφορία που καθορίζει τον πίνακα δέσμευσης, όπως και ο δείκτης σε αυτόν, βρίσκονται από τον πίνακα συμβόλων. Στην παραγωγή του ενδιάμεσου κώδικα μπορούμε να υλοποιήσουμε μια διαδοχή από εντολές ή αλλιώς μια σύνθετη εντολή είτε σε μορφή δυαδικού δέντρου, χρησιμοποιώντας τους συνήθεις συντακτικούς κανόνες: statements statements statement statement είτε σε μορφή γραμμικής λίστας. Θα προτιμήσουμε την πρώτη υλοποίηση, επειδή προσφέρει πιο γρήγορη προσπέλαση. Κάθε δέντρο εντολών έχει στα φύλλα του εντολές του αρχικού προγράμματος. Ανάλογα με την εντολή, κάθε ένα φύλλο μπορεί να συνδέεται με ένα ή περισσότερα δέντρα εκφράσεων ή άλλα δέντρα εντολών, σχηματίζοντας έτσι ένα μεγαλύτερο δέντρο. Τα φύλλα του συνολικού δέντρου ενδιάμεσου κώδικα για μια μονάδα θα είναι τα φύλλα των δέντρων εκφράσεων της μονάδας, δηλαδή οι αναφορές σε αναγνωριστικά του προγράμματος, όπως για παράδειγμα μεταβλητές, καθώς και οι αναφορές σε σταθερές, οι οποίες απλά αναπαριστώνται με τις τιμές τους. Τα δέντρα εκφράσεων, τέλος, κατασκευάζονται με βάση τους συντακτικούς κανόνες των εκφράσεων. Κάθε κόμβος δέντρου έκφρασης περιέχει έναν τελεστή και έχει σαν παιδιά του τις υποεκφράσεις που αποτελούν τα τελούμενα του τελεστή. Η ρίζα ενός δέντρου έκφρασης θα περιέχει έναν από τους πιθανά πολλούς τελεστές με τη μικρότερη προτεραιότητα στην έκφραση, ανάλογα με την προσεταιριστικότητα αυτού. Έτσι, το αφηρημένο συντακτικό δέντρο που κατασκευάζεται σύμφωνα με τα παραπάνω για τη συνάρτηση Α θα είναι το εξής: statements statements expression expression = = * + ID + ID ID ID (GLOBAL:3) (LOCAL:3) (GLOBAL:2) (GLOBAL:3) ID * (GLOBAL:3) ID (LOCAL:3) όπου φαίνονται κωδικοποιημένες δύο εντολές έκφρασης, μια στα αριστερά που είναι η πρώτη εντολή της συνάρτησης Α, και μία στα δεξιά που είναι η δεύτερη εντολή της Α. Υπενθυμίζεται ότι στη C δεν υπάρχει ειδική εντολή ανάθεσης, και η ανάθεση αποτελεί μέρος εντολής έκφρασης. Παρατηρήστε ότι η αναφορά στη μεταβλητή x γίνεται για τη στατική μεταβλητή της Α (δείκτης 3 στον πίνακα δέσμευσης της εξωτερικής μονάδας), και όχι για την καθολική μεταβλητή με το ίδιο όνομα (δείκτης 1 στον ίδιο πίνακα δέσμευσης). Το αφηρημένο συντακτικό δέντρο που κατασκευάζεται για τη συνάρτηση main δίνεται στην επόμενη σελίδα. Σε αυτό φαίνονται κωδικοποιημένες τέσσερις εντολές, από τις οποίες οι τρεις πρώτες είναι εντολές έκφρασης, και η τέταρτη εντολή διακλάδωσης. Από τις εντολές

5 5 statements statements if_statement statements > expression statements expression statements ID expression ( ) ID (LOCAL:3) statements expression (GLOBAL:1) ( ) expression = ID statements expression = (funca) & ID & = (funca) ID expression ( ) ID (GLOBAL:1) = ID ID (GLOBAL:2) ID ICONST (GLOBAL:1) (GLOBAL:2) (LOCAL:4) ID (0) = ID & (LOCAL:3) ICONST (funca) ID (1) (GLOBAL:2) ID ID (LOCAL:4) ID (LOCAL:4) (GLOBAL:1) έκφρασης, η πρώτη περιέχει μια ανάθεση, η οποία υλοποιεί την αρχικοποίηση της μεταβλητής στοίβας y. Η δεύτερη περιέχει δύο αναθέσεις, που αντιστοιχούν στην εντολή: x = z = 1; της συνάρτησης main του αρχικού προγράμματος. Επειδή ο τελεστής ανάθεσης έχει δεξιά προσεταιριστικότητα, στη ρίζα του αντίστοιχου δέντρου έκφρασης βρίσκεται ο πρώτος από αριστερά από τους δύο τελεστές ανάθεσης. Η τρίτη εντολή έκφρασης είναι μια κλήση της συνάρτησης Α. Η μετατροπή της εφαρμογής του τελεστή ( ) στα συγκεκριμένα βήματα με τα οποία πραγματοποιείται μια κλήση συνάρτησης γίνεται κατά την παραγωγή τελικού κώδικα. Στον ενδιάμεσο κώδικα το αναγνωριστικό μιας συνάρτησης σε μια κλήση προς αυτήν πρέπει να συνοδεύεται από την πληροφορία που παρέχει τουλάχιστον: Τις παραμέτρους της συνάρτησης, τον τύπο, καθώς και τον τρόπο περάσματος αυτών. Αυτή η πληροφορία μπορεί να δίνεται με ένα δείκτη στην εγγραφή της συνάρτησης στον πίνακα συμβόλων. Η εγγραφή θα είναι ορισμένη, αφού η εμβέλεια μιας συνάρτησης είναι όλο το πρόγραμμα 2, ακόμα κι αν η συνάρτηση είναι δηλωμένη μόνο σαν πρωτότυπο. Την αρχή του κώδικα της συνάρτησης. Αυτή η πληροφορία παρέχεται μέσω ενός δείκτη στον ενδιάμεσο κώδικα της μονάδας της συνάρτησης, και μπορεί επίσης να αποθηκεύεται στον πίνακα συμβόλων. Αν ο ενδιάμεσος κώδικας δεν έχει ακόμα παραχθεί, θα πρέπει να ξαναγυρίσουμε αργότερα στην κλήση αυτή με την τεχνική του μπαλώματος. Μετά τις εντολές έκφρασης στον ενδιάμεσο κώδικα της main ακολουθεί μια εντολή διακλάδωσης. Αυτή αναπαριστάται με έναν κόμβο που έχει τρία παιδιά, μια έκφραση που αποτελεί τη συνθήκη άλματος της διακλάδωσης, και δύο εντολές, που μπορεί να είναι είτε απλές είτε σύνθετες. Στην προκειμένη περίπτωση η μία εντολή είναι απλή, και είναι μια εντολή έκφρασης, που περιέχει μια ακόμα κλήση της συνάρτησης Α. Η δεύτερη εντολή είναι σύνθετη, κι επομένως υλοποιείται στον ενδιάμεσο κώδικα με ένα νέο δέντρο εντολών συνδεδεμένο με το προηγούμενο στον κόμβο της εντολής διακλάδωσης. Οι εντολές που απαρτίζουν τη σύνθετη αυτή εντολή είναι τρεις εντολές έκφρασης, από τις οποίες δύο περιέχουν αναθέσεις και μία περιέχει μια κλήση της συνάρτησης Α. 2 Για μείωση της πολυπλοκότητας της άσκησης δε θεωρούμε προγράμματα C που περιλαμβάνουν περισσότερα από ένα αρχεία, οπότε υπάρχουν εσωτερικές και εξωτερικές εμβέλειες για κάθε αρχείο.

6 6 Ενότητα 8: Βελτιστοποίηση Άσκηση 8-1: Έστω το πιο κάτω τμήμα κώδικα C: a[i*j+1] = a[i*j] + a[i*j+2]; if (a[i*j+1] > 0) a[i*j+1]++; b[i*j] -= a[i*j+1]; όπου a και b διανύσματα ακεραίων, και i και j ακέραιες μεταβλητές. Α. Δώστε έναν ενδιάμεσο κώδικα σε μορφή αφηρημένου συντακτικού δέντρου που να αντιστοιχεί στον κώδικα αυτόν, χωρίς την εφαρμογή οποιασδήποτε βελτιστοποίησης. Β. Βρείτε τις κοινές υποεκφράσεις στον παραπάνω αρχικό κώδικα. Γ. Δώστε ένα σχήμα εύρεσης και απαλοιφής των κοινών υποεκφράσεων στον ενδιάμεσο κώδικα σε μορφή αφηρημένου συντακτικού δέντρου, λαμβάνοντας υπ όψη τις διάρκειες ζωής των μεταβλητών που συμμετέχουν στον κώδικα. Δ. Δείξτε την εφαρμογή του σχήματος αυτού στον πιο πάνω κώδικα. Απάντηση Α. Ο κώδικας που μας δίνεται περιλαμβάνει τρεις εντολές C. Η πρώτη και η τρίτη από αυτές είναι εντολές έκφρασης, ενώ η δεύτερη είναι εντολή διακλάδωσης. Αν ένα δέντρο εντολών κωδικοποιείται σα δυαδικό δέντρο, ο ζητούμενος ενδιάμεσος κώδικας θα είναι: statements statements expression statements if_statement -= > expression [ ] expression [ ] [ ] ICONST POST++ ID * (0) (G:2) ID + = (G:1) ID + [ ] ID ID (G:1) (L:6) (L:7) ICONST [ ] + * (1) * ICONST + (1) ID ID [ ] (G:1) ID ID (G:1) + [ ] ID * (L:6) (L:7) ID (L:7) ICONST ID (L:6) (1) * (G:1) * ID ID ID ICONST (G:1) + (L:6) (L:7) (1) ID ID (L:6) ID (L:6) ID * ICONST (L:7) (L:7) (2) ID (L:6) ID (L:7)

7 7 Επειδή δεν έχουμε το συνολικό κώδικα, θεωρήσαμε αυθαίρετα χωρίς να επηρεάζεται από αυτό η επίλυση της άσκησης ότι οι αναφορές σε αναγνωριστικά μεταβλητών γίνονται στους χώρους δεδομένων που δείχνονται στον παραπάνω ενδιάμεσο κώδικα. Με G συμβολίσαμε το χώρο δεδομένων της εξωτερικής μονάδας του προγράμματος, ενώ με L συμβολίσαμε τον τοπικό χώρο δεδομένων, δηλαδή το εγγράφημα δραστηριοποίησης της παρούσας μονάδας του προγράμματος. Οι αριθμοί που συνοδεύουν τα σύμβολα αυτά αποτελούν δείκτες στους αντίστοιχους πίνακες δέσμευσης, του χώρου στατικών δεδομένων: { 1: int[1000]; 2: int[1000];... } όπου θεωρήσαμε αυθαίρετα ως μέγεθος πινάκων τα 1000 στοιχεία, και του τοπικού χώρου δεδομένων: { 1: void*; 2: void;... ; 6: int; 7: int;... } όπου δείχνονται αν και δεν είναι απαραίτητο για την παρούσα άσκηση και οι δύο πρώτες θέσεις για τη διεύθυνση επανόδου και την τιμή αποτελέσματος, αντίστοιχα. Β. Για να εντοπίσουμε τις κοινές υποεκφράσεις στον κώδικα που μας δίνεται, πρέπει να βρούμε τις διάρκειες ζωής των μεταβλητών που συμμετέχουν σε αυτόν. Επειδή διαθέτουμε μόνο ένα απόσπασμα από το συνολικό κώδικα του προγράμματος, αρκεί να εξετάσουμε (α) αν οι μεταβλητές που συναντάμε δεν παίρνουν νέες τιμές στον κώδικα που διαθέτουμε, οπότε οι διάρκειες ζωής τους παρατείνονται τουλάχιστον μέχρι τα σημεία στον κώδικα όπου χρησιμοποιούνται για τελευταία φορά, ή (β) αν παίρνουν νέες τιμές σε αυτόν, οπότε και αλλάζουν διάρκεια ζωής στα σημεία στα οποία λαμβάνουν τις νέες τιμές. Γενικά είναι εύκολο να αποφανθούμε αν μια βαθμωτή μεταβλητή αλλάζει τιμή σε κάποια εντολή, όταν αυτό δεν γίνεται μέσω μεταβλητής τύπου pointer. Στην προκειμένη περίπτωση, που δεν έχουμε μεταβλητές τύπου pointer στον κώδικά μας, βλέπουμε ότι οι μεταβλητές i και j δε λαμβάνουν τιμή σε καμιά από τις τρεις εντολές αυτού, κι επομένως η διάρκεια ζωής που έχουν μπαίνοντας στον κώδικα παρατείνεται τουλάχιστον μέχρι το τέλος του. Για μη βαθμωτές μεταβλητές από την άλλη μεριά, και πιο συγκεκριμένα για μεταβλητές τύπου πίνακα, είναι ιδιαίτερα δύσκολο να αποφανθούμε αν συγκεκριμένα στοιχεία αυτών διατηρούν την τιμή τους μέσα σε κάποιον κώδικα, όταν οι μεταβλητές που συμμετέχουν στις εκφράσεις των δεικτών τους αλλάζουν τιμή μέσα σε αυτόν. Κάτι τέτοιο είναι μερικά εφικτό με τη χρήση ειδικών εργαλείων που αναλύουν συμβολικά τον κώδικα, εξετάζοντας τις τιμές που μπορούν να έχουν οι δείκτες των στοιχείων αυτών πριν και μετά από κάθε εντολή του κώδικα. Αν όμως οι εκφράσεις των δεικτών δεν αλλάζουν τιμή σε έναν κώδικα, είναι τότε εύκολο να αποφανθούμε αν τα στοιχεία που αναπαριστώνται με τους συγκεκριμένους αυτούς δείκτες αλλάζουν τιμή στον ίδιο κώδικα. Έτσι, για τον κώδικα που μας δίνεται, μπορούμε να διαπιστώσουμε ότι τα στοιχεία a[i*j] και a[i*j+2] του πίνακα a διατηρούν την τιμή τους και στις τρεις εντολές αυτού. Αντίθετα, το στοιχείο a[i*j+1] αλλάζει τιμή τόσο στην πρώτη, όσο και στη δεύτερη εντολή του κώδικα. Ειδικά για τη δεύτερη εντολή, μας αρκεί το γεγονός ότι για κάποια τιμή της συνθήκης άλματος είναι δυνατό το στοιχείο αυτό να αλλάξει τιμή, ώστε να πούμε ότι το στοιχείο αυτό γενικά αλλάζει τιμή στην εντολή αυτή. Το στοιχείο b[i*j] του πίνακα b τέλος, αλλάζει τιμή στην τρίτη εντολή του κώδικα. Οι εκφράσεις ενός κώδικα χωρίζονται σε δύο κατηγορίες: εκφράσεις αριστερής και εκφράσεις δεξιάς προσπέλασης. Στην πρώτη κατηγορία ανήκουν εκφράσεις στις οποίες μπορεί να γίνει ανάθεση κάποιας τιμής, όπως είναι για παράδειγμα εκφράσεις διευθύνσεων μεταβλητών, είτε βαθμωτών είτε στοιχείων πίνακα, ενώ στη δεύτερη κατηγορία ανήκουν οι υπόλοιπες. Ο διαχωρισμός στις δύο κατηγορίες είναι απαραίτητος για την εύρεση κοινών υποεκφράσεων, επειδή οι διάρκειες ζωής των μεταβλητών χρησιμοποιούνται διαφορετικά σε καθεμία από αυτές. Πιο συγκεκριμένα, αν σε έναν κώδικα δε συμμετέχουν μεταβλητές τύπου pointer, οι τιμές αριστερής προσπέλασης δεν επηρεάζονται από αναθέσεις στις αντίστοιχες μεταβλητές, κι έτσι η διάρκεια ζωής τους είτε δεν αλλάζει, αν οι μεταβλητές είναι βαθμωτές, είτε καθορί-

8 8 ζεται από τις διάρκειες ζωής των μεταβλητών που συμμετέχουν στις εκφράσεις των δεικτών, αν οι μεταβλητές είναι στοιχεία πίνακα. Η διάρκεια ζωής τιμών δεξιάς προσπέλασης, από την άλλη μεριά, λαμβάνει υπ όψη τις αναθέσεις σε όλες τις μεταβλητές που συμμετέχουν στις εκφράσεις τους, και αλλάζει με κάθε ανάθεση σε μια από αυτές. Οι μεταβλητές τύπου pointer καθιστούν την παραπάνω ανάλυση πιο δύσκολη, επειδή οι τιμές τους είναι ταυτόχρονα αριστερής και δεξιάς προσπέλασης, και ανάθεση σε μια τέτοια μεταβλητή αλλάζει τη διεύθυνση στην οποία αυτή δείχνει. Επειδή δε η τιμή που ανατίθεται είναι γενικά άγνωστη κατά τη μετάφραση, κάθε επόμενη ανάθεση στη διεύθυνση που δείχνει η μεταβλητή τύπου pointer πρέπει να τερματίζει όλες τις ενεργές διάρκειες ζωής που πιθανά επηρεάζονται. Στον κώδικα που μας δίνεται, οι εκφράσεις αριστερής προσπέλασης είναι: (α) οι διευθύνσεις των βαθμωτών μεταβλητών i και j, και (β) οι διευθύνσεις των στοιχείων πίνακα a[i*j], a[i*j+1], a[i*j+2] και b[i*j]. Οι διευθύνσεις των δύο βαθμωτών μεταβλητών που εμφανίζονται σε περισσότερα από ένα σημεία στον κώδικα, αποτελούν κοινές υποεκφράσεις σε αυτόν, επειδή είναι σταθερές, κι επομένως οι διάρκειες ζωής τους δεν αλλάζουν. Εφ όσον οι μεταβλητές i και j δεν παίρνουν τιμή σε καμιά εντολή του, όλες οι εκφράσεις των δεικτών έχουν διάρκειες ζωής που επίσης δεν αλλάζουν στον κώδικα, κι επομένως όλες οι εκφράσεις αριστερής προσπέλασης στοιχείων πίνακα που εμφανίζονται περισσότερες της μίας φορές αποτελούν κοινές υποεκφράσεις σε αυτόν. Αυτό συμβαίνει μόνο με το στοιχείο a[i*j+1], η διεύθυνση του οποίου αποτελεί επομένως κοινή υποέκφραση στον κώδικα. Όσο αφορά τώρα τις εκφράσεις δεξιάς προσπέλασης, κοινές υποεκφράσεις αποτελούν (α) όλες οι σταθερές που χρησιμοποιούνται περισσότερες από μία φορές στον κώδικα, (β) όλες οι τιμές μεταβλητών που χρησιμοποιούνται περισσότερες από μία φορές στην ίδια διάρκεια ζωής στον κώδικα, και (γ) όλες οι εκφράσεις που κατασκευάζονται από τις προηγούμενες και, όπως οι μεταβλητές, χρησιμοποιούνται περισσότερες από μία φορές στην ίδια διάρκεια ζωής. Έτσι, η σταθερά 1, οι τιμές των μεταβλητών i και j, και οι εκφράσεις i*j και i*j+1 αποτελούν κοινές υποεκφράσεις σε όλον τον κώδικα που μας δίνεται. Επιπλέον, η τιμή του στοιχείου πίνακα a[i*j+1] αποτελεί κοινή υποέκφραση στη δεύτερη εντολή του κώδικα, η οποία τη χρησιμοποιεί δύο φορές στη διάρκεια ζωής που ξεκινάει με την ανάθεση κάποιας τιμής στο στοιχείο αυτό στην πρώτη εντολή και τελειώνει με τη χρήση αυτής της τιμής στο τέλος της δεύτερης εντολής του κώδικα. Γ. Για την εύρεση των κοινών υποεκφράσεων στον ενδιάμεσο κώδικα σε μορφή αφηρημένου συντακτικού δέντρου, είναι απαραίτητο να έχει προηγηθεί ανάλυση ροής ελέγχου και ροής δεδομένων για τον υπολογισμό της διάρκειας ζωής των μεταβλητών του κώδικα. Υποθέτουμε ότι η ανάλυση αυτή καλύπτει μεταβλητές τύπου πίνακα, χωρίς όμως να συμπεριλαμβάνει συμβολική ανάλυση των τιμών των δεικτών τους. Με την υπόθεση ότι η μετάφραση που χρησιμοποιείται είναι οδηγούμενη από τη σύνταξη, και ότι η βάση της ανάλυσης είναι ένας συντακτικός αναλυτής από κάτω προς τα επάνω, το αφηρημένο συντακτικό δέντρο κατασκευάζεται από κάτω προς τα επάνω, και από αριστερά προς τα δεξιά. Έτσι, οι κοινές υποεκφράσεις μπορούν να βρεθούν κατά την κατασκευή των δέντρων εκφράσεων με τον αλγόριθμο που δίνεται παρακάτω: Κατασκεύασε το κόμβο έκφρασης τύπου Τ με παιδιά Π1 και Π2 αν υπάρχουν, ως εξής: Αν Τ είναι τύπος σταθεράς, ψάξε το δέντρο για ένα φύλλο σταθεράς με την ίδια τιμή. Αν υπάρχει τέτοιο φύλλο, επέστρεψε αυτό το φύλλο, αλλιώς κατασκεύασε και επέστρεψε ένα νέο φύλλο σταθεράς. Αν Τ είναι τύπος αναγνωριστικού, ψάξε το δέντρο για ένα φύλλο αναγνωριστικού της ίδιας μεταβλητής. Αν η έκφραση είναι δεξιάς προσπέλασης, το φύλλο πρέπει να βρίσκεται στην ίδια διάρκεια ζωής της μεταβλητής με αυτή, στην οποία τώρα βρισκόμαστε. Αν υπάρχει τέτοιο φύλλο, επέστρεψε αυτό το φύλλο, αλλιώς κατασκεύασε και επέστρεψε ένα νέο φύλλο αναγνωριστικού.

9 9 Αν κάποιο από τα παιδιά Π1 και Π2 δεν έχει πατέρα, ή αν τα δύο παιδιά δεν έχουν τον ίδιο πατέρα τύπου Τ, κατασκεύασε και επέστρεψε ένα νέο κόμβο έκφρασης τύπου Τ με παιδιά Π1 και Π2. Αν Τ είναι τύπος τελεστή που αποτιμά έκφραση αριστερής προσπέλασης σε δεξιάς, ψάξε για έναν κοινό πατέρα στην ίδια διάρκεια ζωής της μεταβλητής που αντιστοιχεί στην έκφραση αριστερής προσπέλασης, με αυτή, στην οποία τώρα βρισκόμαστε. Αν υπάρχει τέτοιος κόμβος, επέστρεψε αυτόν τον κόμβο. Διαφορετικά, αν υπάρχει κοινός πατέρας έκφρασης αριστερής προσπέλασης, επέστρεψε αυτόν τον κόμβο, αλλιώς κατασκεύασε και επέστρεψε ένα νέο κόμβο έκφρασης τύπου Τ με παιδιά Π1 και Π2. Επέστρεψε τον κοινό πατέρα των Π1 και Π2. Ο πιο πάνω αλγόριθμος, όταν προσθέτει στον ενδιάμεσο κώδικα έναν κόμβο που αποτιμά μια υποέκφραση, διαπερνά το δέντρο που έχει ήδη κατασκευαστεί, για να βρει έναν κόμβο που αποτιμά μια κοινή με αυτήν υποέκφραση. Οι δύο πρώτοι έλεγχοι εξασφαλίζουν ότι αν ο κόμβος αντιστοιχεί σε φύλλο του δέντρου, αυτός θα προστεθεί μόνο αν δεν υπάρχει άλλο ίδιο φύλλο που να έχει προστεθεί νωρίτερα. Με τους επόμενους έλεγχους, κι επειδή η κατασκευή γίνεται από κάτω προς τα επάνω, ο αλγόριθμος εξασφαλίζει ότι τα παιδιά του κόμβου δεν προέρχονται από κοινές με αυτά υποεκφράσεις με τον ίδιο πατέρα, πριν προσθέσει κάποιο νέο κόμβο. Έτσι, όταν τελικά κατασκευάζει ένα νέο κόμβο, είναι σίγουρος ότι δεν υπάρχει άλλος κόμβος στον ενδιάμεσο κώδικα που αποτιμά την ίδια υποέκφραση. Ως αποτέλεσμα των παραπάνω, η τελευταία επιλογή στον αλγόριθμο δεν είναι δυνατό να έχει να επιλέξει περισσότερους από έναν κοινούς πατέρες των Π1 και Π2. Ειδικά για τις υποεκφράσεις δεξιάς προσπέλασης, ο αλγόριθμος λαμβάνει υπ όψη τις διάρκειες ζωής των μεταβλητών που συμμετέχουν σε αυτές, βρίσκοντας έτσι μόνο εκείνες τις κοινές υποεκφράσεις, οι οποίες αντιστοιχούν σε κοινές διάρκειες ζωής όλων των μεταβλητών. Αν δεν υπάρχει προηγούμενη ίδια υποέκφραση δεξιάς προσπέλασης, ο αλγόριθμος εξετάζει την ύπαρξη ίδιας υποέκφρασης αριστερής προσπέλασης. Οι κοινές υποεκφράσεις που παράγονται με αυτόν τον τρόπο διαφοροποιούνται στην παραγωγή τελικού κώδικα, είτε με διαφορετική επιλογή εντολών είτε με την προσθήκη κατάλληλου κόμβου για μετατροπή της έκφρασης αριστερής σε έκφραση δεξιάς προσπέλασης, και κάτι τέτοιο πρέπει να σημειώνεται στον ενδιάμεσο κώδικα με κατάλληλη ένδειξη. Ας σημειωθεί ότι το αφηρημένο συντακτικό δέντρο που κατασκευάζεται με τον παραπάνω τρόπο δεν έχει ακριβώς δομή δέντρου, αλλά κατευθυνόμενου γράφου, αφού ένας κόμβος μπορεί να έχει περισσότερους από έναν πατέρες. Έτσι, απαλείφονται οι κοινές υποεκφράσεις από τον κώδικα, αφού κάθε μία αποτιμάται μόνο μια φορά σε αυτόν. Ακόμα, θα πρέπει να αναφέρουμε ότι ανάλογα με την τελική γλώσσα μεταγλώττισης, το πρώτο βήμα του αλγόριθμου μπορεί να παραλειφθεί. Για παράδειγμα, στην αρχιτεκτονική MIPS πολλές σταθερές ενσωματώνονται σε εντολές αριθμητικών και λογικών πράξεων ως άμεσα τελούμενα, κάτι που στην ουσία σημαίνει ότι οι κόμβοι τέτοιων σταθερών στον ενδιάμεσο κώδικα δε θα παράγουν ξεχωριστή εντολή στον τελικό κώδικα, και άρα δε χρειάζεται να συμμετάσχουν στη συγκεκριμένη βελτιστοποίηση. Στο ίδιο αποτέλεσμα καταλήγουμε για εύρεση κοινών υποεκφράσεων σε ήδη κατασκευασμένο αφηρημένο συντακτικό δέντρο, προχωρώντας με διαπέραση αυτού κατά βάθος και από αριστερά προς τα δεξιά. Τα βήματα του αλγόριθμου είναι παρόμοια, με τις ακόλουθες διαφορές: Η όποια αναζήτηση κοινών υποεκφράσεων γίνεται στο υποδέντρο που έχουμε ήδη επισκεφτεί. Η επιστροφή ως αποτέλεσμα της αναζήτησης ενός κόμβου που έχουμε νωρίτερα επισκεφτεί οδηγεί στη διαγραφή του κόμβου στον οποίο τώρα βρισκόμαστε και στην αντικατάσταση των συνδέσεων προς τον τελευταίο με συνδέσεις προς τον κόμβο που επιστράφηκε. Δεν κατασκευάζεται κανένας νέος κόμβος.

10 10 Δ. Για την εξ αρχής κατασκευή του αφηρημένου συντακτικού δέντρου για το δεδομένο κώδικα με βάση τον πιο πάνω αλγόριθμο, ακολουθούμε τα εξής βήματα: Βήμα Περιγραφή 1 Κατασκευή κόμβου ID(a). 2 Κατασκευή κόμβου ID(i). 3 Κατασκευή κόμβου ID(j). 4 Κατασκευή κόμβου πολλαπλασιασμού. 5 Κατασκευή κόμβου ICONST(1). 6 Κατασκευή κόμβου πρόσθεσης. 7 Κατασκευή κόμβου υπολογισμού διεύθυνσης στοιχείου πίνακα a[i*j+1] Επιστροφή κόμβων που κατασκευάστηκαν στα βήματα Κατασκευή κόμβου αποτίμησης στοιχείου πίνακα a[i*j] Επιστροφή κόμβων που κατασκευάστηκαν στα βήματα Κατασκευή κόμβου ICONST(2). 18 Κατασκευή κόμβου πρόσθεσης. 19 Κατασκευή κόμβου αποτίμησης στοιχείου πίνακα a[i*j+2]. 20 Κατασκευή κόμβου πρόσθεσης. 21 Κατασκευή κόμβου ανάθεσης. 22 Κατασκευή κόμβου εντολής έκφρασης. 23 Κατασκευή κόμβου σύνθετης εντολής Επιστροφή κόμβων που κατασκευάστηκαν στα βήματα Επιστροφή κόμβου που κατασκευάστηκε στο βήμα 7 με ένδειξη R. 31 Κατασκευή κόμβου ICONST(0). 32 Κατασκευή κόμβου σύγκρισης Επιστροφή κόμβων που κατασκευάστηκαν στα βήματα Κατασκευή κόμβου αύξησης. 41 Κατασκευή κόμβου εντολής έκφρασης. 42 Κατασκευή κόμβου εντολής διακλάδωσης. 43 Κατασκευή κόμβου σύνθετης εντολής. 44 Κατασκευή κόμβου ID(b) Επιστροφή κόμβων που κατασκευάστηκαν στα βήματα Κατασκευή κόμβου υπολογισμού διεύθυνσης στοιχείου πίνακα b[i*j] Επιστροφή κόμβων που κατασκευάστηκαν στα βήματα Επιστροφή κόμβου που κατασκευάστηκε στο βήμα 7 με ένδειξη R. 56 Κατασκευή κόμβου αφαίρεσης και ανάθεσης. 57 Κατασκευή κόμβου εντολής έκφρασης. 58 Κατασκευή κόμβου σύνθετης εντολής. όπου η ένδειξη R υποδεικνύει την ανάγκη μετατροπής κοινής υποέκφρασης αριστερής προσπέλασης σε δεξιά. Παρατηρήστε ότι με τα παραπάνω βήματα κατασκευάζονται μόνο 26 κόμβοι ενδιάμεσου κώδικα από τους 58 που κατασκευάστηκαν αρχικά. Αυτό φαίνεται στο διάγραμμα του νέου ενδιάμεσου κώδικα που ακολουθεί στην επόμενη σελίδα, όχι πια με μορφή δέντρου, αλλά κατευθυνόμενου γράφου. Αξίζει να σημειώσουμε ότι στον κώδικά μας το μοναδικό παιδί του κόμβου ++ και το αριστερό παιδί του κόμβου -= είναι κόμβοι εκφράσεων τόσο δεξιάς όσο και αριστερής προσπέλασης, μια που ο κώδικας χρειάζεται και τις τιμές για την αριθμητική πράξη, αλλά και τις διευθύνσεις για την αποθήκευση των αντίστοιχων μεταβλητών. Θα μπορούσαμε να είχαμε διαχωρίσει τις δεξιές από τις αριστερές προσπελάσεις με κατάλληλους μετασχηματισμούς σε κώδικα με διαφορετικό τον τελεστή της πράξης από τον τελεστή της ανάθεσης, αλλά κάτι τέτοιο δεν το κάναμε, επειδή εξαρτάται σε μεγάλο βαθμό από την τελική αρχιτεκτο-

11 11 statements statements expression statements if_statement -= expression > expression [ ] R R = ICONST POST++ ID (0) (G:2) [ ] + + [ ] [ ] ID + (G:1) * ICONST ICONST (1) (2) ID (L:6) ID (L:7) νική για την οποία γίνεται η μεταγλώττιση, και κάποιες φορές ο διαχωρισμός αυτός δεν είναι επιθυμητός 3. Αν όμως είχαμε κάνει αυτό το διαχωρισμό, θα είχαμε δει και την τιμή του στοιχείου πίνακα a[i*j+1] σαν κοινή υποέκφραση, όπως αναφέραμε στο μέρος Β της άσκησης, και όχι μόνο τη διεύθυνσή του. Αν όμως γνωρίζουμε στη φάση αυτή ότι η τελική αρχιτεκτονική είναι τύπου RISC, μπορούμε να κάνουμε το διαχωρισμό των δύο τύπων προσπέλασης ξεκάθαρο, με εισαγωγή ειδικού τελεστή φόρτωσης από τη μνήμη, οπουδήποτε λαμβάνεται τιμή δεξιάς προσπέλασης από έκφραση αριστερής προσπέλασης. Θα μπορούσαμε τέλος να εφαρμόσουμε και διάδοση αντιγράφων, ώστε μια τέτοια τιμή δεξιάς προσπέλασης να λαμβάνεται από την αρχή της αντίστοιχης διάρκειας ζωής, απ ευθείας από το δεξί μέλος της ανάθεσης που την ορίζει, αν βέβαια η ανάθεση αυτή είναι μοναδική, γλιτώνοντας έτσι το κόστος μιας φόρτωσης από τη μνήμη, που είναι μάλιστα εξαρτημένη από προηγούμενη αποθήκευση. Στον κώδικά μας, διάδοση αντιγράφων εφαρμόζεται στην τιμή του στοιχείου a[i*j+1] που χρησιμοποιούν οι τελεστές > και ++, αλλά όχι σε αυτή που χρησιμοποιεί ο τελεστής -=, μια που στην περίπτωση αυτή η τιμή δεξιάς προσπέλασης μπορεί να ληφθεί από δύο διαφορετικές αναθέσεις. Σε περίπτωση λοιπόν που γνωρίζουμε ότι η μεταγλώττιση γίνεται για κάποια αρχιτεκτονική RISC, μπορούμε να καταλήξουμε στον ενδιάμεσο κώδικα που ακολουθεί, όπου με LOAD παριστάνεται ο τελεστής φόρτωσης. Εκτός των άλλων, η αύξηση κατά σταθερά και η σύ- 3 Σε αρχιτεκτονικές RISC για παράδειγμα, οι τελεστές ++ και -= αποτιμώνται με φόρτωση, πρόσθεση/αφαίρεση σταθερών ή καταχωρητών και αποθήκευση. Η παραγωγή τελικού κώδικα απαιτεί έτσι τρεις λειτουργίες, οι οποίες μπορούν να προκύψουν πιο εύκολα από τρεις κόμβους ενδιάμεσου κώδικα παρά από έναν. Οι αρχιτεκτονικές CISC από την άλλη μεριά, εκτελούν λειτουργίες απ ευθείας στη μνήμη, οπότε αρκούνται στον ένα κόμβο, και δε χρειάζονται μετατροπή του κώδικα.

12 12 γκριση με το 0 έχουν ενσωματωθεί στον πατρικό κόμβο πρόσθεσης και σύγκρισης αντίστοιχα, αφού τέτοιες πράξεις γίνονται συνήθως μέσω εντολών με άμεσο τελούμενο. statements statements expression statements if_statement = expression >0 expression - = = LOAD LOAD [ ] + +1 [ ] +1 LOAD LOAD ID (G:2) [ ] [ ] ID +2 (G:1) * ID (L:6) ID (L:7)

13 13 Ενότητα 9: Τελικός κώδικας Άσκηση 9-1: Να δώσετε ένα σχήμα παραγωγής τελικού κώδικα MIPS για την εντολή βρόχου while της C, της οποίας η σύνταξη δίνεται από τον κανόνα: while T_WHILE ( expression ) statement όπου τα σύμβολα expression και statement περιγράφουν τις εκφράσεις και τις εντολές της C, αντίστοιχα. Υποθέστε ότι διαθέτετε ενδιάμεσο κώδικα σε μορφή αφηρημένου συντακτικού δέντρου. Απάντηση Ένα σχήμα παραγωγής τελικού κώδικα περιγράφεται από τα βήματα που πρέπει να εκτελέσει ο μεταγλωττιστής για να μετατρέψει έναν ενδιάμεσο κώδικα σε τελικό. Γενικά, για ενδιάμεσο κώδικα σε μορφή αφηρημένου συντακτικού δέντρου, τα βήματα αυτά περιλαμβάνουν μια σειρά από μετασχηματισμούς που κατεβάζουν το επίπεδο των κόμβων του δέντρου, ώστε από κάποιο υψηλό επίπεδο, κοντά δηλαδή στην αρχική γλώσσα, να φτάσουν σε ένα επίπεδο πολύ κοντά στην τελική γλώσσα. Για παράδειγμα, η εντολή while περιγράφεται στον ενδιάμεσο κώδικα από έναν κόμβο τύπου εντολής while και δύο παιδιά, ένα δείκτη σε ένα δέντρο έκφρασης, κι ένα δείκτη σε μια εντολή ή ένα δέντρο εντολών. Ο τελικός όμως κώδικας δεν έχει καμία εντολή που να υλοποιεί απ ευθείας την εντολή while, κι έτσι η εντολή αυτή υλοποιείται τελικά με τη βοήθεια εντολών διακλάδωσης και άμεσου άλματος: while (expression) statement; L1: if (!expression) goto L2 statement goto L1 L2: Για την εύρεση του ζητούμενου σχήματος δε μας απασχολεί η μετάφραση των παιδιών του κόμβου της εντολής, κάτι που γίνεται με εφαρμογή άλλων σχημάτων παραγωγής τελικού κώδικα. Το σχήμα παραγωγής τελικού κώδικα της εντολής while βασίζεται στο μετασχηματισμό που δείχνει το παραπάνω διάγραμμα και περιλαμβάνει κατ αρχήν τα ακόλουθα βήματα: 1. Κατασκευή ενός νέου κόμβου κάποιας απλής εντολής που εκτελεί άλμα αν το τελούμενό της έχει μηδενική τιμή. Τέτοια απλή εντολή διατίθεται στην αρχιτεκτονική MIPS, αλλά και στις περισσότερες σύγχρονες αρχιτεκτονικές. Έστω ότι ονομάζουμε τον τύπο του κόμβου αυτού εντολή ifzero (ή αλλιώς εντολή iffalse). Ο κόμβος αυτός θα έχει δύο παιδιά, ένα δείκτη στο δέντρο έκφρασης της αρχικής εντολής while, και ένα δείκτη στον κόμβο της εντολής που ακολουθεί την εντολή while. 2. Σύνδεση σε δυαδικό δέντρο του νέου κόμβου, με τον κόμβο εντολής statement που αντιστοιχεί στην εντολή ή στο δέντρο εντολών της εντολής while. 3. Κατασκευή ενός νέου κόμβου εντολής άμεσου άλματος, με τύπο που ονομάζουμε εντολή jump. Ο κόμβος θα έχει ένα παιδί, ένα δείκτη στον πρώτο κόμβο που κατασκευάσαμε. 4. Σύνδεση σε δυαδικό δέντρο του προηγούμενου δέντρου των δύο κόμβων με το νέο κόμβο. 5. Αντικατάσταση του αρχικού κόμβου της εντολής while με το δέντρο των τριών κόμβων που κατασκευάσαμε.

14 14 Μετά την εφαρμογή του πιο πάνω σχήματος, ο νέος κώδικας που λαμβάνουμε έχει την παρακάτω μορφή: statements επόμενη εντολή statements εντολή jump εντολή ifzero statement expression Από τη μορφή αυτή συνεχίζουμε με τις όποιες βελτιστοποιήσεις, και προχωράμε στην παραγωγή τελικού κώδικα με δέσμευση καταχωρητών. Αν στον ενδιάμεσο κώδικα έχουν γίνει βελτιστοποιήσεις που εντοπίζουν κοινές υποεκφράσεις, είναι αναγκαία μια δέσμευση καταχωρητών στο συνολικό δέντρο του κώδικα. Μια τέτοια δέσμευση για την περίπτωση βρόχου που έχουμε εδώ απαιτεί πολύπλοκη ανάλυση ροής ελέγχου και δεδομένων και δε θα μας απασχολήσει στην παρούσα άσκηση. Έτσι, θα υποθέσουμε ότι η δέσμευση καταχωρητών για την έκφραση expression και την εντολή statement γίνεται ανεξάρτητα για τα δύο υποδέντρα, από τα αντίστοιχα σχήματα παραγωγής τελικού κώδικα. Δεδομένου ότι μετά την αποτίμηση της έκφρασης expression η τιμή της θα περιέχεται σε κάποιον καταχωρητή της αρχιτεκτονικής, η πρώτη εντολή τελικού κώδικα που θα εκτελεστεί στη συνέχεια θα παραχθεί από τον πρώτο κόμβο του νέου δέντρου που κατασκευάσαμε, και θα έχει σαν τελούμενο εισόδου τον καταχωρητή αυτόν. Ο καταχωρητής που περιέχει την τιμή της έκφρασης expression είναι και ο μοναδικός καταχωρητής που χρησιμοποιούμε για την εκτέλεση της εντολής while, εκτός βέβαια από όσους χρησιμοποιούμε για την αποτίμηση της έκφρασης, και από όσους χρησιμοποιεί η εντολή statement. Η εντολή άμεσου άλματος δε χρησιμοποιεί καταχωρητές. Σαν τελευταίο βήμα, ο τελικός κώδικας λαμβάνεται με διαπέραση του παραπάνω δέντρου κατά βάθος, και από αριστερά προς τα δεξιά. Ο αλγόριθμος διαπέρασης αγνοεί τις συνδέσεις που αντιστοιχούν σε άλματα, γι αυτό και αυτές έχουν παρασταθεί παραπάνω με διάστικτες γραμμές. Η επιλογή των εντολών MIPS για κάθε κόμβο του δέντρου γίνεται στο βήμα αυτό. Όσο αφορά τους ακριβείς προορισμούς των αλμάτων στους δύο νέους κόμβους που εισάγαμε, αυτοί θα είναι (α) για τον πρώτο, η πρώτη εντολή που εκτελείται στο κόμβο της εντολής που ακολουθεί την εντολή while, και (β) για το δεύτερο, η πρώτη εντολή που εκτελείται για την αποτίμηση της έκφρασης expression. Οι προορισμοί αυτοί δίνονται με ετικέτες, αν ο τελικός κώδικας παράγεται σε συμβολική μορφή. Διαφορετικά, κωδικοποιούνται στις αντίστοιχες εντολές, και μάλιστα με χρήση της τεχνικής του μπαλώματος για τον πρώτο κόμβο, αφού τη στιγμή επεξεργασίας του δε γνωρίζουμε πόσες εντολές μεσολαβούν μέχρι τον προορισμό του άλματος που περιέχει. Έτσι, ένα απόσπασμα εντολών MIPS που μπορούμε να λάβουμε από το πιο πάνω σχήμα παραγωγής τελικού κώδικα είναι το παρακάτω: L1: <κώδικας αποτίμησης έκφρασης, με αποτέλεσμα στον καταχωρητή $8> beq $8,$0,L2 <κώδικας εντολής statement> j L1 L2: <κώδικας εντολής που ακολουθεί την εντολή while>

15 15 Άσκηση 9-2: Να δώσετε ένα σχήμα παραγωγής τελικού κώδικα MIPS για την αποτίμηση των λογικών εκφράσεων της γλώσσας C με βραχυκύκλωση. Υποθέστε ότι ο ενδιάμεσος κώδικας έχει τη μορφή αφηρημένου συντακτικού δέντρου, όπου οι εκφράσεις αναπαριστώνται με δέντρα εκφράσεων. Απάντηση Η ιδιομορφία της βραχυκύκλωσης στην αποτίμηση των λογικών εκφράσεων της C, αλλά και πολλών άλλων γλωσσών προγραμματισμού, είναι ότι διακόπτει την αποτίμησή τους μετά την αποτίμηση της αριστερής υποέκφρασης, αν από αυτή προκύπτει η τιμή της έκφρασης. Για παράδειγμα, στη λογική έκφραση: a (x++ > y) η υποέκφραση x++ > y δεν πρόκειται να αποτιμηθεί, αν η μεταβλητή a έχει λογική τιμή Αληθής, οπότε η αριστερή υποέκφραση παρέχει την τιμή Αληθής για όλη την έκφραση. Ακόμα κι αν η δεξιά υποέκφραση παράγει κάποιο πλάγιο αποτέλεσμα, όπως συμβαίνει παραπάνω, αυτό δε θα αποθηκευτεί. Έτσι, αν στην παραπάνω έκφραση η μεταβλητή a έχει τιμή Αληθής, η μεταβλητή x διατηρεί την προηγούμενη τιμή της. Αντίθετα, αν η μεταβλητή a έ- χει λογική τιμή Ψευδής, η δεξιά υποέκφραση θα αποτιμηθεί, και η μεταβλητή x θα αυξηθεί κατά 1. Παρόμοιο είναι το αποτέλεσμα της βραχυκύκλωσης στην εφαρμογή του λογικού τελεστή && για την αντίστοιχη λογική τιμή Ψευδής. Στην αρχική μορφή του ενδιάμεσου κώδικα σε μορφή αφηρημένου συντακτικού δέντρου, και εφ όσον οι εκφράσεις αναπαριστώνται με δέντρα εκφράσεων, δεν προβάλλεται η δυνατότητα διακοπής της αποτίμησης μιας λογικής έκφρασης. Η βραχυκύκλωση ενσωματώνεται στον κώδικα καθώς προχωράμε, με κατάλληλο σχήμα παραγωγής τελικού κώδικα, προς μια αναπαράσταση χαμηλότερου επιπέδου. Σύμφωνα με τα παραπάνω, για την υλοποίηση της βραχυκύκλωσης για κάποια λογική πράξη, θα χρειαστεί να εισάγουμε στο αφηρημένο συντακτικό δέντρο έναν κόμβο ελέγχου ροής, ο οποίος θα εκτελεί άλμα προς κατάλληλο άλλο κόμβο του δέντρου, ανάλογα με την τιμή της αριστερής υποέκφρασης του κόμβου της λογικής πράξης. Στο παράδειγμα που δώσαμε, αν η μεταβλητή a έχει λογική τιμή Αληθής, ο κώδικάς μας πρέπει να εκτελεί άλμα στον κώδικα που ακολουθεί την αποτίμηση της λογικής έκφρασης, υπερπηδώντας τον κώδικα αποτίμησης της δεξιάς υποέκφρασης.. Ο κόμβος ελέγχου ροής όμως δεν αρκεί να εκτελεί άλμα υπό συνθήκη, αλλά πρέπει και να παράγει κάποια τιμή, αφού η αποτίμηση μιας έκφρασης πρέπει να ολοκληρώνεται μετά τη βραχυκύκλωση. Πιο συγκεκριμένα, το άλμα που εκτελείται σε μια βραχυκύκλωση πρέπει να μεταφέρει και την τιμή της αριστερής υποέκφρασης στον κόμβο προορισμού. Έτσι, στο παραπάνω παράδειγμα, σε περίπτωση βραχυκύκλωσης η τιμή της μεταβλητής a πρέπει να αποτελέσει την τελική τιμή της λογικής έκφρασης. Αν μάλιστα αυτή είναι μέρος μεγαλύτερης έκφρασης, η τιμή αυτή θα χρησιμοποιηθεί για την αποτίμηση της υπόλοιπης έκφρασης. Επομένως, ο κόμβος ελέγχου ροής που θα εισάγουμε πρέπει να λειτουργεί και ως τελεστής, ο οποίος εφαρμοζόμενος σε ένα τελούμενο-υποέκφραση του δέντρου παράγει ως αποτέλεσμα την τιμή αυτού, και ανάλογα με αυτή, εκτελεί άλμα σε κάποιον άλλο κόμβο του δέντρου. Έχοντας εξασφαλίσει ότι οι νέοι κόμβοι παράγουν τιμές, μπορούμε να χρησιμοποιήσουμε στη συνέχεια τη γνωστή διαδικασία παραγωγής τελικού κώδικα από δέντρα εκφράσεων, όπου κάθε κόμβος αποτιμάται μετά την αποτίμηση των παιδιών του, και ο τελικός κώδικας που αντιστοιχεί στο δέντρο παράγεται με διαπέραση αυτού κατά βάθος, και από αριστερά προς τα δεξιά.

16 16 Το σχήμα παραγωγής τελικού κώδικα για λογικές εκφράσεις με βραχυκύκλωση εφαρμόζεται με δύο διαδοχικές διαπεράσεις του δέντρου έκφρασης, κατά βάθος και από αριστερά προς τα δεξιά. Στην πρώτη διαπέραση γίνεται και η αρίθμηση των κόμβων του δέντρου με τη σειρά αποτίμησής τους. Ειδικότερα, για κάθε κόμβο λογικής πράξης: (α) Επισκεπτόμαστε το αριστερό παιδί του κόμβου. (β) Κατασκευάζουμε ένα νέο κόμβο τύπου άλματος με συνθήκη, στον οποίο συνδέουμε το παραπάνω παιδί. Το πεδίο προορισμού άλματος του κόμβου αυτού θα το συμπληρώσουμε στην επόμενη διαπέραση του δέντρου. (γ) Αριθμούμε το νέο κόμβο. (δ) Αντικαθιστούμε το αριστερό παιδί του αρχικού κόμβου με τον παραπάνω κόμβο, και συνεχίζουμε τη διαπέραση με επίσκεψη του δεξιού παιδιού του αρχικού κόμβου. Με την αρίθμηση που κάναμε στην παραπάνω διαπέραση, το πεδίο προορισμού άλματος κάθε νέου κόμβου μπορεί να δείχνει στον κόμβο με αριθμό κατά 1 μεγαλύτερο από τον αριθμό κόμβου του πατέρα του, επειδή αυτός ο αριθμός αντιστοιχεί στον κόμβο που αποτιμάται αμέσως μετά τη λογική πράξη. Όμως, για να λάβουμε τιμή αποτελέσματος από τη λογική πράξη για κάθε περίπτωση τιμής της αριστερής υποέκφρασης, το πεδίο προορισμού θα πρέπει να δείχνει στον ίδιο τον πατέρα του κόμβου άλματος, ο οποίος σύμφωνα με τα παραπάνω είναι ο κόμβος της λογικής πράξης. Στην περίπτωση βραχυκύκλωσης, η τιμή της αριστερής υποέκφρασης είναι και το αποτέλεσμα της πράξης, ανεξάρτητα από την άλλη τιμή που συμμετέχει στην πράξη, ενώ στην περίπτωση πλήρους υπολογισμού, η τιμή της αριστερής υποέκφρασης είναι το ουδέτερο στοιχείο της πράξης, και το αποτέλεσμα καθορίζεται από την τιμή της δεξιάς υποέκφρασης. Τη δεύτερη διαπέραση του δέντρου τη χρησιμοποιούμε, ώστε να καλύψουμε λογικές εκφράσεις με διαδοχικές εφαρμογές του ίδιου τελεστή, οπότε η βραχυκύκλωση επεκτείνεται σε πολλαπλούς κόμβους. Ειδικότερα, στη δεύτερη διαπέραση, μόλις βρούμε έναν κόμβο άλματος με συνθήκη, θα εφαρμόσουμε τον εξής αλγόριθμο: 1. Θέσε σε μια μεταβλητή x τον αριθμό του πατέρα του κόμβου. 2. Όσο υπάρχει πατέρας του κόμβου με αριθμό x και είναι του ίδιου τύπου άλματος με συνθήκη, θέσε στη μεταβλητή x τον αριθμό του πατέρα του πατέρα του x. 3. Ο αριθμός που θα μπει στο πεδίο προορισμού άλματος του κόμβου θα είναι το x. Η ορθότητα του παραπάνω αλγόριθμου στηρίζεται στην παρατήρηση ότι ο πατέρας του πατέρα του κόμβου είναι του ίδιου τύπου άλματος με συνθήκη, μόνο όταν έχουμε διαδοχική εφαρμογή του ίδιου λογικού τελεστή. Αυτό συμβαίνει επειδή (α) οι κόμβοι άλματος με συνθήκη εισάγονται μόνο για λογικούς τελεστές, και (β) οι δυαδικοί λογικοί τελεστές και && της C εξετάζουν διαφορετική συνθήκη στους κόμβους αυτούς. Ας δούμε για παράδειγμα τη μορφή που λαμβάνει το δέντρο έκφρασης για την απλή έκφραση: expr1 expr2 μετά την εφαρμογή του παραπάνω σχήματος: n2 iftrue expr2 n1+1 n2-1 n1 expr1

17 17 όπου σε κάθε κόμβο του δέντρου αναγράφεται και ο αριθμός του. Ο τελεστής άλματος με συνθήκη για τη λογική πράξη Η συμβολίζεται με το όνομα iftrue και ελέγχει το τελούμενό του για λογική τιμή Αληθής. Αν αυτή είναι η τιμή της έκφρασης expr1, τότε η έκφραση expr2 δε θα αποτιμηθεί, και η λογική πράξη Η θα έχει επίσης αποτέλεσμα Αληθής, διαφορετικά θα αποτιμηθεί η expr2 και η λογική πράξη Η θα έχει ως αποτέλεσμα την τιμή της expr2. Η αρίθμηση των κόμβων του δέντρου έκφρασης, εκτός από τη σειρά αποτίμησης, μας δίνει και τους αριθμούς των προσωρινών μεταβλητών που χρησιμοποιούνται για την αποτίμηση της έκφρασης. Έτσι, ένας αλγόριθμος δέσμευσης καταχωρητών θα μας δώσει τους καταχωρητές της τελικής γλώσσας που θα αντιστοιχηθούν στις μεταβλητές αυτές. Μια απλή διαπέραση του τελικού αφηρημένου συντακτικού δέντρου θα μας δώσει και τον τελικό κώδικα, με μία ή δύο εντολές ανά κόμβο του δέντρου. Ένας κώδικας MIPS που παράγεται για την προηγούμενη λογική έκφραση μπορεί να είναι ο ακόλουθος: <κώδικας αποτίμησης έκφρασης expr1, με αποτέλεσμα στον καταχωρητή $5> or $9,$5,$0 bne $5,$0,L <κώδικας αποτίμησης έκφρασης expr2, με αποτέλεσμα στον καταχωρητή $8> L: or $6,$9,$8 όπου η πρώτη εντολή or προκύπτει από τον κόμβο άλματος, και αντιγράφει την τιμή του καταχωρητή $5 που αντιστοιχήθηκε στον κόμβο n1 στον καταχωρητή $9 που αντιστοιχήθηκε στον κόμβο άλματος, με την εντολή διακλάδωσης να ολοκληρώνει τον κώδικα του κόμβου άλματος. Παρατηρήστε ότι ο καταχωρητής $8 δε λαμβάνει τιμή αν η εντολή διακλάδωσης εκτελεί άλμα, αλλά αυτό συμβαίνει μόνο αν ο καταχωρητής $5 έχει μη μηδενική τιμή, οπότε η λογική πράξη θα έχει αποτέλεσμα Αληθής, ανεξάρτητα από την τιμή του $8. Αν πάλι το άλμα δεν εκτελείται, αυτό θα συμβαίνει με μηδενική τιμή του $5, οπότε η λογική πράξη θα έχει ως αποτέλεσμα την τιμή του $8. Ας δούμε τώρα τη μορφή του δέντρου για την πιο σύνθετη έκφραση: expr1 expr2 expr3 expr4 που λαμβάνουμε μετά την εφαρμογή του παραπάνω σχήματος: n4 iftrue expr4 n3+1 n4-1 n3 iftrue expr3 n2+1 n3-1 n2 iftrue expr2 n1+1 n2-1 expr1 n1 Και στις τρεις περιπτώσεις εφαρμογής του τελεστή αυτού, το πεδίο προορισμού άλματος περιέχει δείκτη στον κόμβο με αριθμό n4.

18 18 Εδώ όμως δεν έχουμε ακόμα τελειώσει, γιατί ναι μεν εξασφαλίσαμε την αντιγραφή της τιμής μιας αριστερής υποέκφρασης στον κόμβο άλματος, αλλά τι γίνεται αν ο κόμβος προορισμού του άλματος δεν είναι ο ίδιος ο πατέρας του κόμβου άλματος; Μ άλλα λόγια, με το παραπάνω σχήμα η εκτέλεση άλματος στην περίπτωση βραχυκύκλωσης αποτυγχάνει να μεταφέρει την τιμή της λογικής έκφρασης στον κόμβο λογικής πράξης που είναι ο προορισμός του άλματος. Ευτυχώς, το πρόβλημα αυτό μπορεί να αντιμετωπιστεί στη φάση δέσμευσης καταχωρητών. Κατ αρχήν παρατηρούμε ότι ο κόμβος άλματος με συνθήκη αντιγράφει την τιμή της αριστερής υποέκφρασης του αρχικού κόμβου λογικής πράξης στην προσωρινή μεταβλητή που του αντιστοιχείται. Επειδή δεν υπάρχει αλληλεπίδραση μεταξύ των δύο κόμβων, καθότι ο πρώτος είναι πατέρας του δεύτερου στο δέντρο έκφρασης, μπορούμε να υποχρεώσουμε τον αλγόριθμο δέσμευσης καταχωρητών να αποδώσει σε αυτούς τον ίδιο καταχωρητή οπότε βέβαια η αντιγραφή δεν έχει πια νόημα. Παρόμοια, δεν υπάρχει αλληλεπίδραση μεταξύ του κόμβου άλματος με συνθήκη και του κόμβου αποτίμησης της λογικής έκφρασης, κι επομένως στους δύο αυτούς κόμβους μπορεί να αποδοθεί ο ίδιος καταχωρητής. Συνεχίζοντας, μπορούμε να αποδίδουμε τον ίδιο καταχωρητή, μέχρι να βρούμε τον κόμβο προορισμού του άλματος. Η ορθότητα της αποτίμησης της λογικής έκφρασης στον τελικό κώδικα σε περίπτωση βραχυκύκλωσης εξασφαλίζεται με τον παραπάνω τρόπο, αφού έτσι ο καταχωρητής από τον οποίο αυτή θα ληφθεί θα έχει λάβει τιμή από τον κόμβο που αποτιμά την αντίστοιχη αριστερή υποέκφραση. Σε περίπτωση μη βραχυκύκλωσης από την άλλη μεριά, η τιμή του καταχωρητή συνεχίζει να είναι έγκυρη, ώστε να χρησιμοποιηθεί για την αποτίμηση της λογικής έκφρασης, επειδή ο καταχωρητής αυτός δε μπορεί να χρησιμοποιείται από άλλον κώδικα που μεσολαβεί, λόγω αλληλεπίδρασης με όλους τους κόμβους των αντίστοιχων δεξιών υποεκφράσεων. Ένας κώδικας MIPS που παράγεται για την προηγούμενη λογική έκφραση, εφαρμόζοντας και τον παραπάνω περιορισμό στη δέσμευση καταχωρητών, μπορεί να είναι ο ακόλουθος: <κώδικας αποτίμησης έκφρασης expr1, με αποτέλεσμα στον καταχωρητή $5> bne $5,$0,L <κώδικας αποτίμησης έκφρασης expr2, με αποτέλεσμα στον καταχωρητή $8> or $5,$5,$8 bne $5,$0,L <κώδικας αποτίμησης έκφρασης expr3, με αποτέλεσμα στον καταχωρητή $12> or $5,$5,$12 bne $5,$0,L <κώδικας αποτίμησης έκφρασης expr4, με αποτέλεσμα στον καταχωρητή $6> L: or $5,$5,$6 Άσκηση 9-3: Έστω η παρακάτω έκφραση της γλώσσας C: a[i*j+1][k-2]/5 * b[i][w*m[j]][k+1] c * (k+3) Λαμβάνοντας υπ όψη ότι (α) οι πίνακες a και b είναι δηλωμένοι στην αρχή της εξωτερικής μονάδας ως int[1000][10] και int[100][1000][10], αντίστοιχα, (β) ο πίνακας m είναι δηλωμένος στην εξωτερική μονάδα, αμέσως μετά τους προηγούμενους, ως short[100], (γ) η καθολική μεταβλητή c είναι τύπου int και δηλωμένη αμέσως μετά τον πίνακα m, (δ) οι μεταβλητές στοίβας i, j και k είναι τύπου int, και έχουν δεσμεύσει διαδοχικές θέσεις στη στοίβα, ξεκινώντας από τη θέση 8, όταν οι προηγούμενες θέσεις έχουν αντιστοιχηθεί σε αντικείμενα μεγέθους ίσου με το μέγεθος του τύπου int, (ε) η μεταβλητή w είναι τύπου short και είναι τοποθετημένη στη στοίβα, αμέσως μετά τις προηγούμενες, (στ) η έκφραση είναι τύπου int, και (ζ) τα αντικείμενα των τύπων int και short έχουν μέγεθος 4 και 2 bytes, αντίστοιχα: Α. Να δεσμεύσετε καταχωρητές για την έκφραση αυτή, σε ένα μεταγλωττιστή του οποίου ο ενδιάμεσος κώδικας έχει μορφή αφηρημένου συντακτικού δέντρου. Πριν τη δέσμευση καταχωρη-

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

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 9 ο Γιώργος Δημητρίου Μάθημα 9 ο Ενδιάμεσος Κώδικας Απεικόνιση ανάμεσα στον αρχικό και στον τελικό κώδικα Γραμμικές αναπαραστάσεις: Ενδιάμεσος κώδικας πλησιέστερα στον τελικό ευκολότερη παραγωγή τελικού κώδικα

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τμήμα Πληροφορικής Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τμήμα Πληροφορικής Μεταγλωττιστές Στοίβα Εκτέλεσης και Εγγραφήματα Δραστηριοποίησης Σε όλες σχεδόν τις μοντέρνες γλώσσες προγραμματισμού,

Διαβάστε περισσότερα

Πανεπιστήμιο Θεσσαλίας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων

Πανεπιστήμιο Θεσσαλίας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων Πανεπιστήμιο Θεσσαλίας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων Οργάνωση Η/Υ Ενότητα 1η: Εισαγωγή στην Οργάνωση Η/Υ Άσκηση 1: Αναλύστε τη διαδοχική εκτέλεση των παρακάτω εντολών MIPS με βάση τις

Διαβάστε περισσότερα

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

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 1 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Γιώργος Δημητρίου Μάθημα 1 ο Γλώσσα - Μετάφραση Γλώσσα προγραμματισμού = Αναπαράσταση αλγορίθμων Ευκολία χρήσης Ακρίβεια και πληρότητα περιγραφής, όχι διφορούμενη! Μία περιγραφή για όλες τις μηχανές Μετάφραση

Διαβάστε περισσότερα

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων Άσκηση 1 α) Η δομή σταθμισμένης ένωσης με συμπίεση διαδρομής μπορεί να τροποποιηθεί πολύ εύκολα ώστε να υποστηρίζει τις

Διαβάστε περισσότερα

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

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Δεύτερη Σειρά Ασκήσεων 22 Νοεμβρίου 2016 Μέρος Α. (χειρόγραφη και ηλεκτρονική παράδοση 9 Δεκεμβρίου) Άσκηση 1: Θεωρήστε τη

Διαβάστε περισσότερα

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

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Αρχιτεκτονική Υπολογιστών Άσκηση 6: Ασκήσεις Εξαμήνου Μέρος Β Νοέμβριος 2016 Στην άσκηση αυτή θα μελετήσουμε την εκτέλεση ενός

Διαβάστε περισσότερα

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

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τμήμα Πληροφορικής Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τμήμα Πληροφορικής Άσκηση 6: Ασκήσεις Χειμερινού Εξαμήνου 2017-2018 (μέρος Β ) Στην άσκηση αυτή θα μελετήσουμε την εκτέλεση

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής

Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής Δεύτερη Σειρά Ασκήσεων 22 Νοεμβρίου 2016 (χειρόγραφη και ηλεκτρονική παράδοση 9 Δεκεμβρίου) Άσκηση 1: Θεωρήστε τη γραμματική με κανόνες: Α B a A a c B B b A b

Διαβάστε περισσότερα

Ψευδοκώδικας. November 7, 2011

Ψευδοκώδικας. November 7, 2011 Ψευδοκώδικας November 7, 2011 Οι γλώσσες τύπου ψευδοκώδικα είναι ένας τρόπος περιγραφής αλγορίθμων. Δεν υπάρχει κανένας τυπικός ορισμός της έννοιας του ψευδοκώδικα όμως είναι κοινός τόπος ότι οποιαδήποτε

Διαβάστε περισσότερα

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

Ανάπτυξη και Σχεδίαση Λογισμικού Ανάπτυξη και Σχεδίαση Λογισμικού Η γλώσσα προγραμματισμού C Γεώργιος Δημητρίου Εκφράσεις και Λίγες Εντολές Οι εκφράσεις της C Τελεστές Απλές και σύνθετες εντολές Εντολές ελέγχου (επιλογής) Εισαγωγή σε

Διαβάστε περισσότερα

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

Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού Προπτυχιακό μάθημα Αρχές Γλωσσών Προγραμματισμού Π. Ροντογιάννης 1 Μεταγλωττιστής Πρόγραμμα Διαβάζει προγράμματα δεδομένης γλώσσας (πηγαία γλώσσα) και τα μετατρέπει

Διαβάστε περισσότερα

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

Προβλήματα, αλγόριθμοι, ψευδοκώδικας Προβλήματα, αλγόριθμοι, ψευδοκώδικας October 11, 2011 Στο μάθημα Αλγοριθμική και Δομές Δεδομένων θα ασχοληθούμε με ένα μέρος της διαδικασίας επίλυσης υπολογιστικών προβλημάτων. Συγκεκριμένα θα δούμε τι

Διαβάστε περισσότερα

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

Πληροφορική 2. Αλγόριθμοι Πληροφορική 2 Αλγόριθμοι 1 2 Τι είναι αλγόριθμος; Αλγόριθμος είναι ένα διατεταγμένο σύνολο από σαφή βήματα το οποίο παράγει κάποιο αποτέλεσμα και τερματίζεται σε πεπερασμένο χρόνο. Ο αλγόριθμος δέχεται

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

10. Με πόσους και ποιους τρόπους μπορεί να αναπαρασταθεί ένα πρόβλημα; 11. Περιγράψτε τα τρία στάδια αντιμετώπισης ενός προβλήματος.

10. Με πόσους και ποιους τρόπους μπορεί να αναπαρασταθεί ένα πρόβλημα; 11. Περιγράψτε τα τρία στάδια αντιμετώπισης ενός προβλήματος. 1. Δώστε τον ορισμό του προβλήματος. 2. Σι εννοούμε με τον όρο επίλυση ενός προβλήματος; 3. Σο πρόβλημα του 2000. 4. Σι εννοούμε με τον όρο κατανόηση προβλήματος; 5. Σι ονομάζουμε χώρο προβλήματος; 6.

Διαβάστε περισσότερα

Ενδεικτικές Ερωτήσεις Θεωρίας

Ενδεικτικές Ερωτήσεις Θεωρίας Ενδεικτικές Ερωτήσεις Θεωρίας Κεφάλαιο 2 1. Τι καλούμε αλγόριθμο; 2. Ποια κριτήρια πρέπει οπωσδήποτε να ικανοποιεί ένας αλγόριθμος; 3. Πώς ονομάζεται μια διαδικασία που δεν περατώνεται μετά από συγκεκριμένο

Διαβάστε περισσότερα

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

Γλώσσες Προγραμματισμού Μεταγλωττιστές Γλώσσες Προγραμματισμού Μεταγλωττιστές Παραγωγή Ενδιάμεσου Κώδικα Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου Δομή Παραγωγή ενδιάμεσου κώδικα. Ενδιάμεσες γλώσσες. Αφηρημένα

Διαβάστε περισσότερα

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120) Προγραμματισμός Ι (ΗΥ120) Διάλεξη 9: Συναρτήσεις Ορισμός συναρτήσεων () { /* δήλωση μεταβλητών */ /* εντολές ελέγχου/επεξεργασίας */ o Μια συνάρτηση ορίζεται δίνοντας

Διαβάστε περισσότερα

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

Ανάπτυξη και Σχεδίαση Λογισμικού Ανάπτυξη και Σχεδίαση Λογισμικού Η γλώσσα προγραμματισμού C Γεώργιος Δημητρίου Συναρτήσεις (Functions) Οι βασικές λειτουργικές ενότητες ενός προγράμματος C Καλούνται με ορίσματα που αντιστοιχούνται σε

Διαβάστε περισσότερα

Διαχρονικές δομές δεδομένων

Διαχρονικές δομές δεδομένων Διαχρονικές δομές δεδομένων Μια τυπική δομή δεδομένων μεταβάλλεται με πράξεις εισαγωγής ή διαγραφής Π.χ. κοκκινόμαυρο δένδρο εισαγωγή 0 18 0 5 39 73 1 46 6 80 Αποκατάσταση ισορροπίας 5 39 73 0 46 6 80

Διαβάστε περισσότερα

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

Προγραμματισμός Ι (HY120) Προγραμματισμός Ι (HY20) # μνήμη & μεταβλητές πρόγραμμα & εκτέλεση Ψηφιακά δεδομένα, μνήμη, μεταβλητές 2 Δυαδικός κόσμος Οι υπολογιστές είναι δυαδικές μηχανές Όλη η πληροφορία (δεδομένα και κώδικας) κωδικοποιείται

Διαβάστε περισσότερα

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

Η γλώσσα προγραμματισμού Strange Προγραμματιστική άσκηση: Η γλώσσα προγραμματισμού Strange Η Strange είναι μια μικρή γλώσσα προγραμματισμού. Παρόλο που οι προγραμματιστικές της ικανότητες είναι μικρές, η εκπαιδευτική αυτή γλώσσα περιέχει

Διαβάστε περισσότερα

Κεφάλαιο 2 ο Βασικές Έννοιες Αλγορίθμων (σελ )

Κεφάλαιο 2 ο Βασικές Έννοιες Αλγορίθμων (σελ ) Κεφάλαιο 2 ο Βασικές Έννοιες Αλγορίθμων (σελ. 25 48) Τι είναι αλγόριθμος; Γ ΛΥΚΕΙΟΥ Αλγόριθμος είναι μία πεπερασμένη σειρά ενεργειών, αυστηρά καθορισμένων και εκτελέσιμων σε πεπερασμένο χρονικό διάστημα,

Διαβάστε περισσότερα

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting) Εργαστήριο 3: 3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting) Η C++, όπως όλες οι γλώσσες προγραμματισμού, χρησιμοποιεί τελεστές για να εκτελέσει τις αριθμητικές και λογικές λειτουργίες.

Διαβάστε περισσότερα

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο Εισαγωγή στο Bison Μεταγλωττιστές, Χειμερινό εξάμηνο 2016-2017 Συντακτική Ανάλυση Αποτελεί την δεύτερη φάση της μετάφρασης. Εύρεση της σχέσης που υπάρχει των λεκτικών μονάδων ενός προγράμματος. Παράδειγμα

Διαβάστε περισσότερα

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

Μεταγλωττιστές Βελτιστοποίηση Μεταγλωττιστές Βελτιστοποίηση Νίκος Παπασπύρου nickie@softlab.ntua.gr Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχ. Υπολογιστών Εργαστήριο Τεχνολογίας Λογισμικού Πολυτεχνειούπολη, 15780

Διαβάστε περισσότερα

Ερωτήσεις πολλαπλής επιλογής - Κεφάλαιο 2. Α1. Ο αλγόριθμος είναι απαραίτητος μόνο για την επίλυση προβλημάτων πληροφορικής

Ερωτήσεις πολλαπλής επιλογής - Κεφάλαιο 2. Α1. Ο αλγόριθμος είναι απαραίτητος μόνο για την επίλυση προβλημάτων πληροφορικής Ερωτήσεις πολλαπλής επιλογής - Κεφάλαιο 2 Α1. Ο αλγόριθμος είναι απαραίτητος μόνο για την επίλυση προβλημάτων πληροφορικής Α2. Ο αλγόριθμος αποτελείται από ένα πεπερασμένο σύνολο εντολών Α3. Ο αλγόριθμος

Διαβάστε περισσότερα

Θέματα Μεταγλωττιστών

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

Διαβάστε περισσότερα

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

Γλώσσες Προγραμματισμού Μεταγλωττιστές Γλώσσες Προγραμματισμού Μεταγλωττιστές Παραγωγή Τελικού Κώδικα Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου Δομή Παραγωγή Τελικού κώδικα. Οργάνωση μνήμης Εγγραφήματα Δραστηριοποίησης

Διαβάστε περισσότερα

1. Πότε χρησιμοποιούμε την δομή επανάληψης; Ποιες είναι οι διάφορες εντολές (μορφές) της;

1. Πότε χρησιμοποιούμε την δομή επανάληψης; Ποιες είναι οι διάφορες εντολές (μορφές) της; 1. Πότε χρησιμοποιούμε την δομή επανάληψης; Ποιες είναι οι διάφορες (μορφές) της; Η δομή επανάληψης χρησιμοποιείται όταν μια σειρά εντολών πρέπει να εκτελεστεί σε ένα σύνολο περιπτώσεων, που έχουν κάτι

Διαβάστε περισσότερα

Οργάνωση επεξεργαστή (1 ο μέρος) ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

Οργάνωση επεξεργαστή (1 ο μέρος) ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική Οργάνωση επεξεργαστή (1 ο μέρος) ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική Κώδικας μηχανής (E) Ο επεξεργαστής μπορεί να εκτελέσει το αρχιτεκτονικό σύνολο εντολών (instruction set architecture) Οι

Διαβάστε περισσότερα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΑΝΑΠΤΥΞΗ ΚΑΙ ΣΧΕΔΙΑΣΗ ΛΟΓΙΣΜΙΚΟΥ Η γλώσσα προγραμματισμού C ΕΡΓΑΣΤΗΡΙΟ 2: Εκφράσεις, πίνακες και βρόχοι 14 Απριλίου 2016 Το σημερινό εργαστήριο

Διαβάστε περισσότερα

Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη

Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative

Διαβάστε περισσότερα

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

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Τμήμα Πληροφορικής Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Τμήμα Πληροφορικής Άσκηση : Λυμένες Ασκήσεις Έστω ένα σύστημα μνήμης, στο οποίο έχουμε προσθέσει μια κρυφή μνήμη θυμάτων 6 θέσεων

Διαβάστε περισσότερα

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

Μέρος 2 Κατασκευή Συντακτικού Αναλυτή Αντίρριο, 05/04/2017 Προδιαγραφές Εργαστηριακής Εργασίας για το μάθημα «Μεταγλωττιστές» To δεύτερο μέρος της εργασίας έχει ως στόχο την ανάπτυξη του συντακτικού αναλυτή με χρήση του bison / byacc. Στο

Διαβάστε περισσότερα

Διασυνδεδεμένες Δομές. Δυαδικά Δέντρα. Προγραμματισμός II 1

Διασυνδεδεμένες Δομές. Δυαδικά Δέντρα. Προγραμματισμός II 1 Διασυνδεδεμένες Δομές Δυαδικά Δέντρα Προγραμματισμός II 1 lalis@inf.uth.gr Δέντρα Τα δέντρα είναι κλασικές αναδρομικές δομές Ένα δέντρο αποτελείται από υποδέντρα, καθένα από τα οποία μπορεί να θεωρηθεί

Διαβάστε περισσότερα

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ Μέρος 4ο ΝΙΚΟΛΑΟΣ ΣΤΕΡΓΙΟΥΛΑΣ ΤΜΗΜΑ ΦΥΣΙΚΗΣ ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ 1 ΟΙ ΤΕΛΕΣΤΕΣ ΣΥΓΚΡΙΣΗΣ Με τους τελεστές σύγκρισης, συγκρίνουμε τις

Διαβάστε περισσότερα

Θέματα Μεταγλωττιστών

Θέματα Μεταγλωττιστών Γιώργος Δημητρίου Ενότητα 7 η : Περιοχές: Εναλλακτική Μέθοδος Ανάλυσης Ροής Δεδομένων Περιοχές (Regions) Σε κάποιες περιπτώσεις βρόχων η ανάλυση ροής δεδομένων με τον επαναληπτικό αλγόριθμο συγκλίνει αργά

Διαβάστε περισσότερα

Επιλέξτε Σωστό ή Λάθος για καθένα από τα παρακάτω:

Επιλέξτε Σωστό ή Λάθος για καθένα από τα παρακάτω: Επιλέξτε Σωστό ή Λάθος για καθένα από τα παρακάτω: 1ο ΓΕΛ Καστοριάς Βασικές Έννοιες Αλγορίθμων Δομή Ακολουθίας (κεφ. 2 και 7 σχολικού βιβλίου) 1. Οι μεταβλητές αντιστοιχίζονται από τον μεταγλωττιστή κάθε

Διαβάστε περισσότερα

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf(%u\n, x); Β. unsigned char ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Β Περιόδου 2015 (8/9/2015) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................

Διαβάστε περισσότερα

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

Σου προτείνω να τυπώσεις τις επόμενες τέσσερις σελίδες σε ένα φύλο διπλής όψης και να τις έχεις μαζί σου για εύκολη αναφορά. AeppAcademy.com facebook.com/aeppacademy Γεια. Σου προτείνω να τυπώσεις τις επόμενες τέσσερις σελίδες σε ένα φύλο διπλής όψης και να τις έχεις μαζί σου για εύκολη αναφορά. Καλή Ανάγνωση & Καλή Επιτυχία

Διαβάστε περισσότερα

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες Σκοπός της Άσκησης ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ Ο σκοπός αυτής της εργαστηριακής άσκησης είναι η εξοικείωση με τη χρήση των δεικτών (pointers). Οι δείκτες δίνουν την δυνατότητα σε προγράμματα να προσομοιώνουν τη

Διαβάστε περισσότερα

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L. Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L. Hennessy Chapter 2 Εντολές : Η γλώσσα του υπολογιστή (συνέχεια) Διαφάνειες διδασκαλίας από το πρωτότυπο αγγλικό βιβλίο (4 η έκδοση), μετάφραση:

Διαβάστε περισσότερα

Πανεπιστήµιο Θεσσαλίας Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ικτύων

Πανεπιστήµιο Θεσσαλίας Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ικτύων Πανεπιστήµιο Θεσσαλίας Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ικτύων Αρχιτεκτονική Υπολογιστών Εργασία Εξαµήνου: Προσοµοίωση ARM σε επίπεδο VHDL/Verilog 1. Μελέτη συνόλου εντολών και αρχιτεκτονικής ARM

Διαβάστε περισσότερα

Δομές Ακολουθίας- Επιλογής - Επανάληψης. Δομημένος Προγραμματισμός

Δομές Ακολουθίας- Επιλογής - Επανάληψης. Δομημένος Προγραμματισμός Δομές Ακολουθίας- Επιλογής - Επανάληψης Δομημένος Προγραμματισμός 1 Βασικές Έννοιες αλγορίθμων Σταθερές Μεταβλητές Εκφράσεις Πράξεις Εντολές 2 Βασικές Έννοιες Αλγορίθμων Σταθερά: Μια ποσότητα που έχει

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα: Συναρτήσεις θεωρία Δ. Ε. Μετάφας Τμ. Ηλεκτρονικών Μηχ. Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

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

Μεταγλωττιστές Βελτιστοποίηση Βελτιστοποίηση (i) Μεταγλωττιστές Βελτιστοποίηση Νίκος Παπασπύρου nickie@softlab.ntua.gr Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχ. Υπολογιστών Εργαστήριο Τεχνολογίας Λογισμικού Πολυτεχνειούπολη,

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομημένος Προγραμματισμός (ΤΛ1006) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής

Διαβάστε περισσότερα

Μεταγλωττιστές. Σημασιολογική Ανάλυση. Εργαστήριο 9. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

Μεταγλωττιστές. Σημασιολογική Ανάλυση. Εργαστήριο 9. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι Μεταγλωττιστές Εργαστήριο 9 Σημασιολογική Ανάλυση Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι 2016-2017 Σύνταξη και Σημασιολογία Σε οποιαδήποτε γλώσσα (προγραμματισμού ή μη) υπάρχουν δύο βασικές

Διαβάστε περισσότερα

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

Ανάπτυξη και Σχεδίαση Λογισμικού Ανάπτυξη και Σχεδίαση Λογισμικού Η γλώσσα προγραμματισμού C Γεώργιος Δημητρίου Συναρτήσεις της C Τα Λοιπά Στοίβα και μηχανισμός κλήσης Αναδρομικές συναρτήσεις Στατικές μεταβλητές Άλλα θέματα Μηχανισμός

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Θεωρητικές Ασκήσεις. ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ. 1 ο Μέρος

Θεωρητικές Ασκήσεις. ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ. 1 ο Μέρος ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ. 1 ο Μέρος Θέμα 1 Δίνονται τα παρακάτω τμήματα αλγορίθμου Α. βαλίτσα Αληθής εισιτήριο Αληθής ταξίδι βαλίτσα και εισιτήριο Τι τιμή θα έχει η λογική μεταβλητή

Διαβάστε περισσότερα

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

Προγραμματισμός Ι (HY120) Προγραμματισμός Ι (HY120) #3 τελεστές 1 Σπύρος Λάλης Τελεστής ανάθεσης Το σύμβολο της ανάθεσης είναι το = προσοχή: το σύμβολο ελέγχου ισότητας είναι το == Η μορφή των προτάσεων = 1. Αποτιμάται

Διαβάστε περισσότερα

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 2 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 2 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής Γιώργος Δημητρίου Μάθημα 2 ο Σύνολα Εντολών Οι εντολές που εκτελεί ο κάθε επεξεργαστής (ή οικογένεια επεξεργαστών) MIPS ARM SPARC PowerPC IA-32 Αρχιτεκτονικές συνόλου εντολών Βασικές Έννοιες Εντολές μηχανής

Διαβάστε περισσότερα

Εισαγωγή. Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής

Εισαγωγή. Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής Εισαγωγή Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής Μεταγλωττιστής Αρχικό πρόγραμμα (source program) Μεταγλωττιστής Τελικό πρόγραμμα (object program) Διαγνωστικά μηνύματα Μεταγλωττιστής Παίρνει σαν

Διαβάστε περισσότερα

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ ΠΡΩΤΗ ΠΡΟΟΔΟΣ ΣΤΗΝ «ΟΡΓΑΝΩΣΗ ΚΑΙ ΣΧΕΔΙΑΣΗ Η/Y» ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ ΠΡΩΤΗ ΠΡΟΟΔΟΣ ΣΤΗΝ «ΟΡΓΑΝΩΣΗ ΚΑΙ ΣΧΕΔΙΑΣΗ Η/Y» Σάββατο, 31 Οκτωβρίου 2015 ΔΙΑΡΚΕΙΑ ΔΙΑΓΩΝΙΣΜΑΤΟΣ 150 ΛΕΠΤΑ ΘΕΜΑ 1.

Διαβάστε περισσότερα

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική Ενότητα 7: Συναρτήσεις Νικόλαος Στεργιούλας Τμήμα Φυσικής Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

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

ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ : ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΤΑΞΗ : Γ ΛΥΚΕΙΟΥ ΣΠΟΥΔΕΣ ΟΙΚΟΝΟΜΙΑΣ & ΠΛΗΡΟΦΟΡΙΚΗΣ ΔΙΑΓΩΝΙΣΜΑ ΠΕΡΙΟΔΟΥ : ΜΑΪΟΥ ΑΡΧΗ 1ης ΣΕΛΙ ΑΣ ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ : ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΤΑΞΗ : Γ ΛΥΚΕΙΟΥ ΣΠΟΥΔΕΣ ΟΙΚΟΝΟΜΙΑΣ & ΠΛΗΡΟΦΟΡΙΚΗΣ ΔΙΑΓΩΝΙΣΜΑ ΠΕΡΙΟΔΟΥ : ΜΑΪΟΥ ΣΥΝΟΛΟ ΣΕΛΙΔΩΝ : 7 ΘΕΜΑ Α : Α1. Να

Διαβάστε περισσότερα

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

ΓΛΩΣΣΑ ΑΛΦΑΒΗΤΟ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΣΤΑΘΕΡΕΣ ΜΕΤΑΒΛΗΤΕΣ ΓΛΩΣΣΑ ΑΛΦΑΒΗΤΟ Κεφαλαία και μικρά γράμματα ελληνικού αλφαβήτου: Α Ω και α ω Κεφαλαία και μικρά γράμματα λατινικού αλφαβήτου: A Z και a z Αριθμητικά ψηφία: 0 9 Ειδικοί χαρακτήρες: + - * / =. ( ),! & κενός

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 ) Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 2015-16

Διαβάστε περισσότερα

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1 Δυναμικός Κατακερματισμός Βάσεις Δεδομένων 2018-2019 1 Κατακερματισμός Πρόβλημα στατικού κατακερματισμού: Έστω Μ κάδους και r εγγραφές ανά κάδο - το πολύ Μ * r εγγραφές (αλλιώς μεγάλες αλυσίδες υπερχείλισης)

Διαβάστε περισσότερα

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120) Προγραμματισμός Ι (ΗΥ120) Διάλεξη 4: Τελεστές Τελεστές: Τελεστής Ανάθεσης 2 Το σύμβολο της ανάθεσης είναι το = Προσοχή: το σύμβολο ελέγχου ισότητας είναι το ==. Η μορφή των προτάσεων ανάθεσης είναι:

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Παραδείγματα Ενοτήτων 1-2 Ενότητα 1: Εισαγωγή Άσκηση 1-1: Θεωρήστε μια υποθετική γλώσσα προγραμματισμού και την παρακάτω γραμματική

Διαβάστε περισσότερα

Διαδικασιακός Προγραμματισμός

Διαδικασιακός Προγραμματισμός Τμήμα ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ Διαδικασιακός Προγραμματισμός Διάλεξη 4 η Τελεστές Οι διαλέξεις βασίζονται στο βιβλίο των Τσελίκη και Τσελίκα C: Από τη Θεωρία στην Εφαρμογή Σωτήρης

Διαβάστε περισσότερα

Θέματα Μεταγλωττιστών

Θέματα Μεταγλωττιστών Θέματα Μεταγλωττιστών Γιώργος Δημητρίου Ενότητα 1 η : Parsers Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Συντακτική Ανάλυση για ΓΧΣ Οι τεχνικές συντακτικής ανάλυσης κατηγοριοποιούνται

Διαβάστε περισσότερα

ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ. Στην αναγκαιότητα ύπαρξης των μεταγλωττιστών

ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ. Στην αναγκαιότητα ύπαρξης των μεταγλωττιστών ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ Σκοπός: Το μάθημα αυτό αναφέρεται: 1 Ο Εργαστηριακό Μάθημα Εισαγωγή Στην αναγκαιότητα ύπαρξης των μεταγλωττιστών Στα στάδια της μεταγλώττισης Θεωρία Πρόλογος Αφιερώνεται το πρώτο εργαστηριακό

Διαβάστε περισσότερα

I. ΑΛΓΟΡΙΘΜΟΣ II. ΠΡΑΞΕΙΣ - ΣΥΝΑΡΤΗΣΕΙΣ III. ΕΠΑΝΑΛΗΨΕΙΣ. 1. Τα πιο συνηθισμένα σενάρια παραβίασης αλγοριθμικών κριτηρίων είναι:

I. ΑΛΓΟΡΙΘΜΟΣ II. ΠΡΑΞΕΙΣ - ΣΥΝΑΡΤΗΣΕΙΣ III. ΕΠΑΝΑΛΗΨΕΙΣ. 1. Τα πιο συνηθισμένα σενάρια παραβίασης αλγοριθμικών κριτηρίων είναι: ΑΕσΠΠ 1 / 8 I. ΑΛΓΟΡΙΘΜΟΣ 1. Τα πιο συνηθισμένα σενάρια παραβίασης αλγοριθμικών κριτηρίων είναι: i. Είσοδος : χρήση μιας μεταβλητής που δεν έχει πάρει προηγουμένως τιμή. ii. Έξοδος : ο αλγόριθμος δεν εμφανίζει

Διαβάστε περισσότερα

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα) Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2016-17 Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα) http://mixstef.github.io/courses/csintro/ Μ.Στεφανιδάκης Αφηρημένες

Διαβάστε περισσότερα

ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ. Κεφάλαιο 3

ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ. Κεφάλαιο 3 ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ Κεφάλαιο 3 Κεντρική Μονάδα Επεξεργασίας Κεντρική Μονάδα Επεξεργασίας Μονάδα επεξεργασίας δεδομένων Μονάδα ελέγχου Μονάδα επεξεργασίας δεδομένων Δομή Αριθμητικής Λογικής Μονάδας

Διαβάστε περισσότερα

Ασκήσεις Φροντιστηρίου «Υπολογιστική Νοημοσύνη Ι» 5 o Φροντιστήριο

Ασκήσεις Φροντιστηρίου «Υπολογιστική Νοημοσύνη Ι» 5 o Φροντιστήριο Πρόβλημα ο Ασκήσεις Φροντιστηρίου 5 o Φροντιστήριο Δίνεται το παρακάτω σύνολο εκπαίδευσης: # Είσοδος Κατηγορία 0 0 0 Α 2 0 0 Α 0 Β 4 0 0 Α 5 0 Β 6 0 0 Α 7 0 Β 8 Β α) Στον παρακάτω κύβο τοποθετείστε τα

Διαβάστε περισσότερα

Μάθημα 4: Κεντρική Μονάδα Επεξεργασίας

Μάθημα 4: Κεντρική Μονάδα Επεξεργασίας Μάθημα 4: Κεντρική Μονάδα Επεξεργασίας 4.1 Γενικά Ο υπολογιστής επεξεργάζεται δεδομένα ακολουθώντας βήμα βήμα, τις εντολές ενός προγράμματος. Το τμήμα του υπολογιστή, που εκτελεί τις εντολές και συντονίζει

Διαβάστε περισσότερα

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Μεταβλητές,

Διαβάστε περισσότερα

ΑΕΠΠ Ερωτήσεις θεωρίας

ΑΕΠΠ Ερωτήσεις θεωρίας ΑΕΠΠ Ερωτήσεις θεωρίας Κεφάλαιο 1 1. Τα δεδομένα μπορούν να παρέχουν πληροφορίες όταν υποβάλλονται σε 2. Το πρόβλημα μεγιστοποίησης των κερδών μιας επιχείρησης είναι πρόβλημα 3. Για την επίλυση ενός προβλήματος

Διαβάστε περισσότερα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΑΝΑΠΤΥΞΗ ΚΑΙ ΣΧΕΔΙΑΣΗ ΛΟΓΙΣΜΙΚΟΥ Η γλώσσα προγραμματισμού C ΕΡΓΑΣΤΗΡΙΟ 3: Πίνακες, βρόχοι, συναρτήσεις 1 Ιουνίου 2017 Το σημερινό εργαστήριο

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Μεταφραστές Εισαγωγή Διδάσκων: Επικ. Καθ. Γεώργιος Μανής Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό

Διαβάστε περισσότερα

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L. Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L. Hennessy Chapter 2 Εντολές : Η γλώσσα του υπολογιστή (συνέχεια) Διαφάνειες διδασκαλίας από το πρωτότυπο αγγλικό βιβλίο (4 η έκδοση), μετάφραση:

Διαβάστε περισσότερα

Ερωτήσεις πολλαπλής επιλογής - Κεφάλαιο 2

Ερωτήσεις πολλαπλής επιλογής - Κεφάλαιο 2 Ερωτήσεις πολλαπλής επιλογής - Κεφάλαιο 2 1. Ο αλγόριθμος είναι απαραίτητος μόνο για την επίλυση προβλημάτων Πληροφορικής 2. Ο αλγόριθμος αποτελείται από ένα πεπερασμένο σύνολο εντολών 3. Ο αλγόριθμος

Διαβάστε περισσότερα

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο. Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο. Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 1 Μεταβλητές-Σταθερές-Παράμετροι Τα στοιχεία

Διαβάστε περισσότερα

Διαδικασιακός Προγραμματισμός

Διαδικασιακός Προγραμματισμός Τμήμα ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ Διαδικασιακός Προγραμματισμός Διάλεξη 14 η Διαχείριση Μνήμης και Δομές Δεδομένων Οι διαλέξεις βασίζονται στο βιβλίο των Τσελίκη και Τσελίκα C: Από τη

Διαβάστε περισσότερα

Πανεπιστήμιο Θεσσαλίας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων

Πανεπιστήμιο Θεσσαλίας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων Πανεπιστήμιο Θεσσαλίας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων Οργάνωση Η/Υ Ενότητα 4η: Μονάδα Ελέγχου Απλού Κύκλου Μηχανής Άσκηση 1: Θεωρήστε τη μονάδα επεξεργασίας δεδομένων της απλοποιημένης

Διαβάστε περισσότερα

Θέματα Μεταγλωττιστών

Θέματα Μεταγλωττιστών Γιώργος Δημητρίου Ενότητα 1 η : Parsers Συντακτική Ανάλυση για ΓΧΣ Οι τεχνικές συντακτικής ανάλυσης κατηγοριοποιούνται με βάση διάφορα κριτήρια: Κατεύθυνση ανάλυσης μη τερματικών συμβόλων Σειρά επιλογής

Διαβάστε περισσότερα

Μάθημα 5: Χαρακτηριστικά της Κ.Μ.Ε.

Μάθημα 5: Χαρακτηριστικά της Κ.Μ.Ε. Μάθημα 5: Χαρακτηριστικά της Κ.Μ.Ε. 5.1 Το ρολόι Κάθε μία από αυτές τις λειτουργίες της Κ.Μ.Ε. διαρκεί ένα μικρό χρονικό διάστημα. Για το συγχρονισμό των λειτουργιών αυτών, είναι απαραίτητο κάποιο ρολόι.

Διαβάστε περισσότερα

2 ΟΥ και 8 ΟΥ ΚΕΦΑΛΑΙΟΥ

2 ΟΥ και 8 ΟΥ ΚΕΦΑΛΑΙΟΥ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΙΜΕΛΕΙΑ: ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΘΕΩΡΙΑ 2 ΟΥ και 8 ΟΥ ΚΕΦΑΛΑΙΟΥ ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ ΔΟΜΗ ΕΠΙΛΟΓΗΣ 1) Ποιοι είναι οι τελεστές σύγκρισης και

Διαβάστε περισσότερα

9. Συστολικές Συστοιχίες Επεξεργαστών

9. Συστολικές Συστοιχίες Επεξεργαστών Κεφάλαιο 9: Συστολικές συστοιχίες επεξεργαστών 208 9. Συστολικές Συστοιχίες Επεξεργαστών Οι συστολικές συστοιχίες επεξεργαστών είναι επεξεργαστές ειδικού σκοπού οι οποίοι είναι συνήθως προσκολλημένοι σε

Διαβάστε περισσότερα

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος http://www.teiser.gr/icd/staff/lantzos lantzos@teiser.gr 1 Πώς δημιουργούμε πρόγραμμα Η/Υ; 1. Ανάλυση του προβλήματος 2. Επινόηση & Σχεδιασμός

Διαβάστε περισσότερα

53 Χρόνια ΦΡΟΝΤΙΣΤΗΡΙΑ ΜΕΣΗΣ ΕΚΠΑΙΔΕΥΣΗΣ Σ Α Β Β Α Ϊ Δ Η Μ Α Ν Ω Λ Α Ρ Α Κ Η

53 Χρόνια ΦΡΟΝΤΙΣΤΗΡΙΑ ΜΕΣΗΣ ΕΚΠΑΙΔΕΥΣΗΣ Σ Α Β Β Α Ϊ Δ Η Μ Α Ν Ω Λ Α Ρ Α Κ Η 53 Χρόνια ΦΡΟΝΤΙΣΤΗΡΙΑ ΜΕΣΗΣ ΕΚΠΑΙΔΕΥΣΗΣ Σ Α Β Β Α Ϊ Δ Η Μ Α Ν Ω Λ Α Ρ Α Κ Η ΠΑΓΚΡΑΤΙ: Φιλολάου & Εκφαντίδου 26 : 210/76.01.470 210/76.00.179 ΘΕΜΑ Α Α1. Να γράψετε στο τετράδιό σας τον αριθμό καθεμιάς

Διαβάστε περισσότερα

Εισαγωγή στις Αρχές της επιστήμης των ΗΥ

Εισαγωγή στις Αρχές της επιστήμης των ΗΥ Εισαγωγή στις Αρχές της επιστήμης των ΗΥ Ερωτήσεις και ασκήσεις για επανάληψη 1. Τι είναι πρόβλημα (σελ 14) 2. Ποιες είναι οι κατηγορίες προβλημάτων με βάση την επίλυση; Δώστε τον ορισμό για κάθε μια κατηγορία.

Διαβάστε περισσότερα

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής Γιώργος Δημητρίου Μάθημα 3-4: Προγραμματισμός MIPS Προγραμματισμός σε Συμβολική Γλώσσα Η συμβολική γλώσσα: δεν έχει τύπους, δεν έχει δηλώσεις μεταβλητών, δεν έχει δομές ελέγχου, δεν έχει εντολές βρόχων,

Διαβάστε περισσότερα

2 ΟΥ και 8 ΟΥ ΚΕΦΑΛΑΙΟΥ

2 ΟΥ και 8 ΟΥ ΚΕΦΑΛΑΙΟΥ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΙΜΕΛΕΙΑ: ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΘΕΩΡΙΑ 2 ΟΥ και 8 ΟΥ ΚΕΦΑΛΑΙΟΥ ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ ΔΟΜΗ ΕΠΑΝΑΛΗΨΗΣ 1) Πότε χρησιμοποιείται η δομή επανάληψης

Διαβάστε περισσότερα

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον. Διάρκεια 3 ώρες. Όνομα... Επώνυμο... Βαθμός...

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον. Διάρκεια 3 ώρες. Όνομα... Επώνυμο... Βαθμός... 1 Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον Διάρκεια 3 ώρες Στοιχεία Μαθητή: Όνομα... Επώνυμο... Βαθμός... 2 Θεμα Α (30%) Α1 ΣΩΣΤΟ - ΛΑΘΟΣ 1. Ένα υποπρόγραμμα δεν μπορεί να κληθεί περισσότερες

Διαβάστε περισσότερα

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δυναμική Διαχείριση Μνήμης Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2011-2012 Ανάγκη για Δυναμική Μνήμη Στατική Μνήμη Μέχρι τώρα χρησιμοποιούσαμε

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Έλεγχος Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Σχεσιακοί Τελεστές και Ισότητας Ένα πρόγραμμα εκτός από αριθμητικές πράξεις

Διαβάστε περισσότερα

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις Άσκηση 1 Γράψτε μία αναδρομική συνάρτηση που θα παίρνει ως παράμετρο ένα δείκτη στη ρίζα ενός δυαδικού δένδρου και θα επιστρέφει το βαθμό του

Διαβάστε περισσότερα

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ 1 ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΚΕΦΑΛΑΙΟ 3ο: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ ΜΕΡΟΣ 2 ο : ΣΤΟΙΒΑ & ΟΥΡΑ ΙΣΤΟΣΕΛΙΔΑ ΜΑΘΗΜΑΤΟΣ: http://eclass.sch.gr/courses/el594100/ ΣΤΟΙΒΑ 2 Μια στοίβα

Διαβάστε περισσότερα