Μεταγλωττιστές και διερμηνευτές — DedSec Project
Μεταγλωττιστές και διερμηνευτές: ανάλυση πριν από την εκτέλεση Νοητικό μοντέλο Ο μεταγλωττιστής μετατρέπει μια αναπαράσταση σε άλλη: πηγαίο κώδικα σε bytecode, ενδιάμεσο κώδικα ή εντολές…
Μεταγλωττιστές και διερμηνευτές: ανάλυση πριν από την εκτέλεση
Νοητικό μοντέλο
Ο μεταγλωττιστής μετατρέπει μια αναπαράσταση σε άλλη: πηγαίο κώδικα σε bytecode, ενδιάμεσο κώδικα ή εντολές μηχανής. Ο διερμηνευτής αξιολογεί μια αναπαράσταση. Οι πραγματικές υλοποιήσεις συνδυάζουν τις δύο τεχνικές. Η CPython αναλύει και μεταγλωττίζει το αρχείο σε bytecode πριν το εκτελέσει η εικονική μηχανή. Μια JavaScript engine μπορεί αρχικά να ερμηνεύει κώδικα και αργότερα να βελτιστοποιεί συναρτήσεις που εκτελούνται συχνά.
Η αλυσίδα περιλαμβάνει tokenization, parsing, σημασιολογικούς ελέγχους, ενδιάμεση αναπαράσταση, βελτιστοποίηση και εκτέλεση ή παραγωγή αρχείου. Το συντακτικό λάθος σημαίνει ότι δεν σχηματίζεται έγκυρη δομή. Ένα άγνωστο όνομα μπορεί να εντοπιστεί σε διαφορετικό στάδιο ανάλογα με τη γλώσσα.
Πείραμα με προτεραιότητα τελεστών
Η έκφραση 2 + 3 * 4 έχει πρόσθεση στη ρίζα και πολλαπλασιασμό στο δεξί υποδέντρο. Οι παρενθέσεις στο (2 + 3) * 4 κάνουν τον πολλαπλασιασμό ρίζα. Τα αποτελέσματα είναι 14 και 20 αντίστοιχα.
import ast
normal = ast.parse("2 + 3 * 4", mode="eval")
grouped = ast.parse("(2 + 3) * 4", mode="eval")
assert isinstance(normal.body.op, ast.Add)
assert isinstance(normal.body.right.op, ast.Mult)
assert isinstance(grouped.body.op, ast.Mult)
assert isinstance(grouped.body.left.op, ast.Add)
try:
ast.parse("2 + * 3", mode="eval")
except SyntaxError:
pass
else:
raise AssertionError("Expected syntax error")
print(ast.dump(normal, indent=2))
Αποθήκευσε ως parse_lab.py και εκτέλεσε python3 parse_lab.py. Το πρόγραμμα εξετάζει το συντακτικό δέντρο χωρίς να εκτελεί την έκφραση. Το αρνητικό test επιβεβαιώνει ότι η λανθασμένη σύνταξη απορρίπτεται πριν ξεκινήσει η λογική της εφαρμογής.
Διάγνωση ανά στάδιο
Σε unexpected token, μίκρυνε το παράδειγμα και έλεγξε προηγούμενες παρενθέσεις και τελεστές. Σε άγνωστο όνομα, εντόπισε πότε γίνεται name resolution. Αν ο compiler παράγει object files αλλά αποτυγχάνει το linking, εξέτασε σύμβολα και flags. Αν η εφαρμογή μεταγλωττίζεται αλλά καταρρέει, έλεγξε δεδομένα και κατάσταση εκτέλεσης.
Ανεξάρτητη άσκηση
Υλοποίησε αναδρομικό evaluator που επιτρέπει μόνο ακέραιες σταθερές, πρόσθεση και πολλαπλασιασμό σε AST. Απόρριψε κλήσεις συναρτήσεων, ονόματα και πρόσβαση σε attributes. Δοκίμασε τις δύο εκφράσεις και μία απορριπτέα κλήση. Εξήγησε γιατί ένα συντακτικό δέντρο βοηθά στον σχεδιασμό αλλά δεν αποδεικνύει την ασφάλεια του προγράμματος.
Τεκμηρίωση: https://docs.python.org/3/library/ast.html