Sobes.tech
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)