#новичкам
Cfront был первым компилятором С++. И это оказало большое влияние на то, какие подходы к компиляции C++ используют другие компиляторы. В следующих нескольких постах мы обсудим наследие, которое после себя оставил Cfront.
Главное, о чем надо помнить в этой серии - Cfront компилировал С++ код в С. То есть все концепции языка С++, которыми Cfront оперировал, можно было представить в С коде. Некоторые такие представления перетекли в стандарт, некоторые остались на уровне реализации.
Сегодня поговорим про такую привычную и базовую вещь, как this или неявный указатель на объект класса в методах.
Мы уже написали несколько постов о том, как можно вызывать методы классов с помощью указателя на функцию и объекта класса(или указателя на него). Тык, тык и тык. Но здесь повторим более наглядно чтоли.
Вот у Cfront на входе есть С++ код:
class Point {
int x, y;
public:
Point(int x, int y) : x(x), y(y) {}
int get_x() const { return x; }
int get_y() const { return y; }
void move(int dx, int dy) { x += dx; y += dy; }
};У каждого класса есть конструктор, деструктор и набор методов. Все это компилировалось в обычные функции, которые первым аргументом принимали неявный указатель this на экземпляр сишной структуры:
struct Point {
int x;
int y;
};
void Point_ctor(struct Point* this, int x, int y) {
this->x = x;
this->y = y;
}
int Point_get_x(const struct Point* this) {
return this->x;
}
int Point_get_y(const struct Point* this) {
return this->y;
}
void Point_move(struct Point* this, int dx, int dy) {
this->x += dx;
this->y += dy;
}
void Point_dtor(struct Point* this) {}Константность метода регулировалась константностью указателя this.
Если есть класс, значит должно быть использование:
void foo() {
Point p = Point(1, 2);
p.move(2, 3);
printf("%d/n", p.get_x());
}Этот код превращался в нечто подобное:
void foo() {
struct Point p;
Point_ctor(&p, 1, 2);
Point_move(&p, 2, 3);
printf("%d/n", Point_get_x(&p));
Point_dtor(&p);
}Заметьте, что в конце любого скоупа, в котором был создан объект компилятором вставлялся вызов деструктора, тем самым обеспечивая идиому RAII.
Have a legacy. Stay cool.
#cppcore #goodoldc #compiler