Sobes.tech
Middle

Ինչպե՞ս է կոմպիլյատորը գտնում այն մեթոդը, որը պետք է կանչել:

sobes.tech AI

Պատասխան AI-ից

Կոմպիլատորը, երբ մշակվում է մեթոդի կանչը՝

  • Ստուգում է, արդյոք մեթոդի սահմանումը առկա է դասում և նրա super դասերում:
  • Օգտագործելով statական տիպավորում (կոմպիլացիայի ժամանակ), որոշում է, թե որ մեթոդն է պետք կանչել, եթե դա հնարավոր է:

Ենթադրյալ ժամանակ:

  • Օգտագործվում է դինամիկ ուղղման մեխանիզմ:
  • Օբյեկտը պահում է իր դասի ցուցիչը:
  • Դասը պահում է ուղղման աղյուսակ (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)
// Տիպի (վերջնական դաս, կառուցվածք, պրոտոկոլ, դինամիկ) վրա հիմնված՝
// օգտագործվում է statական կամ դինամիկ ուղղում (vtable կամ message dispatch)

Swift-ի ուղղման տեսակները՝

Տիպ Ուղղում Օպտիմիզացիա
struct, enum Ստատիկ Կոմպիլատորը գիտի ճշգրիտ մեթոդը
final class Ստատիկ Կոմպիլատորը գիտի ճշգրիտ մեթոդը
class (ոչ final) Վիրտուալ Միջնորդով (vtable)
protocol (ոչ @objc) Վիրտուալ Պրոտոկոլի վիտչես տախտակով
@objc (class, protocol) Դինամիկ Objective-C ռունթայմով (message dispatch)