|
Πρόλογος |
iii |
|
Περιεχόμενα |
xv |
|
1 |
Εισαγωγή |
1 |
|
1.1 |
Γλώσσες προγραμματισμού |
1 |
|
1.2 |
Μεταγλωττιστές |
2 |
|
1.3 |
Αναγκαιότητα και ιστορική αναδρομή |
4 |
|
1.4 |
Είδη μεταγλωττιστών και συναφή εργαλεία |
5 |
|
1.5 |
Κατασκευή ενός μεταγλωττιστή |
10 |
|
|
1.5.1 |
Ορισμός του προβλήματος |
10 |
|
|
1.5.2 |
Απαιτήσεις |
10 |
|
|
1.5.3 |
Φάσεις της μεταγλώττισης |
12 |
|
|
|
1.5.3.1 |
Λεκτική ανάλυση |
14 |
|
|
|
1.5.3.2 |
Συντακτική ανάλυση |
14 |
|
|
|
1.5.3.3 |
Σημασιολογική ανάλυση |
14 |
|
|
|
1.5.3.4 |
Παραγωγή ενδιάμεσου κώδικα |
15 |
|
|
|
1.5.3.5 |
Βελτιστοποίηση |
16 |
|
|
|
1.5.3.6 |
Παραγωγή τελικού κώδικα |
16 |
|
|
1.5.4 |
Επιλογές κατά την υλοποίηση |
16 |
|
|
|
1.5.4.1 |
Οργάνωση σε περάσματα |
17 |
|
|
|
1.5.4.2 |
Οργάνωση σε εμπρόσθιο και οπίσθιο τμήμα |
18 |
|
|
1.5.5 |
Έλεγχος ορθότητας |
19 |
|
|
1.5.6 |
Σφάλματα και ανάνηψη |
19 |
|
1.6 |
Ένας πειραματικός μεταγλωττιστής |
21 |
|
Ασκήσεις |
23 |
|
2 |
Τυπικές γλώσσες |
25 |
|
2.1 |
Ορισμοί |
25 |
|
|
2.1.1 |
Γλώσσες |
26 |
|
2.2 |
Γεννητικά και αναγνωριστικά μοντέλα |
28 |
|
|
2.2.1 |
Γραμματικές |
28 |
|
|
2.2.2 |
Ιεραρχία Chomsky |
30 |
|
|
2.2.3 |
Αναγνωριστές |
30 |
|
2.3 |
Κανονικές γλώσσες |
32 |
|
|
2.3.1 |
Κανονικές εκφράσεις |
33 |
|
|
2.3.2 |
Πεπερασμένα αυτόματα |
34 |
|
|
|
2.3.2.1 |
Ντετερμινιστικά πεπερασμένα αυτόματα |
35 |
|
|
|
2.3.2.2 |
Μη-ντετερμινιστικά πεπερασμένα αυτόματα |
35 |
|
|
|
2.3.2.3 |
Μη-ντετερμινιστικά πεπερασμένα αυτόματα
με μηδενικές μεταβάσεις |
36 |
|
|
|
2.3.2.4 |
Τρόποι παράστασης πεπερασμένων αυτομάτων |
37 |
|
|
|
2.3.2.5 |
Καταστάσεις παγίδευσης |
39 |
|
|
|
2.3.2.6 |
Ισοδυναμία πεπερασμένων αυτομάτων |
39 |
|
|
|
2.3.2.7 |
Ελαχιστοποίηση ΝΠΑ |
40 |
|
|
2.3.3 |
Αναγωγές |
42 |
|
|
|
2.3.3.1 |
Αναγωγή κανονικής γραμματικής σε ΜΠΑ-ε |
43 |
|
|
|
2.3.3.2 |
Αναγωγή κανονικής έκφρασης σε ΜΠΑ-ε |
44 |
|
2.4 |
Γλώσσες χωρίς συμφραζόμενα |
47 |
|
|
2.4.1 |
Γραμματικές χωρίς συμφραζόμενα |
47 |
|
|
|
2.4.1.1 |
Ισοδύναμες γραμματικές |
49 |
|
|
|
2.4.1.2 |
Διφορούμενες γραμματικές |
49 |
|
|
|
2.4.1.3 |
Τρόποι παράστασης γραμματικών |
52 |
|
|
2.4.2 |
Αυτόματα στοίβας |
54 |
|
|
|
2.4.2.1 |
Τρόποι παράστασης αυτομάτων στοίβας |
56 |
|
|
|
2.4.2.2 |
Είδη αυτομάτων στοίβας |
59 |
|
|
2.4.3 |
Οι γλώσσες χωρίς συμφραζόμενα στην κατασκευή
μεταγλωττιστών |
60 |
|
2.5 |
Κατηγορικές γραμματικές |
61 |
|
|
2.5.1 |
Χρήση κατηγορικών γραμματικών |
62 |
|
|
2.5.2 |
Κατηγορικές γραμματικές και μεταγλωττιστές |
65 |
|
Ασκήσεις |
65 |
|
3 |
Λεκτική ανάλυση |
69 |
|
3.1 |
Λεκτικές μονάδες |
69 |
|
3.2 |
Αναγνώριση λεκτικών μονάδων |
70 |
|
|
3.2.1 |
Μια γενική μέθοδος |
71 |
|
|
3.2.2 |
Μια ειδική μέθοδος με βάση τα διαγράμματα
μετάβασης |
73 |
|
3.3 |
Ανάνηψη από σφάλματα |
74 |
|
3.4 |
Σχεδίαση και υλοποίηση ενός λεκτικού αναλυτή
με βάση τα διαγράμματα μετάβασης |
76 |
|
|
3.4.1 |
Καταγραφή και ταξινόμηση των χαρακτήρων |
77 |
|
|
3.4.2 |
Καταγραφή και ταξινόμηση των λεκτικών μονάδων |
78 |
|
|
3.4.3 |
Ενδιάμεση μνήμη και ανάνηψη από σφάλματα |
79 |
|
|
3.4.4 |
Σχεδίαση του διαγράμματος μετάβασης |
80 |
|
|
3.4.5 |
Υλοποίηση του λεκτικού αναλυτή |
81 |
|
3.5 |
Υλοποίηση ενός λεκτικού αναλυτή με το μεταεργαλείο
flex |
84 |
|
|
3.5.1 |
Περιγραφή κανονικών εκφράσεων στο flex |
86 |
|
|
3.5.2 |
Ένα παράδειγμα χρήσης του flex |
86 |
|
|
3.5.3 |
Ορισμός αρχικών καταστάσεων |
89 |
|
|
3.5.4 |
Το περιβάλλον εκτέλεσης του flex |
90 |
|
Ασκήσεις |
91 |
|
4 |
Συντακτική ανάλυση |
93 |
|
4.1 |
Εισαγωγή |
93 |
|
|
4.1.1 |
Βοηθητικές έννοιες: FIRST και FOLLOW |
94 |
|
4.2 |
Συντακτικοί αναλυτές από πάνω προς τα κάτω |
97 |
|
|
4.2.1 |
Γραμματικές LL(1) |
98 |
|
|
|
4.2.1.1 |
Αντικατάσταση |
99 |
|
|
|
4.2.1.2 |
Αριστερή παραγοντοποίηση |
99 |
|
|
|
4.2.1.3 |
Απαλοιφή αριστερής αναδρομής |
100 |
|
|
4.2.2 |
Συντακτικοί αναλυτές αναδρομικής κατάβασης |
101 |
|
|
4.2.3 |
Συντακτικοί αναλυτές LL(1) |
103 |
|
|
|
4.2.3.1 |
Κατασκευή του πίνακα συντακτικής ανάλυσης
LL(1) |
104 |
|
|
|
4.2.3.2 |
Λειτουργία συντακτικού αναλυτή LL(1) |
105 |
|
4.3 |
Συντακτικοί αναλυτές από κάτω προς τα πάνω |
106 |
|
|
4.3.1 |
Συντακτικοί αναλυτές LR(k) |
109 |
|
|
|
4.3.1.1 |
Λειτουργία συντακτικού αναλυτή LR(1) |
110 |
|
|
|
4.3.1.2 |
Κατασκευή των πινάκων ελέγχου LR(1) |
111 |
|
|
4.3.2 |
Συντακτικοί αναλυτές SLR(1) |
112 |
|
|
|
4.3.2.1 |
Στοιχεία |
112 |
|
|
|
4.3.2.2 |
Η συνάρτηση CLOSURE |
112 |
|
|
|
4.3.2.3 |
Η συνάρτηση GOTO |
113 |
|
|
|
4.3.2.4 |
Εύρεση του συνόλου καταστάσεων |
114 |
|
|
|
4.3.2.5 |
Κατασκευή των πινάκων ελέγχου SLR(1) |
115 |
|
|
4.3.3 |
Συντακτικοί αναλυτές LALR(1) με το μεταεργαλείο
bison |
119 |
|
|
|
4.3.3.1 |
Περιγραφή κανόνων παραγωγής στο bison |
122 |
|
|
|
4.3.3.2 |
Επίλυση συγκρούσεων στο bison |
124 |
|
|
|
4.3.3.3 |
Χειρισμός συντακτικών σφαλμάτων στο bison |
125 |
|
|
|
4.3.3.4 |
Το περιβάλλον εκτέλεσης του bison |
125 |
|
4.4 |
Ανάνηψη από σφάλματα |
126 |
|
|
4.4.1 |
Στρατηγικές για ανάνηψη από σφάλματα |
127 |
|
|
4.4.2 |
Ανάνηψη από σφάλματα σε συντακτικό αναλυτή
LL(1) |
129 |
|
|
4.4.3 |
Ανάνηψη από σφάλματα σε συντακτικό αναλυτή
LR(1) |
130 |
|
Ασκήσεις |
131 |
|
5 |
Πίνακες συμβόλων |
137 |
|
5.1 |
Εισαγωγή |
137 |
|
5.2 |
Χαρακτηριστικά των ονομάτων |
138 |
|
5.3 |
Περιεχόμενα του πίνακα συμβόλων |
140 |
|
5.4 |
Οργάνωση του πίνακα συμβόλων |
141 |
|
|
5.4.1 |
Γραμμικές λίστες |
142 |
|
|
5.4.2 |
Δέντρα δυαδικής αναζήτησης |
142 |
|
|
5.4.3 |
Πίνακες κατακερματισμού |
143 |
|
|
5.4.4 |
Πολλαπλές εμβέλειες |
144 |
|
Ασκήσεις |
146 |
|
6 |
Σημασιολογική ανάλυση |
147 |
|
6.1 |
Σύνταξη και σημασιολογία |
147 |
|
|
6.1.1 |
Στατική σημασιολογία |
147 |
|
|
6.1.2 |
Δυναμική σημασιολογία |
150 |
|
6.2 |
Είδη σημασιολογικών ελέγχων |
150 |
|
6.3 |
Συστήματα τύπων και σημασιολογικός έλεγχος |
152 |
|
|
6.3.1 |
Βασικοί και σύνθετοι τύποι |
152 |
|
|
6.3.2 |
Απλές εκφράσεις και έλεγχοι βασικών τύπων |
154 |
|
|
6.3.3 |
Μετατροπές τύπων |
156 |
|
|
6.3.4 |
Υπερφόρτωση τελεστών |
156 |
|
|
6.3.5 |
Πολυμορφικοί τελεστές |
157 |
|
|
6.3.6 |
Συνώνυμα τύπων |
158 |
|
|
6.3.7 |
Ισοδυναμία τύπων |
158 |
|
|
|
6.3.7.1 |
Δομική ισοδυναμία τύπων |
159 |
|
|
|
6.3.7.2 |
Ονομαστική ισοδυναμία τύπων |
159 |
|
|
6.3.8 |
Υποσύνολα τύπων και υποτύποι |
160 |
|
|
6.3.9 |
Πολυμορφικά συστήματα τύπων |
161 |
|
|
6.3.10 |
Αντιστοίχιση τύπων σε ονόματα |
161 |
|
|
6.3.11 |
Εξαγωγή τύπων |
162 |
|
6.4 |
Δυναμικός έλεγχος τύπων |
164 |
|
Ασκήσεις |
165 |
|
7 |
Παραγωγή ενδιάμεσου κώδικα |
167 |
|
7.1 |
Ενδιάμεσος κώδικας |
167 |
|
|
7.1.1 |
Μετάφραση οδηγούμενη από τη σύνταξη |
168 |
|
|
7.1.2 |
Ενδιάμεση γλώσσα |
169 |
|
|
|
7.1.2.1 |
Τετράδες |
170 |
|
|
|
7.1.2.2 |
Τριάδες |
171 |
|
|
|
7.1.2.3 |
Αφηρημένα συντακτικά δέντρα |
171 |
|
|
|
7.1.2.4 |
Προθεματικός και επιθεματικός κώδικας |
172 |
|
|
|
7.1.2.5 |
Κατευθυνόμενοι ακυκλικοί γράφοι |
172 |
|
7.2 |
Παραγωγή ενδιάμεσου κώδικα σε μορφή τετράδων |
173 |
|
|
7.2.1 |
Η γλώσσα των τετράδων |
173 |
|
|
|
7.2.1.1 |
Τελούμενα |
174 |
|
|
|
7.2.1.2 |
Τελεστές |
175 |
|
|
7.2.2 |
Μεταγλώσσα μετάφρασης και μεταβλητές ιδιοτήτων |
178 |
|
|
7.2.3 |
Ένα απλό σχέδιο παραγωγής τετράδων |
180 |
|
|
|
7.2.3.1 |
Απλές εκφράσεις |
180 |
|
|
|
7.2.3.2 |
Αριθμητικές εκφράσεις |
181 |
|
|
|
7.2.3.3 |
L-values και δείκτες |
182 |
|
|
|
7.2.3.4 |
Λογικές εκφράσεις |
184 |
|
|
|
7.2.3.5 |
Απλές εντολές |
189 |
|
|
|
7.2.3.6 |
Σύνθετη εντολή |
190 |
|
|
|
7.2.3.7 |
Εντολή if |
191 |
|
|
|
7.2.3.8 |
Εντολή while |
193 |
|
|
|
7.2.3.9 |
Χρήση υποπρογραμμάτων |
194 |
|
|
|
7.2.3.10 |
Δυναμική παραχώρηση μνήμης |
196 |
|
|
|
7.2.3.11 |
Δηλώσεις δομικών μονάδων |
198 |
|
|
|
7.2.3.12 |
Ένα ολοκληρωμένο παράδειγμα |
199 |
|
7.3 |
Διερμηνείς |
199 |
|
Ασκήσεις |
201 |
|
8 |
Βελτιστοποίηση κώδικα |
205 |
|
8.1 |
Εισαγωγή |
205 |
|
|
8.1.1 |
Κριτήρια εφαρμογής μετασχηματισμών βελτιστοποίησης |
206 |
|
|
8.1.2 |
Επίτευξη καλύτερης απόδοσης |
207 |
|
|
8.1.3 |
Οργάνωση ενός βελτιστοποιητικού μεταγλωττιστή |
208 |
|
8.2 |
Ανάλυση ροής ελέγχου και ροής δεδομένων |
209 |
|
8.3 |
Βελτιστοποιητικοί μετασχηματισμοί |
212 |
|
|
8.3.1 |
Μετασχηματισμοί υψηλού επιπέδου |
213 |
|
|
|
8.3.1.1 |
Αποτίμηση σταθερών εκφράσεων |
213 |
|
|
|
8.3.1.2 |
Αλγεβρικοί μετασχηματισμοί |
214 |
|
|
|
8.3.1.3 |
Απαλοιφή κοινών υποεκφράσεων |
215 |
|
|
|
8.3.1.4 |
Διάδοση αντιγράφων |
216 |
|
|
|
8.3.1.5 |
Ενοποίηση κώδικα |
218 |
|
|
8.3.2 |
Μετασχηματισμοί βρόχων |
220 |
|
|
|
8.3.2.1 |
Μετακίνηση κώδικα |
220 |
|
|
|
8.3.2.2 |
Απαλοιφή επαγωγικών μεταβλητών και υποβιβασμός
ισχύος |
221 |
|
|
|
8.3.2.3 |
Αναδιοργάνωση βρόχων |
224 |
|
|
|
8.3.2.4 |
Απαλοιφή ελέγχου ορίων πίνακα |
226 |
|
|
8.3.3 |
Μετασχηματισμοί χαμηλού επιπέδου |
228 |
|
|
|
8.3.3.1 |
Απαλοιφή άχρηστου κώδικα |
228 |
|
|
|
8.3.3.2 |
Ευθυγράμμιση |
228 |
|
|
|
8.3.3.3 |
Απλοποίηση συνθηκών και αλμάτων |
230 |
|
|
8.3.4 |
Μετασχηματισμοί υποπρογραμμάτων |
230 |
|
|
|
8.3.4.1 |
Ενσωμάτωση υποπρογράμματος |
233 |
|
|
|
8.3.4.2 |
Κλήσεις ουράς και συνένωση |
234 |
|
|
|
8.3.4.3 |
Υποπρογράμματα φύλλα |
237 |
|
|
8.3.5 |
Παράδειγμα: Η βελτιστοποίηση του quicksort |
237 |
|
Ασκήσεις |
238 |
|
9 |
Παραγωγή τελικού κώδικα |
239 |
|
9.1 |
Γεννήτορας τελικού κώδικα |
239 |
|
9.2 |
Τελικός υπολογιστής |
240 |
|
|
9.2.1 |
Καταχωρητές |
241 |
|
|
9.2.2 |
Διαχείριση μνήμης |
242 |
|
|
9.2.3 |
Εντολές |
243 |
|
|
|
9.2.3.1 |
Εντολές μεταφοράς |
243 |
|
|
|
9.2.3.2 |
Εντολές ακεραίων αριθμητικών πράξεων |
244 |
|
|
|
9.2.3.3 |
Εντολές λογικών πράξεων |
245 |
|
|
|
9.2.3.4 |
Εντολές άλματος |
245 |
|
|
|
9.2.3.5 |
Εντολές διαχείρισης στοίβας |
246 |
|
|
|
9.2.3.6 |
Εντολές υποπρογραμμάτων |
246 |
|
|
|
9.2.3.7 |
Εντολές αριθμητικών πράξεων κινητής υποδιαστολής |
247 |
|
9.3 |
Περιβάλλον εκτέλεσης |
249 |
|
|
9.3.1 |
Παράσταση δεδομένων |
249 |
|
|
9.3.2 |
Εγγραφήματα δραστηριοποίησης |
251 |
|
|
9.3.3 |
Οργάνωση της μνήμης |
252 |
|
|
9.3.4 |
Δομή ενοτήτων και μη τοπικά δεδομένα |
254 |
|
|
|
9.3.4.1 |
Σύνδεσμοι προσπέλασης |
255 |
|
|
|
9.3.4.2 |
Πίνακες δεικτών |
258 |
|
|
9.3.5 |
Πέρασμα παραμέτρων |
259 |
|
9.4 |
Παραγωγή αποδοτικού τελικού κώδικα |
262 |
|
|
9.4.1 |
Δέσμευση καταχωρητών |
262 |
|
|
9.4.2 |
Επιλογή εντολών |
264 |
|
9.5 |
Το τελικό πρόγραμμα |
270 |
|
|
9.5.1 |
Η βιβλιοθήκη χρόνου εκτέλεσης |
271 |
|
|
9.5.2 |
Σταθερές συμβολοσειρές |
272 |
|
|
9.5.3 |
Σταθερές κινητής υποδιαστολής |
272 |
|
9.6 |
Ένας γεννήτορας τελικού κώδικα για την ενδιάμεση
γλώσσα τετράδων |
273 |
|
|
9.6.1 |
Βοηθητικές ρουτίνες |
273 |
|
|
|
9.6.1.1 |
Βοηθητική ρουτίνα getΑR |
273 |
|
|
|
9.6.1.2 |
Βοηθητική ρουτίνα updateΑL |
273 |
|
|
|
9.6.1.3 |
Βοηθητική ρουτίνα load |
274 |
|
|
|
9.6.1.4 |
Βοηθητική ρουτίνα loadReal |
274 |
|
|
|
9.6.1.5 |
Βοηθητική ρουτίνα loadΑddr |
275 |
|
|
|
9.6.1.6 |
Βοηθητική ρουτίνα store |
275 |
|
|
|
9.6.1.7 |
Βοηθητική ρουτίνα storeReal |
277 |
|
|
|
9.6.1.8 |
Βοηθητική ρουτίνα name |
277 |
|
|
|
9.6.1.9 |
Βοηθητική ρουτίνα endof |
277 |
|
|
|
9.6.1.10 |
Βοηθητική ρουτίνα label |
278 |
|
|
9.6.2 |
Παραγωγή κώδικα |
278 |
|
|
|
9.6.2.1 |
Ανάθεση και στοιχεία πίνακα |
279 |
|
|
|
9.6.2.2 |
Αριθμητικές πράξεις και συγκρίσεις |
279 |
|
|
|
9.6.2.3 |
Δομικές μονάδες, κλήσεις και άλματα |
282 |
|
|
9.6.3 |
Ένα ολοκληρωμένο παράδειγμα |
284 |
|
Ασκήσεις |
287 |
|
10 |
Αντικειμενοστρεφείς γλώσσες |
289 |
|
10.1 |
Αντικειμενοστρεφής προγραμματισμός |
289 |
|
10.2 |
Αντικείμενα και μέθοδοι |
290 |
|
10.3 |
Κατασκευαστές και καταστροφείς |
291 |
|
10.4 |
Απλή κληρονομικότητα |
293 |
|
10.5 |
Πολυμορφισμός υποτύπων |
296 |
|
10.6 |
Πολλαπλή κληρονομικότητα |
299 |
|
10.7 |
Έλεγχος υποτύπων και μετατροπές |
303 |
|
10.8 |
Διαπροσωπείες |
306 |
|
Ασκήσεις |
309 |
|
ΠΑΡΑΡΤΗΜΑΤΑ |
|
|
Α |
Η γλώσσα προγραμματισμού PCL |
311 |
|
Α.1 |
Λεκτικές μονάδες |
311 |
|
Α.2 |
Τύποι δεδομένων |
313 |
|
Α.3 |
Δομή του προγράμματος |
314 |
|
|
Α.3.1 |
Μεταβλητές |
315 |
|
|
Α.3.2 |
Υποπρογράμματα |
315 |
|
Α.4 |
Εκφράσεις |
316 |
|
|
Α.4.1 |
L-values |
316 |
|
|
Α.4.2 |
Σταθερές |
317 |
|
|
Α.4.3 |
Τελεστές |
317 |
|
|
Α.4.4 |
Κλήση συναρτήσεων |
319 |
|
Α.5 |
Εντολές |
319 |
|
Α.6 |
Βιβλιοθήκη χρόνου εκτέλεσης |
321 |
|
|
Α.6.1 |
Είσοδος και έξοδος |
321 |
|
|
Α.6.2 |
Μαθηματικές συναρτήσεις |
322 |
|
|
Α.6.3 |
Συναρτήσεις μετατροπής |
322 |
|
Α.7 |
Πλήρης γραμματική της PCL |
322 |
|
Β |
Παραδείγματα μεταγλώττισης |
325 |
|
Β.1 |
Πες γεια! |
325 |
|
Β.2 |
Οι πύργοι του Hanoi |
327 |
|
Β.3 |
Πρώτοι αριθμοί |
336 |
|
Β.4 |
Ταξινόμηση με τη μέθοδο της φυσαλίδας |
341 |
|
Β.5 |
Μέση τιμή τυχαίας μεταβλητής |
346 |
|
Βιβλιογραφία |
351 |
|
Ευρετήριο |
355 |