Middle
Πώς βρίσκει ο μεταγλωττιστής τη μέθοδο που πρέπει να καλεστεί;
sobes.tech AI
Απάντηση από AI
Ο μεταγλωττιστής, επεξεργαζόμενος την κλήση μεθόδου:
- Ελέγχει την ύπαρξη ορισμού μεθόδου στην κλάση και τις υπερκλάσεις της.
- Καθορίζει μέσω στατικής τυποποίησης (κατά τη διάρκεια της μεταγλώττισης), ποια μέθοδος πρέπει να κληθεί, αν είναι δυνατόν.
Κατά την εκτέλεση:
- Χρησιμοποιείται μηχανισμός δυναμικής δρομολόγησης.
- Το αντικείμενο διατηρεί δείκτη στην κλάση του.
- Η κλάση διατηρεί πίνακα δρομολόγησης (method dispatch table), ή vtable σε C++/Objective-C, ή πίνακα μεθόδων (method table) σε Swift.
- Ο πίνακας περιέχει δείκτες στις υλοποιήσεις των μεθόδων.
- Όταν καλείται μια μέθοδος, το περιβάλλον εκτέλεσης αναζητά την αντίστοιχη εγγραφή στον πίνακα δρομολόγησης της κλάσης του αντικειμένου με βάση το όνομα του επιλεκτή (σε Objective-C) ή την υπογραφή της μεθόδου (σε Swift, για εικονικές μεθόδους).
- Βρίσκοντας την εγγραφή, καλείται ο δείκτης στην υλοποίηση της μεθόδου.
Στην Objective-C, αυτό φαίνεται έτσι:
// Παράδειγμα κλήσης μεθόδου σε Objective-C
// [target messageName:parameter];
// Το runtime αναζητά το 'messageName:' στον πίνακα δρομολόγησης του 'target'.class
Στο Swift:
// Παράδειγμα κλήσης μεθόδου σε Swift
// instance.methodName(parameter)
// Ανάλογα με τον τύπο (τελική κλάση, δομή, πρωτόκολλο, δυναμικό)
// χρησιμοποιείται στατική ή δυναμική δρομολόγηση (vtable ή message dispatch)
Τύποι δρομολόγησης σε Swift:
| Τύπος | Δρομολόγηση | Βελτιστοποίηση |
|---|---|---|
struct, enum |
Στατική | Ο μεταγλωττιστής γνωρίζει ακριβώς τη μέθοδο |
final class |
Στατική | Ο μεταγλωττιστής γνωρίζει ακριβώς τη μέθοδο |
class (όχι final) |
Εικονική | Μέσω πίνακα (vtable) |
protocol (χωρίς @objc) |
Εικονική | Μέσω πίνακα μαρτύρων πρωτοκόλλου (protocol witness table) |
@objc (class, protocol) |
Δυναμική | Μέσω του runtime Objective-C (message dispatch) |