Mεταγλωττιστές Σηµείωση Το ΕΑΠ είναι υπεύθυνο για την επιµέλεια έκδοσης και την ανάπτυξη των κειµένων σύµφωνα µε τη Μεθοδολογία της εξ Αποστάσεως Εκπαίδευσης. Για την επιστηµονική αρτιότητα και πληρότητα των συγγραµ- µάτων την αποκλειστική ευθύνη φέρουν οι συγγραφείς, κριτικοί αναγνώστες και ακαδηµαϊκοί υπεύθυνοι που ανέλαβαν το έργο αυτό.
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ Σχολή Θετικών Επιστηµών και Τεχνολογίας Πρόγραµµα Σπουδών ΠΛHPOΦOPIKH Θεµατική Ενότητα ΠΡΑΚΤΙΚΗ ΕΞΑΣΚΗΣΗ ΣΕ ΘΕΜΑΤΑ ΛΟΓΙΣΜΙΚΟΥ Τόµος A' Mεταγλωττιστές ΠΑΝΑΓΙΩΤΗΣ ΠΙΝΤΕΛΑΣ Kαθηγητής Tµήµατος Mαθηµατικών Πανεπιστηµίου Πατρών ΠΑΝΑΓΙΩΤΗΣ ΑΛΕΦΡΑΓΚΗΣ ιδάκτωρ Hλεκτρολόγος Mηχανικός & Tεχνολογίας H/Y ΠATPA 2003
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ Σχολή Θετικών Επιστηµών και Τεχνολογίας Πρόγραµµα Σπουδών ΠΛHPOΦOPIKH Θεµατική Ενότητα ΠΡΑΚΤΙΚΗ ΕΞΑΣΚΗΣΗ ΣΕ ΘΕΜΑΤΑ ΛΟΓΙΣΜΙΚΟΥ Τόµος A' MΕΤΑΓΛΩΤΤΙΣΤΕΣ Συγγραφή ΠANAΓIΩTHΣ ΠINTEΛAΣ Kαθηγητής Tµήµατος Mαθηµατικών Πανεπιστηµίου Πατρών ΠANAΓIΩTHΣ AΛEΦPAΓKHΣ ιδάκτωρ Hλεκτρολόγος Mηχανικός & Tεχνολογίας H/Y Κριτική Ανάγνωση ΣΩΚΡΑΤΗΣ ΚΑΤΣΙΚΑΣ Kαθηγητής Tµήµατος Mηχανικών Πληροφοριακών και Eπικοινωνιακων Συστηµάτων Πανεπιστηµίου Aιγαίου Ακαδηµαϊκός Υπεύθυνος για την επιστηµονική επιµέλεια του τόµου ΠΑΝΑΓΙΩΤΗΣ ΠΙΝΤΕΛΑΣ Kαθηγητής Tµήµατος Mαθηµατικών Πανεπιστηµίου Πατρών Επιµέλεια στη µέθοδο της εκπαίδευσης από απόσταση ΓEPAΣIMOΣ MΩPAΪTHΣ Γλωσσική Επιµέλεια XPIΣTINA KAPAΓEΩPΓOΠOYΛOY Τεχνική Επιµέλεια EΣΠI EK OTIKH E.Π.E. Καλλιτεχνική Επιµέλεια Σελιδοποίηση TYPORAMA Συντονισµός ανάπτυξης εκπαιδευτικού υλικού και γενική επιµέλεια των εκδόσεων ΟΜΑ Α ΕΚΤΕΛΕΣΗΣ ΕΡΓΟΥ ΕΑΠ / 1997 2003 ISBN: 960 538 209 1 Kωδικός Έκδοσης: ΠΛH 40/1 Copyright 2003 για την Ελλάδα και όλο τον κόσµο ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ Οδός Παπαφλέσσα & Υψηλάντη, 26222 Πάτρα Τηλ: 2610 314094, 314206 Φαξ: 2610 317244 Σύµφωνα µε το Ν. 2121/1993, απαγορεύεται η συνολική ή αποσπασµατική αναδηµοσίευση του βιβλίου αυτού ή η αναπαραγωγή του µε οποιοδήποτε µέσο χωρίς την άδεια του εκδότη.
ÂÚÈ fiìâó Πρόλογος... 11 K º π 1 EÈÛ ÁˆÁ Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά, Eισαγωγικές παρατηρήσεις... 13 1.1 Eισαγωγή... 14 1.2 H δοµή ενός µεταγλωττιστή... 15 1.2.1 O λεκτικός αναλυτής... 15 1.2.2 O συντακτικός αναλυτής... 16 1.2.3 O σηµασιολογικός αναλυτής... 16 1.2.4 O γεννήτορας ενιάµεσου κώδικα... 17 1.2.5 Oι βελτιστοποιητές υψηλού και µεσαίου επιπέδου... 17 1.2.6 O γεννήτορας τελικού κώδικα... 18 1.2.7 O βελτιστοποιητής χαµηλού επιπέδου... 18 1.2.8 O πίνακας συµβόλων... 18 1.3 Eργαλεία ανάπτυξης µεταγλωττιστών... 19 1.3.1 Tα Lex & Flex... 19 1.3.2 Ta Yacc & Bison... 19 1.3.3 To PCCTS... 20 1.3.4 To SPIM... 20 1.3.5 To WARTS... 20 Σύνοψη... 22 K º π 2 O ÂÓÓ ÙÔÚ ÂÎÙÈÎÒÓ AÓ Ï ÙÒÓ Lex Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά, Eισαγωγικές παρατηρήσεις... 23 2.1 Eισαγωγή... 24 2.2 Προγραµµατίζοντας µε το Lex... 25
6 M ø π 2.3 Γράφοντας κανόνες στο Lex... 25 2.3.1 Kλάσεις χαρακτήρων... 26 2.3.2 Προαιρετικές εκφράσεις... 27 2.3.3 Eπαναληπτικές εκφράσεις... 27 2.3.4 Eκφράσεις εναλλαγής... 27 2.3.5 Eκφράσεις οµαδοποίησης... 27 2.3.6 Eυαισθησία συµφραζοµένων... 28 2.3.7 Eπανάληψη και χρήση ορισµών... 28 2.4 Oι ενέργειες του Lex... 30 2.5 O µηχανισµός ταύτισης του Lex... 31 2.6 Oι δοµές και οι συναρτήσεις του Lex... 31 2.7 Oι αρχικές συνθήκες του Lex... 32 2.8 Xρησιµοποιώντας το Lex... 33 2.9 Tο Lex σε συνεργασία µε το Yacc... 34 Σύνοψη... 35 Bιβλιογραφία... 36 Προαιρετική βιβλιογραφία... 36 K º π 3 ÓÙ ÎÙÈÎ AÓ Ï ÛË [LL Î È LR] Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά, Eισαγωγικές παρατηρήσεις... 39 3.1 Συντακτική ανάλυση... 41 3.2 Συντακτικοί αναλυτές Top down... 43 3.2.1 Γραµµατικές LL(1)... 43 3.3 Συντακτικοί αναλυτές Bottom up... 45 3.3.1 Γραµµατικές LR(1) και γλώσσες... 46 3.3.2 Συντακτικοί αναλυτές LR(k)... 47 3.3.3 Λειτουργία του συντακτικού αναλυτή LR... 49 3.3.4 Kατασκευή του πίνακα συντακτικής ανάλυσης LR... 51 3.3.5 Σύγκριση των µεθόδων ανάλυσης LL και LR... 52
EPIEXOMENA 7 3.4 Aνάνηψη από λάθη... 53 3.4.1 Στρατηγικές ανάνηψης από λάθος... 55 3.4.2 Aνάνηψη από λάθος σε συντακτικό αναλυτή LR... 56 Σύνοψη... 59 K º π 4 O ÂÓÓ ÙÔÚ ÓÙ ÎÙÈÎÒÓ AÓ Ï ÙÒÓ Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά, Eισαγωγικές παρατηρήσεις... 61 4.1 Eισαγωγή... 62 4.1.1 Περιγράφοντας µια γραµµατική... 64 4.1.2 Προγραµµατίζοντας µε το yacc... 65 4.2 To τµήµα δηλώσεων του yacc... 65 4.3 Γράφοντας κανόνες στο yacc... 67 4.4 ιαχείριση ασαφειών... 73 4.5 ιαχείριση σφαλµάτων... 74 4.6 ιασύνδεση µε άλλα προγράµµατα της C... 75 4.7 Aποσφαλµάτωση της γραµµατικής... 77 4.8 Xρησιµοποιώντας το yacc... 78 Σύνοψη... 79 Bιβλιογραφία... 81 K º π 5 ËÌÈÔ ÚÁÒÓÙ KÒ ÈÎ ÁÈ ÙÔ Spim Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά, Eισαγωγικές παρατηρήσεις... 83 5.1 Eισαγωγή... 84 5.2 O επεξεργαστής MIPS R2000... 84 5.3 H σύνταξη του συβολοµεταφραστή του Spim και η επικοινωνία µε το λειτουργικό σύστηµα... 85 5.4 ιαχείριση µνήµης... 88
8 M ø π 5.5 Eντολές του MIPS... 89 5.5.1 Aριθµητικές και λογικές πράξεις... 91 5.5.2 Oι βασικές εντολές σύγκρισης... 93 5.5.3 Oι βασικές εντολές ελέγχου ροής... 93 5.5.4 Oι βασικές εντολές ανάκλησης από µνήµη και αποθήκευσης σε µνήµη... 95 5.5.5 Kλήσεις συναρτήσεων... 95 Σύνοψη... 98 Bιβλιογραφία... 99 K º π 6 ÈÂÚÌËÓÂ Ù Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά, Eισαγωγικές παρατηρήσεις... 101 6.1 Eισαγωγή... 103 6.2 H δοµή του διερµηνευτή... 103 6.3 Oι τιµές µέσα στη στοίβα... 105 6.4 Mετατροπή των εντελών... 108 6.5 ιαχείριση µνήµης... 109 6.6 Bοηθήµατα εκσφαλµάτωσης... 109 Σύνοψη... 111 K º π 7 Â È ÔÓÙ Î È Î Ù ÛÎÂ ÔÓÙ Ó Ó ÌÂÙ ÊÚ ÛÙ Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά, Eισαγωγικές παρατηρήσεις... 113 7.1 Σχεδιάζοντας ένα µεταγλωττιστή για µια γλώσσα προγραµµατισµού... 115 7.2 Σύντοµη περιγραφή της Mini C... 116 7.3 Kατασκευή του πίνακα συµβόλων... 117 7.3.1 Oνόµατα και εµβέλεια... 117 7.4 Kατασκευή του λεκτικού αναλυτή... 119
EPIEXOMENA 9 7.4.1 Aντιµετώπιση λαθών... 120 7.5 Kατασκευή του συντακτικού & σηµασιολογικού αναλυτή... 121 7.6 Kατασκευή του ενδιάµεσου κώδικα... 125 7.6.1 Kατασκευή της αναπαράστασης τριών διευθύνσεων... 125 7.6.2 ηµιουργία ενιδάµεσου κώδικα... 126 7.6.3 Eκφράσεις... 126 7.6.4 Λογικές εκφράσεις... 127 7.6.5 Eντολές ελέγχου ροής... 129 7.6.6 Oρισµός και κλήση συναρτήσεων... 130 7.7 Kατασκευή τελικού κώδικα ή διερµηνεία... 131 7.7.1 Mεθοδολογία ανάπτυξης τελικού κώδικα... 131 7.7.2 ηµιουργία συµβολικού κώδικα για συναρτήσεις... 133 Σύνοψη... 135 Bιβλιογραφία... 135 Aπαντήσεις Aσκήσεων Aυτοαξιολόγησης... 137 Aπαντήσεις ραστηριοτήτων... 149 Γενική Bιβλιογραφία... 165
ÚfiÏÔÁÔ Ο τόµος που έχετε στα χέρια σας αποτελεί συνέχεια του τόµου «Μεταγλωττιστές», του οποίου θα πρέπει να έχετε µελετήσει και ολοκληρώσει τις Ασκήσεις Αυτοαξιολόγησης, όπως, φυσικά, και τις ραστηριότητες που περιλαµβάνει. Βασικός στόχος του τόµου είναι να σας βοηθήσει να συµπληρώσετε τις γνώσεις σας στους µεταφραστές γενικότερα, αλλά και να αποκτήσετε πρακτική εµπειρία στην κατασκευή ένος πραγµατικού (αλλά προφανώς µικρού, λόγω όγκου δουλειάς) µεταγλωττιστή ή διερµηνευτή. Ο τόµος αυτός έχει γίνει προσπάθεια να γραφτεί σύµφωνα µε τις οδηγίες και τα πρότυπα του Ελληνικού Ανοικτού Πανεπιστηµίου και προέρχεται από υλικό το οποίο διδάσκεται στο Τµήµα Μηχανικών Η/Υ και Πληροφορικής του Πανεπιστηµίου Πατρών. Για να φτάσει ο τόµος στη µορφή αυτή, βοήθησαν σηµαντικά τόσο τα σχόλια του Κριτικού Αναγνώστη, συνάδελφου Ι. Κοτρώνη, όσο και του επίσης συνάδελφου και Ακαδηµαϊκού Υπεύθυνου της Θεµατικής Ενότητας Σ. Κάτσικα. Με την ευκαιρία αυτή θέλουµε να ευχαριστήσουµε θερµά και τους δύο. Στο Kεφάλαιο 1 θα δείτε την αρχιτεκτονική δοµή ενός µεταγλωττιστή, τις διαδικασίες ανάπτυξής του και θα έρθετε σε µια πρώτη επαφή µε τα εργαλεία που θα χρησιµοποιήσετε, αργότερα για να αναπτύξετε και εσείς έναν τέτοιο µεταφραστή. Στο Kεφάλαιο 2 θα µάθετε πώς µπορείτε να περιγράφετε τις λεκτικές µονάδες (tokens) µιας γλώσσας και πώς µπορείτε να κατασκευάζετε ένα λεκτικό αναλυτή, ο οποίος θα αναγνωρίζει λεκτικές µονάδες από την είσοδό του. Για να επιτύχετε αυτό το σκοπό, θα µάθετε να χρησιµοποιείτε το πιο δηµοφιλές εργαλείο κατασκευής λεκτικών αναλυτών, το lex. Το Kεφάλαιο 3 περιέχει υλικό το οποίο θα σας βοηθήσει στην κατανόηση του τρόπου λειτουργίας των συντακτικών αναλυτών της κατηγορίας LL και (κυρίως) LR, όπως αυτοί οι οποίοι παράγονται από το εργαλείο Yacc, το οποίο και θα χρησιµοποιήσετε για την κατασκευή µεταγλωττιστών. Το Kεφάλαιο 4 θα σας υπενθυµίσει πώς µπορείτε να περιγράφετε τη συντακτική δοµή µιας γλώσσας προγραµµατισµού και πώς µπορείτε να κατασκευάζετε ένα συντακτικό αναλυτή, ο οποίος θα αναγνωρίζει τη συντακτική δοµή από την είσοδό του. Για να επιτύχετε αυτό το σκοπό, θα µάθετε να χρησιµοποιείτε το πιο δηµοφιλές εργαλείο κατασκευής συντακτικών αναλυτών, το Yacc. Στο Kεφάλαιο 5 θα µάθετε την παραγωγή τελικού κώδικα για την αρχιτεκτονική επεξεργαστών RISC. Για να το επιτύχετε αυτό, θα µάθετε τη δοµή και το ρεπερτόριο εντολών του εξοµοιωτή της γενιάς επεξεργαστών MIPS R2/3Κ spim και τις σηµαντικότερες εντολές του επεξεργαστή.
12 M ø π Στο Kεφάλαιο 6 περιγράφεται η οργανωτική δοµή και ο τρόπος λειτουργίας των διερµηνευτών, έτσι ώστε να είστε σε θέση όχι µόνο να κατανοείτε, αλλά και να κατασκευάζετε έναν απλό διερµηνευτή. Στο τελευταίο κεφάλαιο θα κατασκευάσετε τον πρώτο σας µεταγλωττιστή ή διερµηνευτή. Η γλώσσα την οποία καλείστε να µεταφράσετε ή να διερµηνεύσετε είναι ένα υποσύνολο της γλώσσας προγραµµατισµού C. Για να επιτύχετε αυτό το σκοπό, θα µάθετε πώς µπορείτε να χρησιµοποιείτε τη γνώση που αποκτήσατε στα προηγούµενα κεφάλαια µέσα από ένα σύνολο ραστηριοτήτων, οι οποίες θα σας κατευθύνουν µε συστηµατικό τρόπο στην τελική κατασκευή του µεταγλωττιστή ή διερµηνευτή σας.
ÂÓÈÎ BÈ ÏÈÔÁÚ Ê Η κατασκευή µεταγλωττιστών αποτελεί µια πολύ ενδιαφέρουσα και δηµιουργική ενασχόληση µε πάρα πολλές πρακτικές προεκτάσεις και δυνατότητες για όσους στοχεύουν να ασχοληθούν σοβαρά µε τη σχεδίαση και την ανάπτυξη λογισµικού συστη- µάτων και εφαρµογών. Υπάρχει εκτενής βιβλιογραφία σχετική µε τους µεταγλωττιστές, η οποία, όµως, παρουσιάζει µια ιδιοµορφία που είναι αποτέλεσµα τριών παραγόντων: της πολυπλοκότητας των µεταγλωττιστών, του εξαιρετικά µεγάλου όγκου της θεωρητικής γνώσης που είναι απαραίτητη για µια πλήρη θεωρητική τεκµηρίωση και του γεγονότος ότι, για να δοθεί ένα ολοκληρωµένο παράδειγµα κατασκευής ενός µετρίου µεγέθους µεταγλωττιστή, χρειάζεται ένα ογκώδες βιβλίο µόνο γι αυτό. Έτσι, αφενός µεν δεν υπάρχουν βιβλία που θα σας καλύψουν πλήρως θεωρητικά και πρακτικά, αφετέρου δε τα υπάρχοντα βιβλία καλύπτουν κατά κανόνα τον έναν από τους δυο αυτούς άξονες και είναι (εκτός ελαχίστων περιπτώσεων) εξαιρετικά µεγάλης έκτασης. Για το λόγο αυτό στη Θεµατική Υποενότητα «Μεταγλωττιστές» σας έχει δοθεί το «βασικό» θεωρητικό και λειτουργικό πλαίσιο µε απλό και κατανοητό τρόπο και η κατά το δυνατόν λιγότερη θεωρία, ενώ στη Θεµατική Υποενότητα «Εργαστηριακές Ασκήσεις Μεταγλωττιστών» (ΘΕ 9.1) που έχετε στα χέρια σας σάς δίνεται συµπληρωµατικό θεωρητικό και πρακτικό υλικό καθώς και εργαλεία, ώστε µέσω µιας σειράς αυξητικών ασκήσεων να έχετε τη δυνατότητα να κατασκευάσετε ένα µικρό µεταγλωττιστή ή διερµηνευτή. Παρακάτω προτείνονται ορισµένα πολύ καλά βιβλία που µπορούν να χρησιµοποιηθούν παράλληλα µε το κείµενο της Θεµατικής Υποενότητας που έχετε στα χέρια σας για την πληρέστερη κατανόηση της ύλης και την ολοκλήρωση των εργαστηριακών ασκήσεων. [1] J. Levine, T. Mason & D.Brown, Lex and Yacc (2nd ed.), O Reilly and Associates, 1992. Πολύ καλό βιβλίο που παρουσιάζει αναλυτικά, µε πολλά παραδείγµατα, τη χρήση του lex και του yacc στην πράξη. Είναι το βιβλίο που θα έχετε πάντα κοντά σας, όταν θα αρχίσετε να υλοποιείτε ένα µεταγλωττιστή. [2] R. Ηunter, Compilers: Τheir Design and Construction Using Ρascal, John Wiley & Sons, 1985. Είναι ένα καλογραµµένο βιβλίο για σχεδίαση µεταγλωττιστών, στο οποίο οι διάφοροι αλγόριθµοι που περιγράφονται είναι γραµµένοι σε Pascal. Το βιβλίο αυτό είναι από τα ελάχιστα βιβλία για µεταγλωττιστές µε τόσο µικρό αριθµό σελίδων (272), που, όµως, καλύπτει ικανοποιητικά το αντικείµενό του για προπτυχιακό επίπεδο. Θεωρούµε ότι µαζί µε το βιβλίο του Μ. Σκορδαλάκη (δείτε παρακάτω) αποτελεί καλό συµπληρωµατικό υλικό. ίνει βασικές αρχές
166 M ø π και λειτουργίες χωρίς, όµως, έµφαση σε πρακτικές εφαρµογές, διότι τότε θα αύξανε ο όγκος του βιβλίου κατά πολύ. Ένα ιδιαίτερο χαρακτηριστικό αυτού του βιβλίου είναι η χρήση του Pascal P code ως ενδιάµεσου κώδικα υποθετικής µηχανής (µηχανή Pascal) και η δηµιουργία Assembly κώδικα από τον Pascal P code. [3] A. V. Aho, R. Sethi, J. D. Ullman, Compilers: Ρrinciples techniques and Τools, Addison Wesley, 1986 (ISBN 0 201 10088 6), γνωστό και ως «το βιβλίο του δράκου» από την παράσταση που έχει στο εξώφυλλό του. Είναι βιβλίο αναφοράς και περιγράφει σε βάθος τις τεχνικές λεκτικής και συντακτικής ανάλυσης, συµπεριλαµβανοµένων αυτών που χρησιµοποιούνται στα lex και yacc. Πρόκειται για το κλασικότερο σύγγραµµα σε αρχές, τεχνικές, θεωρία και εργαλεία για τη σχεδίαση και κατασκευή µεταφραστικών συστηµάτων. Καλύπτει ολόκληρο το απαιτούµενο βασικό θεωρητικό υπόβαθρο για όλες τις φάσεις της µεταφραστικής διαδικασίας και περιλαµβάνει πολύ εκτεταµένη βιβλιογραφία. ε θα βρείτε στο βιβλίο αυτό πολλές συνταγές του τύπου «πώς το φτιάχνω» και γι αυτό το λόγο ορισµένοι το θεωρούν πολύ «θεωρητικό». ε συµµεριζόµαστε αυτή την άποψη (όπως και αρκετοί άλλοι συνάδελφοι) και το θεωρούµε ως το πιο πλήρες πανεπιστηµιακό σύγγραµµα, το οποίο λόγω της έκτασής του µπορεί να χρησιµοποιηθεί σε προπτυχιακό αλλά και σε εισαγωγικό µεταπτυχιακό επίπεδο. [4] Ronald Mak, Writing Compilers & Interpreters, An Applied Approach Using C ++, Second Edition, John Wiley, 1996. Το βιβλίο αυτό σας διδάσκει πώς να δηµιουργήσετε µεταγλωττιστές και διερµηνευτές από καθαρά πρακτική σκοπιά. Απευθύνεται σε «πρακτικούς» προγραµµατιστές, οι οποίοι δεν επιθυµούν να διαβάσουν άλλα πιο παραδοσιακά «θεωρητικά» βιβλία σε σχεδίαση µεταγλωττιστών, έχουν, όµως, σηµαντική προγραµµατιστική εµπειρία και φυσικά τις προαπαιτούµενες γνώσεις αυτής της Θεµατικής Υποενότητας. Σας το συνιστούµε ως ένα πολύ καλό «εργαστηριακό» βιβλίο µε µεγάλο αριθµό πρακτικών Παραδειγµάτων. Καταπιάνεται µε την κατασκευή ενός διερµηνευτή, ενός αλληλεπιδραστικού εκσφαλµατωτή και ενός µεταγλωττιστή της Pascal και παράγει κώδικα για τον επεξεργαστή 8086. [5] Μ. Σκορδαλάκης, Εισαγωγή στους Μεταγλωττιστές, ΕΜΠ, Aθήνα, 1993. Το βιβλίο αυτό προορίζεται ως βοήθηµα σε ένα µάθηµα εισαγωγικό στη σχεδίαση και κατασκευή µεταγλωττιστών. ίνει έµφαση στα πρακτικά προβλήµατα σχεδίασης και υλοποίησης και όχι στα θεωρητικά. Έτσι, µπορεί να θεωρηθεί πολύ καλό συµπληρωµατικό διδακτικό υλικό και καλύπτει προσεκτικά επιλεγµένη ύλη που µπορεί να χρησιµοποιηθεί για την υλοποίηση ενός µεταγλωττιστή. Στην
π Bπµ π ƒ ºπ 167 παρούσα έκδοση (1993) η υποθετική µηχανή (υπολογιστής) που είχε χρησιµοποιηθεί παλαιότερα αντικαταστάθηκε από IBM PC µε επεξεργαστή 8086. [6] Bennett J.P., Introduction to Compiling Techniques A First Course Using ANSI C, Lex and Yacc, McGraw Hill, 1990. Επίσης πολύ καλό βιβλίο για αρχάριους. Τον πηγαίο κώδικα των παραδειγµάτων µπορείτε να τον βρείτε στη διεύθυνση ftp://ftp.bath.ac.uk. [7] J Ρ. Τremblay, Ρ. Sorenson, Τhe Τheory and Ρractice of Compiler Writing, ΜcGraw Ηill, 1985. Το βιβλίο αυτό είναι αρκετά προχωρηµένο και µπορεί να χρησιµοποιηθεί σε µάθηµα «Σχεδίαση Μεταγλωττιστών» δύο εξαµήνων, είτε σε προχωρηµένο προπτυχιακό επίπεδο είτε σε εισαγωγικό µεταπτυχιακό επίπεδο. Για να µπορέσετε να το διαβάσετε και να το κατανοήσετε, θα πρέπει να έχετε τουλάχιστον ένα χρόνο πρακτική εµπειρία σε κάποια γλώσσα προγραµµατισµού και βασικές γνώσεις από Αρχιτεκτονική Υπολογιστών, γλώσσα Assembly, οµές εδοµένων και ιακριτά Μαθηµατικά. [8] D. Gries, Compiler Construction for Digital Computers, John Wiley & Sons, 1971. Είναι ένα από τα πρώτα (ίσως το πρώτο) βιβλία που γράφτηκαν για σχεδίαση µεταγλωττιστών. Παρουσιάζει για πρώτη φορά µε συστηµατικό και θεωρητικά τεκµηριωµένο τρόπο όλες τις φάσεις της µεταφραστικής διαδικασίας. Αφιερώνει ένα σηµαντικό µέρος της ύλης του στη «θεωρία τυπικών γλωσσών», καλύπτει, όµως, και τα υπόλοιπα θέµατα, όπως ανάνηψη από λάθη, δηµιουργία κώδικα, βελτιστοποίηση κλπ. Αν και µπορεί να θεωρήσει κανείς ότι είναι ξεπερασµένο, από την άποψη ότι δεν καλύπτει αναλυτές LL(1) και LR(1), παρόλ αυτά αποτελεί το πρώτο σοβαρό και πλήρες σύγγραµµα για την εποχή του και σηµαντικό µέρος της ύλης του παραµένει επιστηµονικά επίκαιρο. Για παράδειγµα, το κεφάλαιο για τους διερµηνευτές παραµένει κλασικό. [9] Axel T. Schreiner and H. George Friedman, Jr., Introduction to Compiler Construction with UNIX, Prentice Hall, 1985. Πολύ καλό βιβλίο για αρχάριους στην κατασκευή µεταγλωττιστών. Έχει, όµως, αρκετά τυπογραφικά λάθη. Παρέχεται, επίσης, ο πηγαίος κώδικας για την κατασκευή ενός υποσυνόλου της C στη διεύθυνση ftp://a.cs.uiuc.edu/pub/friedman/tar. [10] M.E.Lesk & E.Schmidt, Lex A Lexical Analyzer Generator: Bρείτε το στο Internet δωρεάν. Είναι το εγχειρίδιο οδηγιών του lex και παρά την ηλικία του αποτελεί και σήµερα ένα άριστο εισαγωγικό κείµενο. [11]Kernighan and Ritchie, The C Programming Language, Prentice Hall, 1978.
168 M ø π [12] Vern Paxson, Flex version 2.5 A fast scanner generator, Edition 2.5, March 1995: βρείτε το στο Internet δωρεάν, http://www.combo.org/lex ycc page/. Μαζί θα βρείτε και το πρόγραµµα Flex που είναι µια υλοποίηση του lex που διανέµεται και αυτή δωρεάν. [13] Stephen C. Johnson, Yacc: Yet Another Compiler Compiler: Bρείτε το στο Internet δωρεάν, http://www.combo.org/lex ycc page/. Είναι το εγχειρίδιο οδηγιών του yacc και παρά την ηλικία του αποτελεί και σήµερα ένα άριστο εισαγωγικό κείµενο. [14] Charles Donnelly and Richard Stallman, Bison The YACC compatible Parser Generator: Bρείτε το στο Internet δωρεάν, http://www.combo.org/lex ycc page/. Μαζί θα βρείτε και το πρόγραµµα Bison που είναι µια υλοποίηση του yacc που διανέµεται και αυτή δωρεάν. [15] F.R.A. Hopgood, COMPILING TECHNIQUES, American Elsevier, 1969 (American SBN 444 19769 9). [16] Τ. Ρittman and J. Ρeters, Τhe Art of Compiler Design, Τheory and Ρractise, Ρrentice Ηall, 1992. [17] S. S. Muchnick, Advanced COMPILER DESIGN & IMPLEMENTATION, Morgan Kaufman, 1997. [18] Hennessy & Patterson, Computer Organization and Design: The Hardware/ Software Interface, Morgan Kaufman, 1997. [19] J. Larus, Spim S20: A MIPS R2000 simulator, http://www.cs.wisc.edu/~larus/spim/spim documentation.pdf.