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