Разработка компиляторов

       

О последовательности генерации MSIL


Структура MSIL задает определенную последовательность генерации кода, в которой код генерируется в несколько проходов:

  • вначале создается объект AssemblyBuilder, который будет использоваться для создания сборки
  • затем при помощи метода DefineDynamicModule создаются объекты типа ModuleBuilder, которые будут использоваться для порождения входящих в сборку модулей (отметим, что в случае создания модуля, не входящего в сборку, первый шаг опускается)
  • далее необходимо создать TypeBuilders для классов всех уровней (в том числе, и для вложенных классов); при этом конкретный порядок создания классов может быть весьма нетривиальным из-за возможности ссылок классов друг на друга в иерархии наследования
  • затем создаются билдеры для методов и полей классов
  • и вот только в этот радостный момент можно генерировать собственно код методов

Такая последовательность шагов при генерации является практически единственно возможной, поскольку на каждом следующем этапе нам может понадобиться сослаться на сущности, созданные на предыдущем этапе. Например, для создания поля нам нужно иметь возможность сослаться на его тип, а для генерации кода - иметь возможность сослаться на используемые поля и методы.



Содержание раздела