Я подумывал о том, чтобы попытаться исследовать и создать очень маленький надуманный компилятор для подмножества языка. Я думаю, что в рефлексии это будет слишком сложной проблемой для меня на моем нынешнем уровне квалификации.
Однако, кое-что меня заинтриговало, как компилятор переводит абстрактную идею, такую как объект, в сборку / двоичный файл?
например:
class Dog
{
public:
Dog(string name);
~Dog();
string GetName();
};
dog *Dog = new Dog('rover');
Как это переводится в машинный код — это серьезно сбивает с толку.
За кулисами? Здесь нет больших сюрпризов. Давайте возьмем разумный, пока гипотетический компилятор:
Во-первых, есть глобальный Dog* dog
, Добавьте имя в таблицу глобальных объектов, размер 4, указатель типа (Dog).
Далее идет инициализация с неконстантным выражением. Напишите немного кода __dog__initializer
какие звонки ::operator new(sizeof(Dog))
, сохраняет результат в dog
а потом звонит __Ctor_Dog
, Там есть строковая константа "rover"
необходимо, так что добавьте это в таблицу глобальных строк.
Когда весь файл читается, все таблицы переводятся в части объектного файла, так что компоновщик может собрать их вместе. Это на самом деле не генерирует двоичный код, а просто объединяет существующие части.
Помните, что это только гипотетическая реализация, и детали определенно отличаются на практике.
Других решений пока нет …