LINUX.ORG.RU

Почему все же с++ такой сложный язык?

 ,


2

5

С++ – сложный язык. Хоть это для каждого по разному и тд, но он очевидно сложнее большинства (всех?) высокоуровневых языков программирования. С другой стороны он очень быстрый и дает тотальный контроль.

Теперь вопрос: должен ли язык быть априори настолько сложным для достижения мощи как в с++ или же так просто исторически сложилось (ака историческая несправедливость)?

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

Zhbert ★★★★★ ()

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

thunar ★★★★★ ()
Последнее исправление: thunar (всего исправлений: 2)

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

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

Теперь вопрос: должен ли язык быть априори настолько сложным для достижения мощи как в с++ или же так просто исторически сложилось (ака историческая несправедливость)?

Rust, который позиционируется как замена C и C++, внезапно, получился тоже достаточно сложным языком программирования с примерно таким же «mindfuck» синтаксисом.

EXL ★★★★★ ()

Я начинал знакомство с С++ с книги Джеффа Элджера. И после такого впечатляющего введения в предмет он мне не показался особо сложным. Замороченным и мощным — да.

А для современного С++ какие книги почитать, которые обобщают опыт применения языка и дают представление о его выразительных возможностях?

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

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

no-such-file ★★★★★ ()
Ответ на: комментарий от wandrien

Суть проблемы КМК в том, что без гомоиконности синтаксис постепенно превращается в фрактал говна. Гомоиконность позволяет сохранить «линейность» сложности путём создания dsl под конкретные нужны вместо многоэтажных шаблонов и т.п.

Т.е. zig и т.п. это всё обычный NIH и не более того.

no-such-file ★★★★★ ()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от AKonia

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

Ты забыл про шаблонную магию и всякие compile-time трюки. Подобное уже завезли в Java или C#?

EXL ★★★★★ ()
Ответ на: комментарий от ya-betmen

Прочитай предыдущий коммент. Лисп позволяет сохранить минимально необходимое количество закорючек на квадратный метр кода. Вместо усложнения синтаксиса усложняется вкладываемый в код смысл (появляется dsl).

no-such-file ★★★★★ ()
Последнее исправление: no-such-file (всего исправлений: 1)

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

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

Лол что? Покажешь как на лиспе будет выглядеть этот код?

Конкретно к этому коду никаких претензий нет. Но тут и не такой код обсуждается. А вот такой

// linear calculation of n-th Fibonacci number on templates
template <unsigned N>
struct Fib: protected Fib<N - 1>
{
protected:
  static const unsigned prev = Fib<N - 1>::value;
public:
  static const unsigned value = Fib<N - 1>::prev + prev;  
};
 
template <> struct Fib <0>
{
protected:
  static const unsigned prev = 0;
public:
  static const unsigned value = 0;
};
 
template <> struct Fib <1>
{
protected:
  static const unsigned prev = 0;
public:
  static const unsigned value = 1;
};

Написать как на лиспе посчитать Фибоначчи при компиляции?

no-such-file ★★★★★ ()

Потому что «больше фич богу фич».

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

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

Ну в джаве свои дженерики есть, на уровне возможности для написания типонезависимого кода они не сильно отличаются от шаблонов(конкретно шаблонная магия это отдельный разговор, которой да у них нет, но и в плюсах никто писать сложно не понуждает и тут встаёт вопрос личной ответственности, т.к. написать плохой код позволяет буквально любой ЯП и чем больше у него возможностей, тем больше возможностей написать в том числе плохо), в шарпе не уверен, но помню и в нём есть свои неприглядные затыки и ограничения.

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

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

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

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

Im_not_a_robot ★★★★★ ()

С++ – сложный язык

Нет, не сложный.

сложнее большинства (всех?) высокоуровневых языков программирования

Нет, не сложнее. От большинства высокоуровневых языков программирования он отличается только бОльшим грузом легаси.

С другой стороны он очень быстрый и дает тотальный контроль.

Нет, не быстрый и нет, не даёт.

Теперь вопрос: должен ли язык быть априори настолько сложным для достижения мощи как в с++ или же так просто исторически сложилось (ака историческая несправедливость)?

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

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

это нужно для чего-то кроме как сказать «зато мы можем сделать так»?

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

no-such-file ★★★★★ ()
Ответ на: комментарий от X512

Всегда умел, а что? Там GC обычно, вот это другой вопрос. Но речь про гомоиконность саму по себе, а не в контексте конкретных реализаций. Есть например такой интересный проект https://github.com/carp-lang/Carp. Как rust, только лисп. Сыро, но на уровне идеи отлично.

no-such-file ★★★★★ ()
Последнее исправление: no-such-file (всего исправлений: 1)

Наверное сложность заключается во вхождении. Без базовых знаний очень тяжело, невозможно. Но опять же зависит от мотивации, работоспособности, в общем от возраста (за 50 поздно начинать).

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

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

Никакой разницы с другими языками тут нет.

Основные проблемы у тебя начинаются когда ты либо забыл что твой старый модуль А что-то не высвобождает сам т.к. это должен делать дергающий его модуль Б, либо когда модуль А писал не ты, а его автор понадеялся на тебя.

В программировании нет понятий «забыл» или «понадеялся». Есть чёткие определения ответственности и семантики владения, поэтому всегда абсолютно точно известно кто, что и когда освобождает. Чтобы с этим поиметь проблем, нужно явно приложить силы и вместо программирования заниматься дрочевом. И опять же, C++ тут никакой специфики не несёт - вопросы владения глобальны и от языка не зависят никак. Даже в питоне который за тебя вроде бы делает чуть менее чем всё, если ты не понимаешь семантики владения, ты запросто передашь список (вместо copy или deepcopy) в функцию которая его портит и поломаешь всю программу которая работает с исходным списком.

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

Основные проблемы у тебя начинаются когда ты либо забыл что твой старый модуль А что-то не высвобождает сам т.к. это должен делать дергающий его модуль Б, либо когда модуль А писал не ты, а его автор понадеялся на тебя.

Если бы ты писал на крестах с полноценным RAII, а не на сишке с классами, такого бы не происходило.

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

Ну да. Но проблема по-моему в том, что памятью ты в плюсах обязан ручками управлять. Если питон или джава за тебя сам это сделает, то тут то пахаешь за компилер / интерпретатор.

T3RM1N4L ()