ΗΥ-340 – Γλώσσες και Μεταφραστές Φροντιστήριο Παραγωγή τελικού κώδικα
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 2 Από τον ενδιάμεσο κώδικα στον τελικό (1/2) Τα ορίσματα των εντολών ενδιάμεσου κώδικα είναι του τύπου expr*. Αυτές οι εκφράσεις θα πρέπει να μετατραπούν στα κατάλληλα ορίσματα για τις εντολές τελικού κώδικα. Αυτό σημαίνει ότι θα πρέπει να υπάρχει κάποιος «μηχανισμός» όπου με βάση κάποιο expr* να κατασκευάζει κατάλληλα ένα vmarg*.
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 3 Από τον ενδιάμεσο κώδικα στον τελικό (2/2)
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 4 Παραγωγή τελικού κώδικα Η παραγωγή τελικού κώδικα γίνεται μέσω της συνάρτησης emit όπως και στον ενδιάμεσο κώδικα (με την διαφορά ότι έχει ένα όρισμα τύπου instruction*)
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 5 Incomplete jumps (1/2) Τα target labels των jump εντολών του ενδιάμεσου κώδικα θα πρέπει να τροποποιηθούν στις αντίστοιχες jump εντολές τελικού κώδικα. Ο λόγος είναι ότι δεν αντιστοιχεί μία εντολή ενδιάμεσου κώδικα σε μία εντολή τελικού κώδικα. Συνήθως, οι εντολές τελικού κώδικα είναι περισσότερες από τις εντολές ενδιάμεσου. Η λύση είναι να εισάγουμε το πεδίο taddress στις εντολές ενδιάμεσου κώδικα και αυτό να συμπληρώνεται κατά την παραγωγή τελικού κώδικα με τον αριθμό της πρώτης εντολής τελικού κώδικα που αντιστοιχεί σε αυτή.
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 6 Incomplete jumps (2/2)
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 7 Τελικός κώδικας για Λογικές Εκφράσεις (1/2) … NOTarg1resulttaddress … … jeqarg1false_ assignfalseresult jump_ assigntrueresult … ενδιάμεσος κώδικας τελικός κώδικας ΛΟΓΙΚΕΣΕΚΦΡΑΣΕΙΣ … ORarg1arg2resulttaddress … … jeqarg1true_ jeqarg2true assignfalseresult jump_ assigntrueresult … ενδιάμεσος κώδικας τελικός κώδικας
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 8 Τελικός κώδικας για Λογικές Εκφράσεις (2/2) … ANDarg1arg2resulttaddress … … jeqarg1false_ jeqarg2false assigntrueresult jump_ assignfalseresult … ενδιάμεσος κώδικας τελικός κώδικας ΛΟΓΙΚΕΣΕΚΦΡΑΣΕΙΣ
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 9 Τελικός κώδικας για Συναρτήσεις (1/2) Επειδή το target label του jump δεν είναι γνωστό πριν παραχθεί κώδικας για το funcend, διατηρείται μία λίστα (returnList) για κάθε τέτοιο jump και θα συμπληρώνονται τα target labels αυτών των jump αφού παραχθεί κώδικας για το funcend. ΚΩΔΙΚΑΣΣΥΝΑΡΤΗΣΕΩΝ … FUNCSTARTresulttaddress … RETURNresulttaddress … FUNCENDresulttaddress … enterfunc …… assignretvalresult jump_ … exitfunc ενδιάμεσος κώδικας τελικός κώδικας
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 10 Τελικός κώδικας για Συναρτήσεις (2/2) Επειδή όμως υποστηρίζεται ο ορισμός συνάρτησης μέσα σε μία άλλη χρησιμοποιείται μία λίστα (funcstack): Στο funcstart γίνεται push η συνάρτηση στην στοίβα Στο funcend γίνεται pop και γίνονται patch τα target labels των εντολών jump που βρίσκονται στην returnList. Στο return εισάγουμε τον αριθμό εντολής τελικού κώδικα του jump στην returnList της συνάρτησης που βρίσκεται στην κορυφή της στοίβας.
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 11 Τεχνική παραγωγής ενδιάμεσου κώδικα
ΗΥ-340 Γλώσσες και Μεταφραστές Φροντιστήριο Virtual Machine
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 13 Τελικός κώδικας για το calculator (1/2) Μπορούμε να παράγουμε από την εφαρμογή calculator τελικό κώδικα μετατρέποντας τον ενδιάμεσο κώδικα (quads) σε τελικό σε αυτήν την περίπτωση η μετατροπή είναι τετριμμένη οι εντολές τελικού κώδικα έχουν ακριβώς την ίδια σημασιολογία με τις εντολές ενδιάμεσου κώδικα η αντιστοίχηση των εντολών ενδιάμεσου με τελικού κώδικα είναι μία προς μία Binary αρχείο που μπορεί να εκτελεστεί από την εικονική μηχανή
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 14 Τελικός κώδικας για το calculator (2/2)
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 15 Σχεδίαση ενός binary αρχείου (1/2) μαγικός αριθμός (κατά προτίμηση μοναδικός) αριθμός μεταβλητών που περιέχει το πρόγραμμα αριθμός εντολών (τελικού κώδικα) που περιέχει το πρόγραμμα εντολές το format μιας εντολής opcode(1 byte) result(5 bytes) arg1(5 bytes) arg2(5 bytes)
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 16 Σχεδίαση ενός binary αρχείου (2/2) το format ενός argument είναι το εξής argument type (1 byte) σταθερά ή μεταβλητή value (4 bytes) offset στον πίνακα των μεταβλητών του προγράμματος αν ο τύπος είναι μεταβλητή η πραγματική τιμή αν ο τύπος είναι σταθερά
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 17 Εικονική Μηχανή η μοναδική λειτουργία της εικονικής μηχανής είναι να εκτελεί ένα αρχείο τελικού κώδικα φορτώνει το αρχείο στην μνήμη αριθμός μεταβλητών αντιστοιχίζει τις μεταβλητές σε θέσεις μνήμης αρχίζει να εκτελεί τις εντολές σειριακά η μηχανή του calculator δεν έχει συνθήκες, βρόχους ή συναρτήσεις
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 18 Φόρτωμα binary αρχείου (1/2)
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 19 Φόρτωμα binary αρχείου (2/2)
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 20 Προδιαγραφές Εικονικής Μηχανής (1/2)
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 21 Προδιαγραφές Εικονικής Μηχανής (2/2)
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 22 Εκτέλεση Προγράμματος (1/5) Μόλις φορτωθεί το πρόγραμμα στην εικονική μηχανή αυτή αρχίζει να εκτελεί τον σειριακά τις εντολές
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 23 Εκτέλεση Προγράμματος (2/5)
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 24 Εκτέλεση Προγράμματος (3/5) Μετά τις κλήσεις της συνάρτησης “translate_operand”, έχουμε στη διάθεσή μας pointers στις τιμές των παραμέτρων της εκάστοτε εντολής
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 25 Εκτέλεση Προγράμματος (4/5) Έτσι, οποιουδήποτε τύπου κι αν είναι η παράμετρος VMArg, είμαστε σίγουροι σε αυτό το σημείο ότι ο pointer VMMemCell, δείχνει πάντα στη σωστή τιμή της παραμέτρου, είτε αυτή είναι σταθερά είτε μεταβλητή
Spring 2007Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας 26 Εκτέλεση Προγράμματος (5/5) Binary (simple.exe) simple.clc Calc VM