Сложность изучения C++ [закрыт]
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах.
Закрыт 3 года назад .
Всем доброго времени суток. Вопрос к мэтрам:
Почему C++ считается более сложным в изучении, чем другие ЯП? Чем он будет сложнее в освоении для новичка, чем тот-же C# или Java?
C++ дает программисту множество возможностей, а чем больше возможностей, тем сложнее. Некоторые вещи (например возможноть присваивания внутри условия if) очень часто являются ошибками или опечатками (хоть и не всегда), но c++ об этом не сообщает и можно долго провозиться, пытаясь обнаружить такую ошибку.
Некоторые вещи могут показаться нелогичными новичку. Например, 3 / 2 будет равно 1, а не 1.5 (если предварительно не «сказать», что требуется нецелый результат). А 2000000000 + 2000000000 = -294967296.
Также в C++ достаточно сложно начать разрабатывать такие вещи, как графика, взаимодействие с чем-либо вне программы и др. Т.к. большинство этих задач не решается стандартными средствами языка.
Почему все же с++ такой сложный язык?
С++ – сложный язык. Хоть это для каждого по разному и тд, но он очевидно сложнее большинства (всех?) высокоуровневых языков программирования. С другой стороны он очень быстрый и дает тотальный контроль.
Теперь вопрос: должен ли язык быть априори настолько сложным для достижения мощи как в с++ или же так просто исторически сложилось (ака историческая несправедливость)?
хорошая новость: C++ сложный только если программист тупой

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

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

Теперь вопрос: должен ли язык быть априори настолько сложным для достижения мощи как в с++ или же так просто исторически сложилось (ака историческая несправедливость)?
Rust, который позиционируется как замена C и C++, внезапно, получился тоже достаточно сложным языком программирования с примерно таким же «mindfuck» синтаксисом.

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

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

C++ не сложный, C++ большой

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

Так скобки тоже закорючки

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

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

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


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

Первый раз слышу. Посмотрю, что за зверь.

Менять много разных закорючек на много одинаковых, такое себе.

Лол что? Покажешь как на лиспе будет выглядеть этот код?
Конкретно к этому коду никаких претензий нет. Но тут и не такой код обсуждается. А вот такой
Написать как на лиспе посчитать Фибоначчи при компиляции?

Полистал с телефона и не понял. Это реальный проект или прикол?
Глупость какая. В лиспе полно бесполезных скобок, которые усложняют читабельность. Нужно брать Forth.

Шаблоны как бы не для того.

Это реальный проект или прикол?
Реальный прикол. Просто для демонстрации о чём идёт разговор.

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

хорошая новость: C++ сложный только если программист тупой
И сразу плохая новость: 99% программистов тупые.
А вот по честному, это нужно для чего-то кроме как сказать «зато мы можем сделать так»? Если что, я сам плюсовик и к плюсам отношусь с уважением.
Ну в джаве свои дженерики есть, на уровне возможности для написания типонезависимого кода они не сильно отличаются от шаблонов(конкретно шаблонная магия это отдельный разговор, которой да у них нет, но и в плюсах никто писать сложно не понуждает и тут встаёт вопрос личной ответственности, т.к. написать плохой код позволяет буквально любой ЯП и чем больше у него возможностей, тем больше возможностей написать в том числе плохо), в шарпе не уверен, но помню и в нём есть свои неприглядные затыки и ограничения.
Единственное, что в джаве и шарпе хорошо по сравнению с плюсами, так это мощная основная библиотека, в остальном языки почти одинаковые.

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

Потому что развивался эволюционно по мере надобности а не в результате продуманного проектирования и в результате вынуждет блюсти обратную совместимость в том числе и с неудачными паттернами из 80х годов.
Ну вот раст или го, вроде бы, появились в результате продуманного проектирования, причем не быдлокодерами, а очень опытными людьми, но все равно добавляют фичи какие-то.
сложнее большинства (всех?) высокоуровневых языков программирования
Нет, не сложнее. От большинства высокоуровневых языков программирования он отличается только бОльшим грузом легаси.
С другой стороны он очень быстрый и дает тотальный контроль.
Нет, не быстрый и нет, не даёт.
Теперь вопрос: должен ли язык быть априори настолько сложным для достижения мощи как в с++ или же так просто исторически сложилось (ака историческая несправедливость)?
С поправкой на то что все твои представления о качестваях языка неверны, то каков язык — исторически сложилось, и это не несправедливость, а естественный результат развития языка при сохранении обратной совместимости. Любой живой язык сравнимого возраста будет иметь такой же багаж легаси.

Он уже научился компилироваться в машинный код без JIT?

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

Печально. Но что если каждый из нас тупой на 99%? Это еще печальнее.

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

Полная чушь. Без малого 10 лет ни один вменяемый человек так не пишет.

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

Написать как на лиспе посчитать Фибоначчи при компиляции?
Развеиваем мифы о С++
За 38 лет существования C++ о нём появилось много мифов. В этой статье вместе с курсом Яндекс.Практикума «Разработчик С++» мы разберём некоторые из этих мифов, чтобы понять, почему так и есть ли смысл им верить.
Миф №1: С++ — низкоуровневый язык
Это правда только наполовину, потому что C++ — очень гибкий язык. Он совмещает в себе качества как низкоуровневых, так и высокоуровневых языков.
Уровень языка говорит о его схожести с естественными языками. Низкоуровневые языки больше похожи на машинные — в них даже самые простые операции достаточно сложны. Высокоуровневые языки больше похожи на человеческие — в них все инструкции могут быть понятны даже человеку без подготовки.
Например, на C++ вы можете написать процедурный низкоуровневый код, обращаясь к памяти напрямую. Или можете использовать высокоуровневые концепции вроде ООП и функционального программирования.
Императивное программирование:
Функциональное (декларативное) программирование:
Оба фрагмента кода решают одни и те же задачи — складывают и умножают элементы массива. При этом при императивном подходе разработчик пишет чёткие инструкции: какие шаги компьютеру нужно выполнить, чтобы решить задачу. При декларативном подходе можно просто описать результат, который вы хотите получить.
То есть C++ позволяет работать сразу в нескольких парадигмах программирования, что совсем не вяжется с понятием «низкоуровневый язык».
Парадигма программирования — это набор идей и понятий, которые определяют стиль написания программ. Почитайте, что об этом говорят эксперты.
Миф №2: C++ подходит только для написания низкоуровневых программ
Этот миф вытекает из предыдущего. C++ даёт разработчикам столько возможностей, что на нём можно писать что угодно: от драйверов до интерфейсов сайтов с помощью WebAssembly. Также он не только универсальный, но и производительный.
Вот только пишутся программы на C++ дольше, чем на более специализированных языках. Разработчик на JavaScript может потратить больше времени на выбор фреймворка, чем на создание самого сайта. Библиотеки для Python позволяют написать нейросеть всего на 11 строках кода. В C++, конечно, тоже есть такие инструменты, но заточены они на производительность, а не универсальность и скорость разработки.
Библиотека — набор инструментов и готовых функций для языка программирования.
Фреймворк — готовый каркас приложения.
Поэтому C++ чаще используется там, где важна эффективность. Например, на нём хотя бы частично написаны все современные операционные системы, фото- и видеоредакторы, программы для работы с 3D-графикой, игры, библиотеки для машинного обучения.
Сам же язык можно использовать для любых задач. Просто во многих сферах важнее выпускать приложения чаще, пусть и со сниженной производительностью.
Миф №3: Язык не развивается
В последние годы у C++ появились новые конкуренты — Rust и GoLang. Из-за этого кажется, что C++ сдал позиции и вообще это какой-то древний язык, от которого пора отказаться. Однако он ещё очень долго будет популярен по нескольким причинам:
- На нём уже очень много всего написано, в том числе то, что вы используете каждый день: браузеры Chrome и Firefox, Windows, Linux, OS X, Android, iOS. Всё это нужно поддерживать и развивать. Следовательно, нужно больше C++-разработчиков, а сам язык должен развиваться.
- Язык хорошо зарекомендовал себя, а вот его конкуренты пока слишком молоды. Они понравились многим разработчикам, но пройдут годы, прежде чем они смогут сравняться с C++ по количеству новых и существующих проектов.
Что же касается развития, то разработчики постоянно обновляют популярные библиотеки и пишут новые. Так Qt (один из самых популярных инструментов для работы с графикой) получил новую версию в марте 2021 года, а относительно молодой TensorFlow (библиотека машинного обучения, первый релиз выпущен в 2015-м) — в декабре 2020-го. Стандарт языка тоже обновляется: C++20 был принят в сентябре 2020 года. Следующий планируют принять в 2023 году.
Миф №4: C++ — очень сложный язык
Частично это правда, потому что в C++ нет многих удобств, которые есть в более высокоуровневых языках. Например, разработчику на плюсах приходится самому работать с памятью, беспокоиться о том, чтобы не было утечек, собирать мусор и так далее.
Сборка мусора — освобождение памяти, которая больше не понадобится для работы программы. Это удобнее для программиста, но требует больше ресурсов для работы приложения.
С другой стороны, в C++ есть много высокоуровневых инструментов, конструкций и библиотек, что позволяет значительно ускорить разработку. Например, можно достаточно быстро создать игру с помощью Unreal Engine, а не мучиться с написанием собственного движка. Работа с базами данных упрощается SOCI, а математические операции — с помощью целого ряда библиотек и того же функционального программирования.
Сложность изучения C++ главным образом заключается в более высоком пороге входа. Перед тем как вы сможете использовать даже самые продвинутые и высокоуровневые библиотеки, придётся многому научиться.
Также язык требует от разработчика более продвинутого знания об устройстве компьютера, чем другие языки вроде JavaScript, на котором можно просто начать писать.
Тема сложности C++ достаточно часто обсуждается, и однозначно ответить, сложный ли он, нельзя. Например, в статье «Почему никому не нравится язык программирования C++?» собраны мнения разных разработчиков с сайта Quora об этом языке. Кто-то говорит, что C++ невероятно сложный, а кто-то — что совсем несложный, но очень обширный и не терпящий ошибок.
В обсуждении на StackOverflow большинство считает, что язык настолько сложный, что изучив его, можно без труда выучить любой другой язык. Один из участников дискуссии даже смог получить сертификат по Java, не зная о нём вообще ничего.
Миф №5: C++ — (не) лучший язык для новичков
Тут мнения тоже достаточно заметно расходятся.
Кто-то говорит, что лучше начать с простого языка, чтобы втянуться в процесс и сразу что-то создавать. Глубокие знания можно будет получить позже, да и вообще они никогда не понадобятся большинству разработчиков. Зачем понимать принципы работы компьютера, если ты сайтики создаёшь?
Другие говорят, что все, кто не знают, как работает процессор, не достойны звания программиста. И вообще, если начать с простого языка, то привыкнешь к простоте и никогда не сможешь стать настоящим профессионалом. Нужно начинать с C++, а лучше с C. А ещё лучше с Ассемблера или двоичного кода.
Люди пишут об этом целые статьи и устраивают в комментариях настоящие войны:
-
, , , (автор советует начинать с самого простого, а сложное учить, когда оно понадобится).
Доля правды есть в словах обеих сторон. C++ может отпугнуть новичков своей сложностью, но то же самое может сделать и любой другой язык. Поэтому лучше выбрать сферу, которая будет по душе, и развиваться в ней. А язык стоит расценивать только как инструмент, его изучение не должно быть самоцелью.
Сложен ли язык программирования «C»?

1. Стандартный Паскаль — без классов и прочих ништяков — даст определённое понимание об аскетизме Си. Недостаток Си именно в том, что там нет автодеструкторов — фирменной фишки C++. Даже в строках. А обработка ошибок с корректным уничтожением созданных объектов — в C++ автоматом, в Delphi/C#/Java try/finally — может намотать немало нервов.
2. Хороших UI-библиотек с визуальным редактированием, как VCL в Delphi и WinForms в C#, на Си нет. Во многом это связано с тем, что на Си нет простого и стандартного способа хранить строки. Разумеется, невизуально никто не мешает делать интерфейс, WinAPI (кроме COM, который ориентирован под устройство класса Microsoft C++) рассчитан именно на Си.
Язык учи, это неплохо расширит твой кругозор и даст понять, откуда берутся кое-какие фишки языков, с которыми мы постоянно имеем дело. Большинство языков в те времена писали академики. Си писал практик, писал как попало, писал для своих, и хоть некоторые его решения оказались неверными, Юникс сослужил хорошую службу как реклама Си.
- Вконтакте
>>кроме COM, который ориентирован под устройство класса Microsoft C++