Middle
Компилятор кайсы ыкмалды чакырып алууга болот деп табат?
sobes.tech AI
AIден жооп
Компилятор, метод чакырганда:
- Методтун аныктамасын класста жана анын ата-энесинде бар-жогун текшерет.
- Статикалык типтештирүүнүн жардамы менен (компиляция учурунда), кайсы метод чакырылышы керектигин аныктайт, эгер мүмкүн болсо.
Ишке ашырылуу учурунда:
- Динамикалык диспетчеризация механизми колдонулат.
- Объект өзүнүн классына көрсөткүчтү сактайт.
- Класс диспетчеризация таблицасын сактайт (method dispatch table), же C++/Objective-Cда vtable, же Swiftте method table.
- Таблица методтун ишке ашырылышына көрсөткүчтөрдү камтыйт.
- Метод чакырганда, ишке ашыруу чөйрөсү объекттин класстагы диспетчеризация таблицасынан селектор аты (Objective-Cда) же методтун сигнатурасы (Swiftте, виртуалдык методдор үчүн) боюнча тиешелүү жазууну издейт.
- Жазуу табылгандан кийин, методтун ишке ашырылышына көрсөткүч чакырылат.
Objective-Cте бул төмөнкүчө көрүнөт:
// Objective-Cте метод чакыруу мисалы
// [target messageName:parameter];
// Ишке ашыруу 'messageName:' дегенди 'target'.class диспетчеризация таблицасында издейт
Swiftте:
// Swiftте метод чакыруу мисалы
// instance.methodName(parameter)
// Типке жараша (final class, struct, protocol, dynamic)
// статикалык же динамикалык диспетчеризация колдонулат (vtable же message dispatch)
Swiftтеги диспетчеризация түрлөрү:
| Төрү | Диспетчеризация | Оптимизация |
|---|---|---|
struct, enum |
Статикалык | Компилятор так методту билет |
final class |
Статикалык | Компилятор так методту билет |
class (жана final эмес) |
Виртуалдык | Таблица аркылуу (vtable) |
protocol (башка @objc жок) |
Виртуалдык | Протоколдун көрүү таблицасы аркылуу (protocol witness table) |
@objc (class, protocol) |
Динамикалык | Objective-C ишке ашыруу (message dispatch) аркылуу |