LINUX.ORG.RU

Замену C++ делают неправильно

 


0

3

Уже не первый год человечество пытается избавиться от переусложненности C++ и массы его исторического наследия со старыми костылями. Появляются полумертвые D, Rust. Почему бы не пойти более простым путем и просто форкнуть нынешний стандарт C++ ? Выпилить оттуда весь груз обратной совместимости, странности и неочевидности, и естественно, добавить улучшательств. Преимущества подхода: а). Программистам в целом не придется переучиваться, библиотеки тоже портировать легче. б). Готовые уже компиляторы, из которых понадобится в большей степени выпилить всякую хрень (можно даже сделать флаг типа --no-legacy-compat). Так где же оно?



Последнее исправление: CatsCantFly (всего исправлений: 1)

Ответ на: комментарий от CatsCantFly

множественное наследование

не трожь!

голую арифметику указателей без compile-time проверок

это как?

zero-terminated strings

выкинули давно, теперь там std::string

C массивы

нужны, иначе как подноготную тех же векторов и пр. реализовывать?

с остальным согласен

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

нормальный кроссплатформенный менеджер зависимостей

Что это и с чем едят?

И нормальный кроссплатформенный билд-тул (более вменяемый, чем CMake).

Чем невменяем CMake?

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

struct, имеющие методы

Так, этого до проектирования языков не допускать.

давно пора для class оставить полноценные классы, а для struct — исключительно POD типы. понятие POD в С++ есть, а ключевого слова нет.

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

тем, что маке-файлы нужно ручками писать? криво напишешь/сгенерируешь — получишь непортируемый проект.

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

Что это и с чем едят?

Что-то вроде Maven-а для Java, cabal для Haskell, cargo для Rust, RubyGems для Ruby и т.д.

Чем невменяем CMake?

Идеями. Синтаксисом. Крайне убогой штатной документацией.

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

Вроде как умеет. Но с такими умениями лучше оставить его для кровавого Java Ынтырпрайза :)

eao197 ★★★★★
()

и естественно, добавить улучшательств.

Вот тут-то и начнутся проблемы. На плюсах пишут разные люди и мнение об «улучшениях» у них разные. Мне вот по душе «ограничения» раста, а кто-то видит в свободе (в любой момент) стрелять в ногу главную особенность языка. Тут находятся люди которые модули не приемлют, а ты на множественное наследование замахнулся.

Это не говоря о том, что с выкидыванием «груза совместимости» тоже не всё так просто.

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

нужны, иначе как подноготную тех же векторов и пр. реализовывать?

Это вообще уже не важно, что там внутри.

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

давно пора для class оставить полноценные классы, а для struct — исключительно POD типы. понятие POD в С++ есть, а ключевого слова нет.

вот кстати да, не мешала бы стандартизированная проверка классов/структур на POD в компайл-тайм.

А лучше разделить на структуры и классы и не мучаться больше (правда конструкторы у структур часто юзаю, удобно же, но это все еще POD).

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

Тоже верно, но почти каждый раз когда я натыкаюсь на грабли в с++ они связанны с совместимостью Си прямо или косвенно.

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

множественное наследование

Так есть же уже, причём давно.

голую арифметику указателей без compile-time проверок

Что это?

C массивы

Не трожь!

robus ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

современный язык должен компилироваться в натив, JVM/CLI, JavaScript, LLVM-байткод

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

Есть большие сомнения, что оно полезно будет. Всё-таки JVM/CLI - это не «просто платформы», это целая сложившаяся инфраструктура. И если на неё завязываешься, то перенос на другую платформу становится очень не тривиальным.

DarkEld3r ★★★★★
()

Насчет D

В моем варианте, портирование кода на этот новый C++ делается методом: взяли современный плюсовый проект, попробовали собрать, поправили ошибки компиляции и предупреждения - и все работает. D такого не обеспечивает, это другой язык.

CatsCantFly
() автор топика
Последнее исправление: CatsCantFly (всего исправлений: 1)

ШОК! СЕНСАЦИЯ! Программисты на C++ годами скрывали эту тайну от общественности!

Я сейчас тебе открою страшный секрет (только тсссс, никому не говори!): можно не использовать те фичи C++, которые тебе не нравятся! Да, всё именно так просто!

Deleted
()
Ответ на: комментарий от DarkEld3r

Это просто удобно, а главное - это не ломает никаких концепций.

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

Указатели вообще не нужны в языке уровня c++

Наркоман?

Это вообще уже не важно, что там внутри.

Как только понадобится свой контейнер - посмотрим.

не мешала бы стандартизированная проверка классов/структур на POD в компайл-тайм.

С разморозкой: std::is_pod

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

чем тебя cmake обидел?

Пользоваться неудобно.

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

Вон в objective-C/Swift тоже не парятся с ручным освобождением памяти

Это ты где такую ересь прочитал? Еще как парятся. Пляшут вокруг этого ARC, отыскивают «петли» в ссылках — ничуть не лучше, чем, скажем, в python.

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

Как только понадобится свой контейнер - посмотрим.

Ну значит сам будешь делать по другому. Есть std:aaray неважно что внутри у него. Все свои контейнеры можно делать вокруг него. Хватит мыслить тем смесью си и си++ уже.

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

С разморозкой: std::is_pod

Это немного не то что я имел в виду. Я имел в виду например

class A POD
{
};

И если pod условия нарушены - ошибка компиляции. std::is_pod - это рантайм.

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

Это важно, если мы хотим написать свою реализацию.

Еще раз, есть std::array. Он обладаем мимнимум функций аналогичных сишному массиву, но гораздо лучше ложиться в модель с++, ибо классс с вменяемым интерфейсом. Свою реализацию можно строить вокруг него. Я считаю это правильно.

Dudraug ★★★★★
()

И допилить годные фичи, которые сейчас не добавляют или добавляют уродлвио из-за обратной совместимости, тоже могу?

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

WAT?

http://en.cppreference.com/w/cpp/types/is_pod

Код компилится. А я хотел бы не задумываться раньше времени о условиях соответствия POD (ну или защитить себя от тех кто после меня кодит) и переложить это на компилятор, что бы он мне сказал, что я делаю что-то не так. Здесь же это немного другое.

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

Понятия не имею. Но сам факт того, что этим занимаются, не может не радовать. Тот же biicode был интересен, но он был гвоздями прибит к CMake и непросто было к biicode присобачить проект, который CMake не использовал. В conan-е этот просчет, вроде как, устранили.

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

Понятно, что constexpr, я возможно неверно выразился, я хочу что бы класс объявленный как pod не компилился если я нарушаю условия. Так же как не компилится наследование от final.

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

вот кстати да, не мешала бы стандартизированная проверка классов/структур на POD в компайл-тайм.

std::is_pod?

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

Код компилится. А я хотел бы не задумываться раньше времени о условиях соответствия POD (ну или защитить себя от тех кто после меня кодит) и переложить это на компилятор, что бы он мне сказал, что я делаю что-то не так. Здесь же это немного другое.

#include <type_traits>

struct A
{
};

static_assert( std::is_pod<A>::value, "DON'T TOUCH MY STRUCT, ASSHOLES!!!!!" );

int main()
{
};
anonymous
()
Ответ на: комментарий от Dudraug

Костыль=)

А зачем тогда вообще static_assert, если не для таких случаев?

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

И допилить годные фичи, которые сейчас не добавляют или добавляют уродлвио из-за обратной совместимости, тоже могу?

Например?

Deleted
()
Ответ на: Насчет D от CatsCantFly

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

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

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

Написание std::array

Ну так и упомянутый выше std::is_pod тоже реализуется на уровне компилятора, а не библиотеки.

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

Или пытаетесь сказать, что решение такой задачи в принципе не возможно?

this

Это невозможно в кроссплатформенном виде и в общем случае.

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