Φροντιστήριο 5 ο Τελικός κώδικας και εικονική μηχανή. Μέρος 1 ο Περιβάλλον εκτέλεσης HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Σχετικά έγγραφα
HY340, 2009 Α. Σαββίδης. Slide 3 / 39. Slide 4 / 39

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

alpha Language age (3/5) alpha Language Φροντιστήριο Syntax Directed Translation and

HY340, 2009 Α. Σαββίδης Slide 2 / 143. HY340, 2009 Α. Σαββίδης Slide 3 / 143. HY340, 2009 Α. Σαββίδης Slide 4 / 143

Runtime Checking (1/3) Runtime Checking (2/3) Runtime Checking (3/3) ΗΥ 340 Γλώσσες και Μεταφραστές Φροντιστήριο

a = false; else a = 3.33; b = (a and c); //?

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

Φροντιστήριο 3 ο Παραγωγή Ενδιάμεσου Κώδικα. Σημασιολογία της γλώσσας alpha (1/7) Type Checking

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

Οργάνωση Υπολογιστών ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Διαλέξεις 6: Κάλεσμα Διαδικασιών, Χρήση και Σώσιμο Καταχωρητών. Μανόλης Γ.Η.

Προηγμένοι Μικροεπεξεργαστές. Έλεγχος Ροής Προγράμματος

Δομές Δεδομένων (Data Structures)

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

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

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

Ο πίνακας συμβόλων (symbol table) είναι μία δομή, όπου αποθηκεύεται πληροφορία σχετικά με τα σύμβολα του προγράμματος

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

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

Αρχιτεκτονική Υπολογιστών

Εφαρμοσμένη Πληροφορική ΙΙ (Θ) Είσοδος/Έξοδος Μεταβλητές Τύποι Μεταβλητών Τελεστές και Προτεραιότητα Μετατροπές Μεταξύ Τύπων

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

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

Slide 6 / 43. Slide 5 / 43. Α. Σαββίδης. Α. Σαββίδης. Slide 8 / 43. Slide 7 / 43. Α. Σαββίδης. Α. Σαββίδης HY340, 2009 HY340, 2009 HY340, 2009

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

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

Κεφάλαιο 10 Υποπρογράμματα. Καραμαούνας Πολύκαρπος

{ int a = 5; { int b = 7; a = b + 3;

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

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

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

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

Προγραμματισμός Η/Υ. Ενότητα 2β: Εισαγωγή στη C (Μέρος Δεύτερο)

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

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

Διαδικασίες Ι. ΗΥ 134 Εισαγωγή στην Οργάνωση και στον Σχεδιασμό Υπολογιστών Ι. Διάλεξη 4

6. Επιστροφή ελέγχου στο σημείο εκκίνησης

MIPS functions and procedures

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

Εισαγωγή στη γλώσσα προγραμματισμού C++

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

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

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

Υποστήριξη διαδικασιών στο υλικό των υπολογιστών

Η βασική συνάρτηση προγράμματος main()

Εισαγωγή στην PHP. ΕΣΔ 516 Τεχνολογίες Διαδικτύου. Περιεχόμενα. Περιεχόμενα. ΕΣ 516: Τεχνολογίες ιαδικτύου. ΕΣ 516: Τεχνολογίες ιαδικτύου

Εργαστήριο 4. Εαρινό Εξάμηνο ΠΡΟΣΟΧΗ: Αρχίστε νωρίς το Εργαστήριο 4. Οι ασκήσεις είναι πιο απαιτητικές από τα προηγούμενα εργαστήρια.

Στοιχειώδης προγραμματισμός σε C++

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

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

Συναρτήσεις-Διαδικασίες

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

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα.

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

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

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Φροντιστήριο: MIPS assembly

Αναδρομή. ΗΥ 232 Οργάνωση και Σχεδίαση Υπολογιστών. Διάλεξη 6. Νίκος Μπέλλας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων

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

Φροντιστήριο 4 Σκελετοί Λύσεων

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

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

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

8. Μέθοδοι (Methods)

ΗΥ-150. Προγραμματισμός

ΗΥ-150. Προγραμματισμός

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Εισαγωγή στην πληροφορική -4

Β. Εισαγωγή στον Προγραμματισμό Η/Υ με την JavaScript

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

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

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Κεφάλαιο 2.5: Τύποι εδοµένων, Τελεστές και Αριθµητικές Εκφράσεις. ( ιαλέξεις 5-6) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

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

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

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

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

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

Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών H/Y Department of Electrical and Computer Engineering. Εργαστήριο 1. Χειμερινό Εξάμηνο

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Προηγμένοι Μικροεπεξεργαστές. Φροντιστήριο 3 Έλεγχος Ροής Προγράμματος

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

Αρχιτεκτονικές Συνόλου Εντολών

Σύγχρονες Αρχιτεκτονικές Υπολογιστών

Ηβασικήσυνάρτηση προγράμματος main()

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Προγραμματισμός Συστημάτων

Λειτουργικά. Συστήματα Ι. Φ ρ ο ν τ ι σ τ ή ρ ι ο. Αριστείδης Ηλίας. Εργαστήριο Ηλεκτρονικών Υπολογιστών

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

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

Εντολές του MIPS (2)

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

ΕΝΟΤΗΤΑ 4 Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου

Αρχιτεκτονικές Συνόλου Εντολών (ΙΙ)

Pascal. 15 Νοεμβρίου 2011

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

ΚΕΦΑΛΑΙΟ 2: Χειρισµός εδοµένων

Transcript:

HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ Φροντιστήριο 5 ο Τελικός κώδικας και εικονική μηχανή Ι ΑΣΚΩΝ Αντώνιος Σαββίδης Slide 2 / 45 HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ Μέρος 1 ο Περιβάλλον εκτέλεσης Αντιστοίχιση μεταβλητών σε θέση μνήμης Στον ενδιάμεσο κώδικα, τα περισσότερα ορίσματα τύπου expr* (εκτός από τις σταθερές και συναρτήσεις) αντιστοιχούν πάντα σε κάποιο σύμβολο του προγράμματος μας (πεδίο sym του expr) Αυτό το σύμβολο θα πρέπει να αντιστοιχηθεί στο περιβάλλον εκτέλεσης σε κάποια συγκεκριμένη θέση μνήμης Η αντιστοίχιση αυτή σχετίζεται με: Το scope space του συμβόλου Το offset που έχει το σύμβολο Slide 3 / 45 Slide 4 / 45

Οργάνωση Μνήμης (1/3) Μεταβλητές καθολικής εμβέλειας Το πλήθος τους είναι γνωστό σε compiletime, οπότε δεσμεύουμε για αυτές ένα συνεχόμενο τμήμα μνήμης Ένας καταχωρητής (globalmem) της εικονικής μηχανής θα υποδεικνύει την αρχική διεύθυνση αυτού του τμήματος Αναφερόμαστε σε μια global μεταβλητή x ως mem[globalmem + x offset] mem... globmem M θέσεις μνήμης για καθολικές μεταβλητές Slide 5 / 45 Οργάνωση Μνήμης (2/3) Τυπικά ορίσματα και τοπικές μεταβλητές Για την κλήση μιας συνάρτησης χρειαζόμαστε χώρο για τα πραγματικά ορίσματα και τις τοπικές μεταβλητές της Η συνάρτηση που καλείται δεν είναι γνωστή σε compile-time άρα η αντιστοίχιση θα πρέπει να γίνει δυναμικά εσμεύουμε Ν θέσεις για τα πραγματικά ορίσματα και Κ θέσεις για τις τοπικές μεταβλητές Αναφερόμαστε σε τυπικό όρισμα x ως mem[datamem x offset-1] Αναφερόμαστε σε τοπική μεταβλητή y ως mem[datamem +y offset-1] Όταν έχουμε εμφωλευμένες (ή αναδρομικές) κλήσεις συναρτήσεων τι κάνουμε? Πρέπει να σώσουμε τους καταχωρητές Ώστε να τους επαναφέρουμε μετά χαμηλές διευθύνσεις υψηλές διευθύνσεις callmem Ν θέσεις μνήμης, πραγματικά ορίσματα datamem Κ θέσεις μνήμης, τοπικές μεταβλητές Slide 6 / 45 Οργάνωση Μνήμης (3/3) Δέντρο ενεργοποίησης χαμηλές διευθύνσεις... x m x m-1 x 1 callmem προηγούμενο datamem προηγούμενο y 1 y 2... y k... υψηλές διευθύνσεις callmem f(x 1,x 2,x m ) datamem topsp top χαμηλές διευθύνσεις x n x 1 n return address saved top saved topsp local y 1 local y k υψηλές διευθύνσεις function fact (n) { if (n == 1) else return 1; return n * fact(n-1); έντρο ενεργοποίησης fact(4) fact(3) fact(2) fact(1) Κάθε ενεργοποίηση απαιτεί διαφορετικό περιβάλλον, το μέγεθος του οποίου ισούται με: αριθμός ορισμάτων + αριθμός τοπικών μεταβλητών Προσοχή: Επειδή προσθέσαμε επιπλέον πράγματα αλλάζει λίγο ο υπολογισμός θέσης ενός τυπικού ορίσματος ή μιας τοπικής μεταβλητής Slide 7 / 45 Slide 8 / 45

Activation records (1/5) Activation records (2/5) Κατά την κλήση μιας συνάρτησης, παραχωρείται μνήμη δυναμικά (και γίνεται push στην στοίβα), ενώ μετά το τέλος της κλήσης αυτή η μνήμη απελευθερώνεται (και γίνεται pop από την στοίβα το αντίστοιχο active record). έντρο ενεργοποίησης fact(4) fact(3) fact(2) fact(1) Στοίβα. fact(1) fact(2) fact(3) fact(4) Η κλήση που έγινε τελευταία, βρίσκεται υψηλότερα στην στοίβα Παράδειγμα (code) function f (x, y) { z = x * y; if (z == 10) { z = 1; return z; i = f (j, k); 1: funcstart f 2: mul x y z 3: if_eq z 10 5 4: jump 6 5: assign 1 z 6: return z 7: funcend f 8: param k 9: param j 10: call f 11: getretval _t1 12: assign _t1 i Slide 9 / 45 Slide 10 / 45 Activation records (3/5) Activation records (4/5) Παράδειγμα (stack) function f (x, y) { z = x * y; if (z == 10) { z = 1; return z; i = f (j, k); old_topsp old_top topsp top 100 101 102 103 104 105 106 107 108 109 stack k j actual_args <2> ret_address <11> saved_top <102> saved_topsp <100> z Παράδειγμα 2 (stack) function g (a) { return function (x){ tmp = 2; return (tmp x); (a); function f (x, y) { z = 2*x + y; w = z x/y; g(w); return z; i = f (j, k); Στιγμιότυπο της στοίβας όταν το PC βρίσκεται μέσα στο body της ανώνυμης συνάρτησης που ορίζεται μέσα στην g() topsp top 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 stack k j actual_args <2> ret_address <##> saved_top <102> saved_topsp <100> z w w actual_args <1> ret_address <##> saved_top <110> saved_topsp <108> a actual_args <1> ret_address <##> saved_top <115> saved_topsp <115> tmp f g t1 Slide 11 / 45 Slide 12 / 45

Activation records (5/5) Κλήση συνάρτησης (1/2) Παράδειγμα 3 (recursion) function fact (n) { if (n == 1) return 1; else return n * fact(n-1); x = fact(4); Στιγμιότυπο της στοίβας όταν το PC βρίσκεται μέσα στο body της αναδρομικής fact() με όρισμα n=1 (αρχική κλήση n=4) topsp top 100 101 102 103 104 stack n actual_args <1> ret_address <##> 105 saved_top <102> 106 saved_topsp <100> 107 n 108 actual_args <1> 109 ret_address <##> 110 saved_top <107> 111 saved_topsp <107> 112 n 113 actual_args <1> 114 ret_address <##> 115 saved_top <112> 116 saved_topsp <112> 117 n 118 actual_args <1> 119 ret_address <##> 120 saved_top <117> 121 saved_topsp <117> 122 f(4) f(3) f(2) f(1) Ακολουθία κλήσης. Χρησιμοποιείται ο δείκτης top, ο οποίος σε κάθε push μειώνεται κατά 1 (θεωρούμε τη στοίβα να μεγαλώνει από υψηλές προς χαμηλές διευθύνσεις). Ενέργειες του κλητευτή Αποτίμησε τα n πραγματικά ορίσματα (x 1,,x n ) Τοποθέτησε τα ορίσματα στη στοίβα με τη σειρά x n x 1 Τοποθέτησε στη στοίβα τον αριθμό των ορισμάτων n Τοποθέτησε στη στοίβα τη διεύθυνση επιστροφής από κλήση Τοποθέτησε στη στοίβα την τιμή του top πριν call αρχίσει η ακολουθία κλήσης, δηλ. top+n+2 Τοποθέτησε στη στοίβα την τιμή του topsp Θέσε τον μετρητή προγράμματος στη διεύθυνση της συνάρτησης Ενέργειες του καλούμενου funcstart Θέσε το topsp ίσο με την τιμή του top Ανέβασε το top τόσες θέσεις όσες οι τοπικές μεταβλητές topsp top χαμηλές διευθύνσεις x n x 1 n return address saved top saved topsp local y 1 local y k υψηλές διευθύνσεις Slide 13 / 45 Slide 14 / 45 Κλήση συνάρτησης (2/2) HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ Ακολουθία επιστροφής από κλήση. funcend Αποθήκευσε την τιμή του top σε έναν καταχωρητή r1 Επανέφερε το top στην προηγούμενη σωμένη τιμή Αποθήκευσε την διεύθυνση επιστροφής σε έναν καταχωρητή r2 Επανέφερε την προηγούμενη διεύθυνση του topsp Καθάρισε την στοίβα από το r1-1 + έως και το top Θέσε pc = r2 Η ακολουθία εντολών επιστροφής από κλήση σχεδιάζεται έτσι ώστε να επιστρέψουμε στην εντολή ακριβώς μετά την κλήση, με top και topsp να δείχνουν στο activation record του κλητευτή. Εναπόθεση επιστρεφόμενου αποτελέσματος. Αποθήκευσε το αποτέλεσμα σε έναν ειδικό καταχωρητή retval η σε μία θέση στην στοίβα που κρατείται για το σκοπό αυτό ακριβώς πριν το πρώτο πραγματικό όρισμα. Jump στο τέλος της συνάρτησης στην 1 η εντολή της ακολουθίας επιστροφής από κλήση. return topsp top χαμηλές διευθύνσεις x n x 1 n return address saved top saved topsp local y 1 local y k υψηλές διευθύνσεις Μέρος 2 ο Παραγωγή τελικού κώδικα Slide 15 / 45 Slide 16 / 45

Παραγωγή τελικού κώδικα (1/2) Το ρεπερτόριο των εντολών του ενδιάμεσου κώδικα είναι αρκετά κοντά σε αυτό του τελικού κώδικα Φεύγει η uminus που μπορεί να υλοποιηθεί με πολλαπλασιασμό με το -1 Φεύγουν οι λογικοί τελεστές (ολική αποτίμηση) καθώς υλοποιούνται με jumps και assignments Πρέπει να κωδικοποιήσουμε τις εντολές σε ένα συγκεκριμένο αριθμό από bytes 4 bytes ανά εντολή, άρα 1 byte ανά όρισμα Όμως ορισμένα ορίσματα δεν χωράνε Χρησιμοποιούμε πίνακες σταθερών ημιουργούμε πίνακες με τις εμφανίσεις των σταθερών που εμφανίζονται στις εντολές Αντικαθιστούμε τις εντολές με το index τους μέσα στον πίνακα Παραγωγή τελικού κώδικα (2/2) x = 10; y = hello ; function f(x,y) { return x+y; z = world ; w = cos(3.1415); print(x,y,z,w); Κάθε όρισμα έχει δύο πεδία: (α) τύπο ορίσματος, και (β) την πληροφορία του ορίσματος. Στον παρακάτω κώδικα της εικονικής μηχανής αναγράφεται για κάθε όρισμα ο τύπος αλλά και η περίπτωση του ορίσματος στην οποία αναφέρεται. Slide 17 / 45 Slide 18 / 45 Από ενδιάμεσο σε τελικό κώδικα Στον ενδιάμεσου κώδικα έχουμε εντολές που δέχονται expr* ενώ στον τελικό κώδικα χρειαζόμαστε vmarg* Η μετατροπή των ορισμάτων αυτών γίνεται χρησιμοποιώντας τη συνάρτηση make_operand struct vmarg { vmarg_t type; unsigned val; Παραγωγή τελικού κώδικα Η παραγωγή τελικού κώδικα γίνεται μέσω της συνάρτησης emit όπως και στον ενδιάμεσο κώδικα (με την διαφορά ότι έχει ένα όρισμα τύπου instruction*) struct instruction { vmopcode opcode; vmarg result; vmarg arg1; vmarg arg2; unsigned srcline; ; Slide 19 / 45 Slide 20 / 45

Incomplete jumps (1/2) Incomplete jumps (2/2) Τα target labels των jump εντολών του ενδιάμεσου κώδικα θα πρέπει να τροποποιηθούν στις αντίστοιχες jump εντολές τελικού κώδικα. Καθώς η αντιστοίχιση εντολών ενδιάμεσου κώδικα τελικού κώδικα δεν είναι 1-1 Εισάγουμε το πεδίο taddress στις εντολές ενδιάμεσου κώδικα και το συμπληρώνουμε κατά την παραγωγή τελικού κώδικα με τον αριθμό της πρώτης εντολής τελικού κώδικα που αντιστοιχεί σε αυτή Quads JUMP _ taddress????? taddress Instructions JUMP _....????? Η συμπλήρωση ενός incomplete jump γίνεται θέτοντας ως label του instruction το taddress του αντίστοιχου quad patch_incomplete_jumps() { for each incomplete jump x do { if x.iaddress = intermediate code size then instructions[x.instrno].result = target code size; else instructions[x.instrno].result = quads[x.iaddress].taddress; iaddress Στο iaddress αποθηκεύουμε τον αριθμό της εντολής ενδιάμεσου κώδικα προορισμού του jump instrno Στο instrno αποθηκεύουμε τον αριθμό της εντολής τελικού κώδικα που παράγεται για το jump στον ενδιάμεσο κώδικα Slide 21 / 45 Slide 22 / 45 Τελικός κώδικας για Λογικές Εκφράσεις (1/2) Τελικός κώδικας για Λογικές Εκφράσεις (2/2) ενδιάμεσος κώδικας τελικός κώδικας NOT arg1 result taddress +2 jeq arg1 false _ assign false result jump _ assign true result +3 ενδιάμεσος κώδικας AND arg1 arg2 result taddress τελικός κώδικας jeq arg1 false _ jeq arg2 false assign true result jump _ +4 +3 ενδιάμεσος κώδικας τελικός κώδικας ΛΟΓΙΚΕΣ ΕΚΦΡΑΣΕΙΣ +2 assign false result OR arg1 arg2 result taddress jeq arg1 true _ +4 jeq arg2 true +3 assign false result ΛΟΓΙΚΕΣ ΕΚΦΡΑΣΕΙΣ +2 jump assign true result _ Slide 23 / 45 Slide 24 / 45

Τελικός κώδικας για Συναρτήσεις ενδιάμεσος κώδικας FUNCSTART result taddress RETURN result taddress FUNCEND result taddress τελικός κώδικας enterfunc assign retval result jump _ exitfunc ΚΩ ΙΚΑΣ ΣΥΝΑΡΤΗΣΕΩΝ Επειδή το target label του jump δεν είναι γνωστό πριν παραχθεί κώδικας για το funcend, διατηρείται μία λίστα (returnlist) για κάθε τέτοιο jump και θα συμπληρώνονται τα target labels αυτών των jump αφού παραχθεί κώδικας για το funcend Επειδή όμως υποστηρίζεται ο ορισμός συνάρτησης μέσα σε μία άλλη χρησιμοποιείται μία στοίβα (funcstack): Στο funcstart γίνεται push η συνάρτηση στην στοίβα Στο funcend γίνεται pop και γίνονται patch τα target labels των εντολών jump που βρίσκονται στην returnlist. Στο return εισάγουμε τον αριθμό εντολής τελικού κώδικα του jump στην returnlist της συνάρτησης που βρίσκεται στην κορυφή της στοίβας Slide 25 / 45 Τεχνική παραγωγής τελικού κώδικα Παραγωγή τελικού κώδικα με χρήση των generate functions Slide 26 / 45 HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ Εικονική Μηχανή Φορτώνει και εκτελεί ένα αρχείο τελικού κώδικα Load tables of constant values Load machine instructions Μέρος 3 ο Εικονική μηχανή Run Execute instruction Decode opcode Translate operands Perform operation Γραμματική δομής τελικού κώδικα Λειτουργία εικονικής μηχανής Slide 27 / 45 Slide 28 / 45

Μετατροπή Ορισμάτων (1/2) Μετατροπή Ορισμάτων (2/2) Στις εντολές υπάρχουν αρκετοί διαφορετικοί τύποι ορισμάτων Κελιά μνήμης (μεταβλητές) Σταθερές τιμές χρήστη (π.χ. ακέραιες τιμές ή strings constants) Συναρτήσεις βιβλιοθήκης και χρήστη Για να απλοποιήσουμε τη υλοποίηση των εντολών μετατρέπουμε όλα τα ορίσματα σε θέσεις μνήμης χρησιμοποιώντας βοηθητικούς καταχωρητές Χρησιμοποιούνται μόνο για τιμές καθώς οι μεταβλητές είναι πάντα σε θέσεις μνήμης στη στοίβα Σε αυτούς θα αποθηκεύουμε πάντα τα ορίσματα arg1 και arg2 Constants Μεταβλητές Functions Συνάρτηση μετατροπής ορισμάτων vmarg* σε avm_memcell* Slide 29 / 45 Slide 30 / 45 Execution Cycle Υλοποίηση εντολών - Συναρτήσεις Call: Σώσιμο περιβάλλοντος και κλήση Funcenter Funcexit Pusharg Υλοποίηση του κύκλου εκτέλεσης εντολών της εικονικής μηχανής χρησιμοποιώντας ένα dispatcher με τις συναρτήσεις execute Slide 31 / 45 Slide 32 / 45

Υλοποίηση εντολών Συναρτήσεις Βιβλιοθήκης (1/5) Υλοποιημένες σε native κώδικα (C/C++) Απαιτούν χειροκίνητη ακολουθία εντολών εισόδου και εξόδου Χρησιμοποιώντας τη συνάρτηση avm_calllibfunc Αλληλεπιδρούν με τις συναρτήσεις alpha Λαμβάνουν τα ορίσματα τους από τη στοίβα Μπορούν να επιστρέψουν τιμές θέτοντας το καταχωρητή retval Γίνονται installed κατά την αρχικοποίηση της εικονικής μηχανής Υλοποίηση εντολών Συναρτήσεις Βιβλιοθήκης (2/5) CALLING FUNCTIONS Καθώς οι συναρτήσεις βιβλιοθήκης είναι υλοποιημένες σε C/C++, πρέπει να καλέσουμε χειροκίνητα την ακολουθία εντολών που οφείλει να εκτελέσει μία συνάρτηση όταν αρχίζει να εκτελείται, καθώς και τις εντολές της ακολουθίας εξόδου. Προσέξτε ότι οι συναρτήσεις βιβλιοθήκης δεν περιέχουν τοπικές μεταβλητές στοίβας της εικονικής μηχανής (μπορούν βεβαίως να έχουν τοπικές μεταβλητές του προγράμματος C/C++). Slide 33 / 45 Slide 34 / 45 Υλοποίηση εντολών Συναρτήσεις Βιβλιοθήκης (3/5) Υλοποίηση εντολών Συναρτήσεις Βιβλιοθήκης (4/5) Πως υλοποιούμε τις συναρτήσεις βιβλιοθήκης; Ως απλές C/C++ συναρτήσεις οι οποίες λαμβάνουν τα πραγματικά ορίσματα από τη στοίβα της εικονικής μηχανής. Το ίδιο ισχύει και στις συναρτήσεις βιβλιοθήκης για γλώσσες γενικού σκοπού και παραγωγή κώδικα για πραγματικές μηχανές. Εδώ παρουσιάζουμε και την υλοποίηση της typeof συνάρτησης βιβλιοθήκης, η οποία επιτρέπει runtime type identification (ελέγχει ακόμη και undefined variables). Στην περίπτωση που μίας συνάρτηση βιβλιοθήκης χρειάζεται συγκεκριμένο αριθμό από arguments, προφανώς υλοποιεί εσωτερικά και τη λογική έλεγχου και ανάλογα μπορεί να εξάγει ένα runtime error. Επιπλέον φαίνεται ο τρόπος με τον οποίο υλοποιούμε συναρτήσεις βιβλιοθήκης οι οποίες επιστρέφουν τιμές (απλώς θέτουν τον retval register). CALLING FUNCTIONS Καθώς ο τρόπος χρήσης της στοίβας και των καταχωρητών είναι θέμα του compiler, η υλοποίηση συναρτήσεων βιβλιοθήκης για έναν compiler δεν είναι de facto portable και σε έναν άλλον compiler της ίδιας γλώσσας και για την ίδια μηχανή. LIBRARY FUNCTIONS Slide 35 / 45 Slide 36 / 45

Υλοποίηση εντολών Συναρτήσεις Βιβλιοθήκης (5/5) Υλοποίηση αριθμητικών εντολών activation record της κλήσης totalarguments activation record του caller της totalarguments. function f() { n = totalarguments(); Όταν κληθεί η totalarguments, στην υλοποίηση της σε C/C++ η κλήση avm_totalactuals() επιστρέφει τον αριθμό των arguments στην ίδια την συνάρτηση και όχι στον caller αυτής όπως θα έπρεπε. Επομένως για να επιστραφεί ο σωστός αριθμός πρέπει να κινηθούμε ένα activation record κάτω. Η υλοποίηση των αριθμητικών εντολών. Μην ξεχάσετε τους ελέγχους για runtime error. Με παρόμοιο τρόπο υλοποιήστε την argument(i) ARITHMETIC OPERATIONS Slide 37 / 45 Slide 38 / 45 Υλοποίηση συσχετιστικών εντολών διάταξης Με τρόπο παρόμοιο των αριθμητικών εκφράσεων υλοποιούνται και οι συσχετιστικοί τελεστές διάταξης < <= > >=, δηλ. οι εντολές JGE, JGT, JLE, JLT, καθώς αφορούν μόνο αριθμούς. Προσοχή θέλει το γεγονός ότι δεν χρειάζεται να μετατρέψουμε το operand στο οποίο είναι αποθηκευμένη η διεύθυνση (label) της εντολής προορισμού Οι βοηθητικές συναρτήσεις comparisonfuncs θα είναι έχουν αντίστοιχο signature, δηλ. bool (*cmp_func) (double, double) Υλοποίηση συσχετιστικών εντολών ισότητας (1/3) Οι εντολές συσχετιστικών τελεστών ισότητας έχουν διαφορετική υλοποίηση ώστε να ικανοποιούνται οι σημασιολογικοί κανόνες της γλώσσας Σύγκριση με undefined προκαλεί runtime error, αλλιώς οτιδήποτε είναι συγκρίσιμο == με nil και το αποτέλεσμα είναι true μόνο εάν και τα δύο nil αλλιώς σύγκριση με boolean απαιτεί μετατροπή σε boolean τιμή αλλιώς η σύγκριση επιτρέπεται μόνο μεταξύ ομοειδών (ιδίου τύπου) Slide 39 / 45 Slide 40 / 45

Υλοποίηση συσχετιστικών εντολών ισότητας (2/3) Υλοποίηση συσχετιστικών εντολών ισότητας (3/3) Η μετατροπή σε boolean θα μας χρειαστεί και καλό είναι να έχουμε ταχύτατη (ως προς την εκτέλεση) υλοποίηση. Θεωρούμε ότι ενσωματώνουμε στην avm_error και την εντολή executionfinished=1 Εδώ συμπληρώστε την υλοποίηση. Αρκεί να κάνετε dispatching ως προς τον τύπο του rv1 EQUALITY OPERATIONS (! EQUALITY OPERATIONS Εάν δεν είχαμε runtime error και το αποτέλεσμα είναι true, πρέπει να εφαρμοστεί το jump (δηλ. να θέσουμε το PC) Slide 41 / 45 Slide 42 / 45 Υλοποίηση εντολών πινάκων (1/3) Υλοποίηση εντολών πινάκων (2/3) Οι τιμές των πινάκων γνωρίζουμε ότι πάντα αποθηκεύονται σε κάποια μεταβλητή. Επομένως δεν χρειαζόμαστε βοηθητικό καταχωρητή. εν ξεχνάμε την αύξηση του μετρητή αναφορών, καθώς κατά τη δημιουργία ο πίνακας έχει τον μετρητή αυτόν στην τιμή 0. TABLES Ενδέχεται το στοιχείο που ζητείται για το συγκεκριμένο κλειδί απλώς να μην υπάρχει ή να μην υποστηρίζεται κλειδί του συγκεκριμένου τύπου. TABLES Slide 43 / 45 Slide 44 / 45

Υλοποίηση εντολών πινάκων (3/3) Η υλοποίηση της execute_tablesetelem είναι απλή, αλλά βασίζεται στην avm_tablesetelem η οποία είναι κατασκευαστικά πιο απαιτητική Να μην ξεχάσετε ότι με nil index αφαιρείται το στοιχείο, δηλ. το nil δεν μπορεί να αποθηκεύεται σε πίνακες και ότι πρέπει να χρησιμοποιείτε τις avm_assign και avm_memcellclear Γιατί δεν ελέγχουμε και για retval register? Slide 45 / 45