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) |