Как компилятор переводит экземпляр объекта класса в двоичный машинный код?

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

Однако, кое-что меня заинтриговало, как компилятор переводит абстрактную идею, такую ​​как объект, в сборку / двоичный файл?

например:

class Dog
{
public:
Dog(string name);
~Dog();
string GetName();
};

dog *Dog = new Dog('rover');

Как это переводится в машинный код — это серьезно сбивает с толку.

2

Решение

За кулисами? Здесь нет больших сюрпризов. Давайте возьмем разумный, пока гипотетический компилятор:

Во-первых, есть глобальный Dog* dog, Добавьте имя в таблицу глобальных объектов, размер 4, указатель типа (Dog).
Далее идет инициализация с неконстантным выражением. Напишите немного кода __dog__initializer какие звонки ::operator new(sizeof(Dog)), сохраняет результат в dog а потом звонит __Ctor_Dog, Там есть строковая константа "rover" необходимо, так что добавьте это в таблицу глобальных строк.

Когда весь файл читается, все таблицы переводятся в части объектного файла, так что компоновщик может собрать их вместе. Это на самом деле не генерирует двоичный код, а просто объединяет существующие части.

Помните, что это только гипотетическая реализация, и детали определенно отличаются на практике.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector