Sobes.tech
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) аркылуу