LINUX.ORG.RU

Комитет не может остановиться..

 , ,


1

4

Привет, ЛОР!

Я просто оставлю это здесь: https://isocpp.org/files/papers/P2996R4.html

Для Ъ: в C++26 будет добавлена поддержка статической рефлексии. Теперь C++ будет компилироваться ЕЩЁ ДОЛЬШЕ.

Ну, к c++26, может быть, модули заработают, скомпенсируют просадку в скорости компиляции.

В целом, статическая рефлексия - не самое ненужное нововведение в плюсах.

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

Много народу использует все возможности C++17?

Все возможности? Нет. Многие возможности? Да.

Хотя одна из проблем C++ в том, что после выхода стандарта надо ещё лет 5 ждать, пока фичи допилят в компиляторах. С модулями из C++20 всё до сих пор грустно, например.

hateyoufeel ★★★★★
() автор топика

Комитет не может остановиться..

Форумчане как дети.

Давно нужно понять, что комитет хочет сделать такой плохой ЯП, который
займёт первое место в книге Гиннеса - «Самый дрянной ЯП».

Мамия, у меня и интроспекция и рефлексия ..., в run-time.

Почему у меня это всё есть, а у ста xxx (ну вы поняли) этого нет?

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

Одна из проблем C++ в том, что он с каждым стандартом становится всё более нечитаемым говном.

А в чём изначальная причина появления новых версий стандарта каждые три года? Представим себе, что каждые три года выходит новый стандарт русского языка. Может быть новые версии нужны исключительно в качестве оправдания для существования и финансирования комитета и больше ни для чего другого?

zg
()

Теперь C++ будет компилироваться ЕЩЁ ДОЛЬШЕ.

как раз наоборот, статическая рефлексия нужна, чтобы C++ компилировался быстрее.

Что например сделали говнокодеры, запилившие раст? Они запилили там процедурные макросы, которые на каждый чих заново парсят код, строят свое недо-AST, как-то его преобразовывают, и скармливают то что получилось компилятору - который в свою очередь тоже вынужден заново строить свое AST и т.д. Из-за этого получаются дикие просадки в производительности даже инкрементальной компиляции, которые растоманы оправдывают какими-то мифическими анализами корректности, которых там нет.

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

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

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

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

Что такое метапрограммирование в C++?
Это а-ля PHP шаблонизатор PHP (утрирую конечно).

Гм, а мне C++ нравится.
Без стандартов добавил в него всё что мне нужно.

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

ну я не читал, что там они приняли, но если сделали внешнюю кодогенерацию вроде шаблонизатора ПХП и процедурных макросов раста - то я утрусь, скажу что-нибудь про северного пушного зверя, и уйду кодить на zig

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

А в чём изначальная причина появления новых версий стандарта каждые три года?

Причина в самой природе C++. Один крендель по приколу взял недоязычок без внятного стандарта и прикрутил к нему классы. И по традиции новый язычок долго обходился без стандартов. А потом оказалось, что вменяемый стандарт сделать невозможно – развалится куча говнокода, которая держалась на UB и умолчаниях.

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

Можно поступить проще: дать компилятору флаг -ansi и вернуться к нормальному С++ 1992 года. Suckless как говорится, бороться с мелкими проблемами старых плюсов много проще, чем бороться с проблемами плюсов от ISO.

zx_gamer ★★★
()

Хорошая новость. Кучу костылей можно будет выкинуть. Её нужно было в c++20 добавлять. 26 стандарт станет дефолтом после 30 года. Я уже на пенсии буду.

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

дать компилятору флаг -ansi и вернуться к нормальному С++ 1992 года

-ansi
    In C mode, support all ISO C89 programs. In C++ mode, remove GNU extensions that conflict with ISO C++. 

С++ 1992 года

Нет, G++ по дефолту, если не задана опция -std=, компилирует по стандарту 1998 года.

от ISO

Да, ISO/IEC 14882:1998

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

и вернуться к нормальному С++ 1992 года

А как же новые смарт поинтеры, появившиеся лишь в C++11 и доделанные в C++14? Возвращаться на допотопный std::auto_ptr или на прямые вызовы new и delete?

zg
()
Ответ на: комментарий от peregrine

К вопросу, почему я не считаю рефлексию особо важной и полезной - мало того что с её помощью лезут туда куда не особо надо лезть, нарушая инкапсуляцию. Так ещё и производительность её очень не очень. В 2000 году она в 1000 раз медленнее была чем без неё, уже в 2009 всего в 100 раз, а сейчас как-то так. Понятно что тут не совсем полноценную рефлексию вносят, так что с производительностью должно быть лучше, но боюсь что софт всё равно более лагучим станет.

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

А в чем проблема реализовать все что хочется? Реализации «новых смартпоинтеров» появились лет за 10-15 до ISO C++11. И эти классы (по крайней мере std::unique_ptr < T[] > и std::unique_ptr < T > ) очень простые. Более «навороченный» std::shared_ptr (и std::weak_ptr) потребуют для эффективной реализации написать хэш-таблицу, но это тоже не сложно и почти наверняка пригодится где-нибудь еще в проекте.

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

RTTI не нужен в нормальном коде. Он нужен только для костылей. Другой вопрос, что фактически он будет в любой программе, которая использует исключения, потому что в C++ исключения по типам.

Про covariant return types в C++ я даже не слышал раньше. Оно точно никогда не используется.

mutable, bool были в ANSI C++.

Что вы подразумеваете под «Реализация в условиях» (declarations in conditions)?

Шаблоны уже тоже были.

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

А в чем проблема реализовать все что хочется?

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

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

Про covariant return types в C++ я даже не слышал раньше. Оно точно никогда не используется.

Классика ЛОРа: я ничего не слышал про ковариантные и контравариантные типы, поэтому это не нужно.

mutable, bool были в ANSI C++.

В книжке Страуструпа нет ключевых слов mutable и bool. До C++98 использовался сишный BOOL.

Что вы подразумеваете под «Реализация в условиях» (declarations in conditions)?

Это, например, объявление переменных внутри if: if (bool isVisible = testVisibility(camera, entity)). У Страуструпа прямо сказано, что так нельзя.

Шаблоны уже тоже были.

Просто «шаблоны» да. Но именно принудительного инстанцирования и членов-шаблонов у Страуструпа не было.

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

Мамия, у меня и интроспекция и рефлексия …, в run-time.

Почему у меня это всё есть, а у ста xxx (ну вы поняли) этого нет?

ну рефлексия в С++ практический пример был ещё у Константина Книжника в GOODS ООСУБД.

это как раз примерно 1998, на С++98.

последние две ссылки в PostScript.gz – текст диссертации К. Книжника с обзорами различных ООСУБД и примерами того, как (и зачем) он рефлексию в С++ реализовал.

вот понадобился ему метаобъектный протокол, MOP из лиспа.

и – взял, и реализовал его в С++. а потом на МОП сделал слои для логирования, поддержки транзакций, и т.п.

для MОП он реализовал рефлексию на С++.

в тексте диссера и в исходниках – битхаки, как именно реализовал.

чем-то напоминает макросы из MFC про карту сообщений и колбеки.

такие же костыли выходят на чистом C++98.

вот любопытно, на новомодном стандарте С++26 всё это как будет выглядеть?

а так – с практической точки зрения. в Dlang уже рефлексия и CTFE по type traits нормально, человекочитаемо выглядит.

то есть, GOODS на D или вот например C++26 скорее всего без таких вот костылей с битхаками получился бы.

в общем, см. исходники GOODS.

POST– наверное даже ещё проще.

вот там пример с рефлексией уже видно:

struct branch { 
    object* obj;
    int key;

    CLASSINFO(branch, REF(obj));
};

class foo : public object { 
  protected:
    foo*    next;
    foo*    prev;
    object* arr[10];
    branch  branches[8];
    int     x;
    int     y;
    object* childs[1];
  public:
    CLASSINFO(foo, REF(next) REF(prev) REFS(arr) VREFS(linked));
    foo(int x, int y);
};


REGISTER(1, foo);

main() { 
    storage my_storage("foo.odb");
    if (my_storage.open()) { 
        my_root_class* root = (my_root_class*)my_storage.get_root_object();
	if (root == NULL) { 
	    root = new_in(my_storage, my_root)("some parameters for root");
	}
	...
        int n_childs = ...;
	size_t varying_size = (n_childs-1)*sizeof(object*);
	// We should subtract 1 from n_childs, because one element is already
	// present in fixed part of class.
        foo* fp = new (foo:self_class, my_storage, varying_size) foo(x, y);
	...
	my_storage.close();
    }	
}

CLASSINFO, REF, REFS, VREFS, REGISTER макросы для рефлексии.

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

Да, я уже разобрался.

В 2015 году для GCC 6.1+ сделали gnu++14 по дефолту: https://github.com/gcc-mirror/gcc/commit/e7fa68d55551081342ef3b7eaf1a02639cb57053

В 2020 году для GCC 11.1+ сделали gnu++17 по дефолту: https://github.com/gcc-mirror/gcc/commit/0801f419440c14f6772b28f763ad7d40f7f7a580

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

До C++98 использовался сишный BOOL.

В Си никакого bool не было никогда. А BOOL это макрос (или typedef) Visual Studio.

Как же без bool работал operator== тогда?

Это, например, объявление переменных внутри if

Ну да. Переменную надо до if объявить. Так и в C++98 тоже надо. ЕМНИП просто так взять и проверить, содержится ли какой-то элемент в контейнере STL и если содержится, то получить итератор на него, нельзя.

Просто «шаблоны» да. Но именно принудительного инстанцирования и членов-шаблонов у Страуструпа не было.

Надо смотреть, но вроде все это было.

zx_gamer ★★★
()