Создание компилятора языка для .NET Framework - Динамический вызов методов

ОГЛАВЛЕНИЕ

Динамический вызов методов

Вызовы методов являются краеугольным камнем любого языка программирования – существует целый их спектр. Более современные языки, такие как Python, задерживают привязку метода и его вызов до самого последнего момента – это называется динамическим вызовом. Все популярные динамические языки, такие как Ruby, JavaScript, Lua и даже Visual Basic, следуют этому шаблону. Чтобы компилятор выдал код для выполнения вызова метода, компилятор должен считать имя метода символом, передавая его библиотеке выполнения, которая проведет операции привязки и вызова, в соответствии с семантикой языка.

Предположим, я отключу Option Strict в компиляторе Visual Basic 8.0. Вызовы методов начнут происходить с поздним (динамическим) связыванием, а среда выполнения Visual Basic будет выполнять привязку и вызов во время выполнения.

Вместо компилятора Visual Basic, выдающего инструкцию вызова IL, обращенного к методу Method1, он выдает инструкцию вызова к методу среды выполнения Visual Basic, именуемому CompilerServices.NewLateBinding.LateCall. Делая это, он передает объект (obj) и символическое имя метода (Method1), вместе с всеми аргументами метода. Метод Visual Basic LateCall затем ищет метод Method1на объекте используя Reflection («Отражение») и, если он найден, выполняет вызов метода на основе Reflection:

   Option Strict Off

Dim obj
obj.Method1()

IL_0001:  ldloc.0
IL_0003:  ldstr      "Method1"
...
IL_0012:  call       object CompilerServices.NewLateBinding::LateCall(object, ... , string, ...)