Sobes.tech
Middle

Kā kompilators atrod metodi, kuru vajadzētu izsaukt?

sobes.tech AI

Atbilde no AI

Kompilators, izsaucot metodi:

  • pārbauda metodes definīciju klasē un tās vecāku klasēs.
  • ar statisku tipizāciju (kompilācijas laikā) nosaka, kurš metodes izsaukums ir pareizs, ja tas ir iespējams.

Vērtības laikā:

  • tiek izmantots dinamiskās maršrutizācijas mehānisms.
  • objekts glabā norādi uz savu klasi.
  • klase glabā maršrutizācijas tabulu (method dispatch table), vai vtable C++/Objective-C, vai metožu tabulu (method table) Swift.
  • tabula satur norādes uz metožu realizācijām.
  • izsaucot metodi, izpildes vide meklē atbilstošo ierakstu objekta klases maršrutizācijas tabulā pēc selektora nosaukuma (Objective-C) vai metodes signatūras (Swift, virtuālajiem metodēm).
  • atradusi ierakstu, tiek izsaukta metodes realizācijas norāde.

Objective-C tas izskatās šādi:

// Piemērs, kā izsaukt metodi Objective-C
// [target messageName:parameter];
// Runtime meklē 'messageName:' 'target'.class maršrutizācijas tabulā

Swift:

// Piemērs, kā izsaukt metodi Swift
// instance.methodName(parameter)
// Atkarībā no tipa (final class, struct, protocol, dynamic)
// tiek izmantota statiska vai dinamiska maršrutizācija (vtable vai message dispatch)

Swift maršrutizācijas tipi:

Tips Maršrutizācija Optimizācija
struct, enum Statiska Kompilators zina precīzu metodi
final class Statiska Kompilators zina precīzu metodi
class (ne final) Virtuāla Per tabulu (vtable)
protocol (bez @objc) Virtuāla Per protokola liecinieka tabulu (protocol witness table)
@objc (class, protocol) Dīnamiska Per Objective-C izpildi (message dispatch)