Middle
Kompilyator çağırılması lazım olan metodu necə tapır?
sobes.tech Süni İntellekt
AI-dan cavab
Tərcüməçi, metod çağırışını işləyərkən:
- Sinifdə və onun supersiniflarında metodun təyinatının olub-olmadığını yoxlayır.
- Statik tip təyin etmə (kompilyasiya zamanı) vasitəsilə, mümkün olarsa, hansı metodun çağırılmalı olduğunu müəyyən edir.
İcrada:
- Dinamik yönləndirmə mexanizmi istifadə olunur.
- Obiekt öz sinfinə işarəçi saxlayır.
- Sinif yönləndirmə cədvəli (method dispatch table), və ya vtable C++/Objective-C-də, və ya Swift-də method table saxlayır.
- Cədvəl metodların tətbiqlərinə işarəçilər ehtiva edir.
- Metod çağırıldıqda, icra mühiti obyektdən sinfinin yönləndirmə cədvəlində uyğun qeydi selector adından (Objective-C-də) və ya metod imzasından (Swift-də, virtual metodlar üçün) axtarır.
- Tapıldıqda, metod tətbiqinə işarəçi çağırılır.
Objective-C-də bu belə görünür:
// Objective-C-də metod çağırış nümunəsi
// [target messageName:parameter];
// Runtime 'messageName:'-i 'target'.class-dəki yönləndirmə cədvəlində axtarır
Swift-də:
// Swift-də metod çağırış nümunəsi
// instance.methodName(parameter)
// Tipə (final class, struct, protocol, dinamik) görə
// statik və ya dinamik yönləndirmə (vtable və ya message dispatch) istifadə olunur.
Swift-də yönləndirmə növləri:
| Növ | Yönləndirmə | Optimizasiya |
|---|---|---|
struct, enum |
Statik | Kompilyator dəqiq metodu bilir |
final class |
Statik | Kompilyator dəqiq metodu bilir |
class (final olmayan) |
Virtual | Cədvəl vasitəsilə (vtable) |
protocol ( @objc olmayan) |
Virtual | Protokol şahid cədvəli vasitəsilə |
@objc (class, protocol) |
Dinamik | Objective-C runtime vasitəsilə (message dispatch) |