Middle
Kako kompajler pronalazi metod koji treba pozvati?
sobes.tech АИ
Одговор од АИ
Kompajler, obrađujući poziv metode:
- Proverava da li definicija metode postoji u klasi i njenim superklasama.
- Određuje pomoću statičke tipizacije (tokom kompilacije) koja metoda treba biti pozvana, ako je to moguće.
Tokom izvršenja:
- Koristi se mehanizam dinamičkog usmeravanja.
- Objekat čuva pokazivač na svoju klasu.
- Klasa čuva tabelu usmeravanja (method dispatch table), ili vtable u C++/Objective-C, ili tabelu metoda (method table) u Swift.
- Tabela sadrži pokazivače na implementacije metoda.
- Pri pozivu metode, okruženje za izvršenje traži odgovarajući zapis u tabeli usmeravanja klase objekta po imenu selektora (u Objective-C) ili po potpisu metode (u Swift, za virtuelne metode).
- Nakon pronalaska zapisa, poziva se pokazivač na implementaciju metode.
U Objective-C ovo izgleda ovako:
// Primer poziva metode u Objective-C
// [target messageName:parameter];
// Runtime traži 'messageName:' u tabeli usmeravanja 'target'.class
U Swift:
// Primer poziva metode u Swift
// instance.methodName(parameter)
// U zavisnosti od tipa (final klasa, struktura, protokol, dinamički)
// koristi se statičko ili dinamičko usmeravanje (vtable ili message dispatch)
Tipovi usmeravanja u Swift:
| Tip | Usmeravanje | Optimizacija |
|---|---|---|
struct, enum |
Statičko | Kompajler zna tačno metodu |
final class |
Statičko | Kompajler zna tačno metodu |
class (ne final) |
Virtuozno | Kroz tabelu (vtable) |
protocol (bez @objc) |
Virtuozno | Kroz tabelu svedoka protokola (protocol witness table) |
@objc (class, protocol) |
Dinamičko | Kroz runtime Objective-C (message dispatch) |