LINUX.ORG.RU

GCC переходит на С++ компиляцию самого себя с целью улучшения качества кода

 ,


3

4

Для начала изменен только bootstrap код. Цель — улучшение качества кода (поскольку С++ жестче работает с типами). Когда там появятся классы и темплейты?.. Официально заявленные причины использовать С++:

  • C++ — стандартизованный, популярный язык.
  • C++ — практически надмножество C90, используемого внутри GCC.
  • Совместимый с С C++ код так же эффективен, как просто код C.
  • C++ поддерживает более чистый код во многих важных ситуациях.
  • C++ позволяет легче создавать и поддерживать четкие интерфейсы.
  • C++ никогда не требует более кривого кода.
  • C++ не панацея, но улучшение.

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Последнее исправление: Silent (всего исправлений: 6)
Ответ на: комментарий от LamerOk

вот код

struct my_data *p = data;

Ну это частный пример.
Да, если переменная сразу инициализируется,
то приведение — считай дублирование (хоть и совсем нестрашное).
А если так:

void my_callback(void *data)
{
struct my_data *p = NULL;
...
p = (struct my_data *) data;
...
}

Уже есть вероятность, что приведение из void* поможет ошибок избежать.

ЗЫ. Ну а в GLib/Gtk вообще святое дело не игнорировать такие ворнинги и все приводить макросами вроде GtkWidget *w = GTK_WIDGET(data). Тут вам вообще all inclusive в зависимости от опций сборки: либо динамические проверки типов например при отладке (макросы приведения = функции проверки типов), либо нулевые накладные расходы при релизе (макросы приведения = простые сишные приведения типов).

Tayler ★★
()
Ответ на: комментарий от AptGet

А какие еще есть варианты в С, кроме void*?


enum type { P1, P2 };

union ps {
  type *p1;
  type *p2;
}

struct s {
  union ps p;
  enum type t;
}

anonymous
()

Это было ещё со времён 4.7dev.

mr_doug
()
Ответ на: комментарий от anonymous

можно было использовать Vala. Великолепный язык, хоть...

...тормознутый, плохо переносимый и недопиленный

//и что там такого великолепного в языке есть?

shty ★★★★★
()
Ответ на: комментарий от shty

он бабавангу не обязан включать

Именно. Более того, он _обязан_ её выключать, когда ему русским языком говорят «void *». Объясни, с херали он полсе этого требует приведения при присваивании к и из void* указателя любого другого типа? Ведь это присваивание - заведомо _корректная_ операция.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Если я вижу только прототип, я долго буду сидеть и думать, какой же именно тип там ожидается.

anonymous
()
Ответ на: комментарий от LamerOk

Ты почему-то ставишь равенство между «непонятно» и «неявно».

KblCb ★★★★★
()
Ответ на: комментарий от shty

Так ты все 3 достоинства и перечислил.

Deleted
()
Ответ на: комментарий от Tayler
p = (struct my_data *) data;

Уже есть вероятность, что приведение из void* поможет ошибок избежать.

нет, в данном случае никакой особой разницы нет, только что видно куда кастуется

shty ★★★★★
()
Ответ на: комментарий от Tayler

Ну это частный пример.

Это самый типовой пример использования void*. Он для такого применения был создан.

А если так: ... Уже есть вероятность, что приведение из void* поможет ошибок избежать.

Это каким же образом?

LamerOk ★★★★★
()
Ответ на: комментарий от anonymous

Если девелоперам гцц хотелось красивого, совремнного, объектно ориентированного языка со строгой типизацией, можно было использовать Vala

Вещества....

Боюсь, что лет через 5 мы будем вспоминать гцц как страшный сон

GCC прожил 25 лет и проживет еще долго.

tailgunner ★★★★★
()
Ответ на: комментарий от shty

p = (struct my_data *) data;
Уже есть вероятность, что приведение из void* поможет ошибок избежать.

нет, в данном случае никакой особой разницы нет, только что видно куда кастуется

Поможет, если по ошибке выше поменяют тип p.

Tayler ★★
()
Ответ на: комментарий от LamerOk

он _обязан_ её выключать, когда ему русским языком говорят «void *».

ну вот он адъ и израиль в одном флаконе, нафига вообще типы, если что угодно к чему угодно прикастовать можно?

Ведь это присваивание - заведомо _корректная_ операция.

присваивание некорректно только когда в константу или в rvalue, но этого багов меньше не становится

shty ★★★★★
()
Ответ на: комментарий от Tayler

Поможет, если по ошибке выше поменяют тип p.

ну если так - согласен, но это никак не поможет если p будет некорректным

shty ★★★★★
()
Последнее исправление: shty (всего исправлений: 2)
Ответ на: комментарий от anonymous

Если я вижу только прототип, я долго буду сидеть и думать, какой же именно тип там ожидается.

Если совсем-совсем не знать С/С++, можно еще дольше сидеть и думать, что же значат эти закорючки. ;)

LamerOk ★★★★★
()
Ответ на: комментарий от shty

нафига вообще типы, если что угодно к чему угодно прикастовать можно?

Секундочку. А кто говорит о кастинге «чего угодно к чему угодно»? Речь идёт о том, что у нас есть тип, представляющий собой абстракцию любого адреса в памяти. Вопрос заключается в том, почему при использовании этого типа программист должен дублировать информацию о типе, который или к которому присваивается обобщённый указатель?

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 1)
Ответ на: комментарий от encyrtid

Это только если они шаблоны заюзают.

Скорее всего теперь это рано или поздно случится.

Napilnik ★★★★★
()
Ответ на: комментарий от x4DA

Че не понятного? Как уже говорилось гцц хотят переписать на С++.

vova7890 ★★★
()

походу это начало конца

V_P
()
Ответ на: комментарий от shty

вот потому что «нормальный» Си по факту считается языком с нестрогой типизацией

Да, и? Я не понял сути комментария. Писать на С / использовать void* больше нельзя, тк это говнокод?

AptGet ★★★
()

C++ позволяет легче создавать и поддерживать четкие интерфейсы.

Риальне, поцаны?

Deleted
()

C++ никогда не требует более кривого кода.

__ptr *list_entry() throw()
{
return reinterpret_cast<__ptr*>(reinterpret_cast<char*>(this)
    - reinterpret_cast<unsigned>(&static_cast<__ptr*>(0)->lh_));
}

А этому

struct s var = {
  .first = 1,
  .second = 2,
  .third = 3
};
на C++ нет даже кривого аналога.

И ещё вечный throw() на функциях...

Мелочи, а неприятно.

unsigned ★★★★
()
Ответ на: комментарий от unsigned

И ещё вечный throw() на функциях...

Есть милые проекты, которые не используют исключения вообще и потому счастливы.

Pavval ★★★★★
()
Ответ на: комментарий от anonymous

Если девелоперам гцц хотелось красивого, совремнного, объектно ориентированного языка со строгой типизацией, можно было использовать Vala.

Вот подтянулись мудаки, которые предлагают переписывать GCC вместо смены компилятора с небольшой корректировкой кода.

Pavval ★★★★★
()

C++ позволяет легче создавать и поддерживать четкие интерфейсы.

гопники в восторге

Lee_Noox ★★★
()

Блин, сделали бы уже какой-то С+, который бы являл собой С со строгой типизацией и, мож, с плюшками типа auto и strongly-typed enums.

Pavval ★★★★★
()

Отличная новость (хотя уже давно не новость, они поддержвали бутстрап как на Си так и на С++ уже версии две, только по-умолчанию был Си), по-моему мнению, несмотря на убогость местами C++ как языка, при наличии строгих правил и дисциплины, для таких математически сложных вещей использование C++ оправдано. В том числе и для рефакторинга кода.

XVilka ★★★★★
()
Ответ на: комментарий от LamerOk

По своему опыту хочу заметить, что в проектах на C++ кастование в/из (void*) встречается ооочень редко. И данный пример выглядит притянутым за уши.

И, в конце концов, вместо вот таких небезопасных коллбэков можно использовать типобезопасные сигналы, реализаций которых довольно много, и оверхед либо отсутствует, либо настолько мал, что им можно пренебречь, и отказаться от void*, используя его в единичных местах (и то, если на это есть веские причины).

теперь надо писать:

struct foo *p = (struct foo*) arg;

Тоже херня. Ты постоянно делаешь упор на то, что пишется всё разными программистами. Так вот, при разработке либы или чего бы там ни было, я, как программист, должен считать пользователей мудаками, и и проверять, а действительно ли мне дали указатель на struct foo*? И функция должна завершиться с ошибкой, а не вызвать segmentation fault. Проверками можно пренебречь только в действительно узких местах, где производительность выше всего.

Chaser_Andrey ★★★★★
()

Это ахтунг, друзья мои.

frost_ii ★★★★★
()
Ответ на: комментарий от Pavval

Си постепенно развивается, медленно, имхо, слишком, еще бы ввели слово pure для обозначения «чистых» функций, было бы классно.

XVilka ★★★★★
()

Более строгая типизация - это всегда хорошо.

qrck ★★
()

Главное в топике не указано. Они ограничатся лишь c-like подмножеством c++ или упорятся по полной местным ООП, шаблонами, перегрузкой функций, операторов, ссылками и прочими изысками?

PolarFox ★★★★★
()

Интересно как теперь надо будет делать этот самый bootstrap. Раньше для сборки cross-toolchain сначала gcc собирался только с поддержкой языка C, и уже потом, после сборки libc оно могло собрать само себя с поддержкой C++.

m0rph ★★★★★
()
Ответ на: комментарий от Pavval

Сферическая функция в вакууме, эталон в палате мер и весов :}

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от Pavval

с плюшками типа auto и strongly-typed enums.

Ты как раз вовремя.

O02eg ★★★★★
()

чёткие интерфейсы

Пацаны-то одобряют?

CYB3R ★★★★★
()
Ответ на: комментарий от Pavval

Сори, что за чистые функции?

Функциональное задротство. Вроде бы как функции, результат которых зависит только от поданных аргументов.

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

Возвращение массива в Си полностью противоположно чистой функции.

ados ★★★★★
()
Ответ на: комментарий от Chaser_Andrey

Можно было бы согласиться, если бы сходу не напрашивался более жизненный пример

const uint8_t buf[SIZE]; // strict one byte per element
cerr << string(static_cast<const char *>(static_cast<const void *>(buf));
unsigned_char_func(static_cast<const unsigned char*>(static_cast<const void *>(buf)));
u42
()
Ответ на: комментарий от tailgunner

код стал хуже

из-за явного каста код стал хуже? Куда катится мир... Этот спор даже не стоит времени на него потраченного.

PS А что с ворнингом делать?

true_admin ★★★★★
()
Ответ на: комментарий от frost_ii

ну гдето прирост гдето нет.. в любом случае пока там была куча грязных хаков для сборки, такчто пока ядро не освободится от гццизмов или пока их поддержку не запилят в кланг остаётся ждать.

Thero ★★★★★
()
Ответ на: комментарий от anonymous

Риву! Риву, в Антанариву пишуть хаскил хаскиры на Риву! А нолиспи пишеццо осамл Вижу, ты об этом знаешь сам.

anonymous
()
Ответ на: комментарий от m0rph

теперь будет собираться только с поддержкой си++ а уже потом со всем остальным?

Thero ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.