Sobes.tech
Middle

Comment le compilateur trouve-t-il la méthode à appeler?

sobes.tech IA

Réponse de l'IA

Le compilateur, lors du traitement de l'appel de méthode :

  • Vérifie la présence de la définition de la méthode dans la classe et ses superclasses.
  • Détermine par typage statique (au moment de la compilation) quelle méthode doit être appelée, si cela est possible.

Pendant l'exécution :

  • Un mécanisme de dispatch dynamique est utilisé.
  • L'objet conserve un pointeur vers sa classe.
  • La classe conserve une table de dispatch (method dispatch table), ou vtable en C++/Objective-C, ou une table de méthodes (method table) en Swift.
  • La table contient des pointeurs vers les implémentations des méthodes.
  • Lors de l'appel d'une méthode, l'environnement d'exécution recherche l'entrée correspondante dans la table de dispatch de la classe de l'objet par le nom du sélecteur (en Objective-C) ou par la signature de la méthode (en Swift, pour les méthodes virtuelles).
  • En trouvant l'entrée, le pointeur vers l'implémentation de la méthode est appelé.

En Objective-C, cela ressemble à :

// Exemple d'appel de méthode en Objective-C
// [cible messageName:parameter];
// Le runtime recherche 'messageName:' dans la table de dispatch de 'target'.class

En Swift :

// Exemple d'appel de méthode en Swift
// instance.methodName(parameter)
// Selon le type (classe finale, struct, protocole, dynamique)
// un dispatch statique ou dynamique est utilisé (vtable ou message dispatch)

Types de dispatch en Swift :

Type Dispatch Optimisation
struct, enum Statique Le compilateur connaît la méthode exacte
final class Statique Le compilateur connaît la méthode exacte
class (non final) Virtuel Via la table (vtable)
protocol (sans @objc) Virtuel Via la table de témoins de protocole (protocol witness table)
@objc (class, protocol) Dynamique Via le runtime Objective-C (message dispatch)