Почему никому не нравится язык программирования c++?

      Комментарии к записи Почему никому не нравится язык программирования c++? отключены

в один раз программист Дуглас Крокфорд сообщил: Лишь сумасшедший будет применять C++. Так по какой причине C++ вычисляют далеко не лучшим языком для программирования? На данный вопрос отвечают пользователи сайта Quora.

Почему никому не нравится язык программирования c++?

Джон Харроп, занимается программированием больше 34 лет

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

Особенности языка С обусловлены определенными целями. Эти изюминки предназначались для ответа настоящих тех проблем и проблем, каковые они сами смогут позвать. Несложная математика с целочисленными операторами. Автоматическое распределение регистров посредством портативного (между компиляторами) бинарного интерфейса приложений. Простой, но эргономичный процессор предварительной обработки. И другое. Помимо этого, язык С не очень сильно усложнен: написать компилятор этого языка возможно за достаточно маленькое время (tinycc – это компилятор С для платформы х86, написанный всего за 65 тысяч строчков кода C!). C был выпущен с целью достижения определенной цели, и он ее удачно достиг. Благодаря «чистоте» данного языка, на рынок в ускоренном темпе вышло огромное количество качественных компиляторов и уже на ранней стадии были дешёвы решения на уровне совокупности помощи операций.

В отличие от С, у C++ ни при каких обстоятельствах не было четкой цели, исходя из этого многие функции этого языка добавлялись чуть ли не случайным образом. Начальная мысль Б. Страуструпа (вместе с М. Эллис — создатель книги «Справочное управление по языку программирования C++ с комментариями») была следующей: «С – это сильно, и объектно-ориентированное программирование (ООП) также сильно, исходя из этого давайте запихнем ООП в С». Ретроспективно ООП было обширно распространено, но наряду с этим как правило оно неверно употреблялось экспертами. Настоящие языки для ООП, такие как Smalltalk либо IO, владеют многими функциями, которых нет в C++. О

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

По сути, случайно усложнение C++ стало причиной тому, что написание трудящегося компилятора для этого языка стало практически неосуществимой задачей. К примеру, для этого языка очень сложно написать синтаксический анализатор. Синтаксис кроме этого имеет такие ужасающие операторы, как List , каковые интерпретируются как логический сдвиг вправо. Ни один из исходных компиляторов C ++ не был достаточно надежным. К примеру, на протяжении получения степени кандидата наук в 2000-2004 гг. я сталкивался с десятками неточностей в компиляторах C ++ из GNU, Intel и SGI. Качественные компиляторы были созданы лишь два десятилетия спустя.

Принято вычислять, что C ++ — это очень стремительный язык, но действительность такова, что C ++ будет стремительным лишь тогда, в то время, когда вы пишете C-подобный код, а также в этом случае это правило будет трудиться лишь для определенных видов программ. Исходя из позиции «вы не платите за то, что вы не используете», C++ совсем неэффективен. Идиома RAII, означающая «получение ресурса имеется инициализация», вводит множество вызовов ненужных функций, каковые время от времени могут быть очень дорогостоящими. Такие вызовы в большинстве случаев требуют эти, каковые в другом случае не употреблялись бы, исходя из этого эти сведенья сохраняются в активном применении, увеличивая регистровое давление и снижая производительность. Механизм исключений C ++ очень неэффективен (~ 6x медленнее, чем OCaml). Если сравнивать с современными сборщиками мусора, распределение новой и удаленной информации в C++ происходит медлительно, исходя из этого людям предлагается применять стандартные библиотеки шаблонов (STL). Но для них заблаговременно выделяют огромные блоки памяти, благодаря чего теряется одно из преимуществ, которое было в языке С, то есть, эффективность распределения памяти. Затем вам рекомендуется написать ваш личный распределитель STL, что уж правильное не лучше, чем применение С. Одним из главных в далеком прошлом показавшихся и сейчас существующих преимуществ C перед современными языками есть непрогнозируемое время ожидания, появляющееся у сборщиков мусора.

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

К примеру, в С++ вы не имеете возможность создать портативную библиотеку для работы с регулярными выражениями, в силу того, что в этом случае нереально будет выполнить компиляцию и генерацию кода в выполнимом файле, не смотря на то, что это возможно сделать в Java, C# и других языках, берущих начало в Lisp. Так как Java и C# имеют регулярные выражения в собственных стандартных библиотеках уже более 10 лет, тогда как C ++ их лишь взял.

Язык C++ так сложен, что кроме того мировые специалисты, как будто бы новички, допускают в нем неточности и промахи. Герб Саттер трудится в компании Микрософт, он продолжительное время был секретарём и организатором комитета по стандартизации ISO C++. На протяжении одной из собственных лекций он давал собственный любимый 10-строчный код на языке C++, и кто-то указал ему на неточность, приводящую к утечке памяти.

По моему личному точке зрения, новый язык программирования Rust – это то, каким должен был бы стать C++. В нем имеется обобщенное программирование (generics), размеченное объединение типов данных, сравнение на соответствие шаблоне и многие другие новые функции, к примеру, безопасность доступа к памяти без сбора мусора.

Акаш Патель, инженер по вычислительной технике

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

C# и Java – это ограниченные языки, и это как благословение, так и проклятие. В некоем смысле, с ними появляется довольно много сложностей (необходимость создавать класс для несложного «здравствуй, мир!» это глупо, поскольку имеется другие языки программирования, в которых по большому счету не требуются классы). Но их преимущество содержится в том, что, будучи более ограничивающим, их компилятор способен поймать бОльшее количество неточностей, каковые в C++ будут незаметны до того момента, пока вы не запустите программу. Либо до тех пор пока кто-то второй не запустит программу на втором компьютере, в второй сутки, в другую 60 секунд.

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

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

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

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

Эрик Скотт, эксперт в области теории вычислительных автомобилей и совокупностей

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

  • Как легко обучиться писать отличный, простой в сопровождении и пригодный для тестирования код на C ++?
  • Как сложно написать надёжный и прекрасный код на C++?

В случае, если сравнивать данный язык с C и Java, то ответ на оба вышеприведенных вопроса будет «достаточно сложно», и на это имеется последовательность обстоятельств. По сути, применение языка С++ в некоей степени похоже на применение огнестрельного оружия – основное это знать правила.

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

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

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

В случае, если программисты Java смогут примерно разбираться в языке, а по окончании, с ходом времени и наработкой практики, повышать собственный уровень квалификации, то начинающий программист на С++, слабо разбирающийся в проекте, ни при каких обстоятельствах не будет допущен на работу с ним. Помимо этого, каждому начинающему стоит в административном порядке прочесть книгу Скотта Мейерса «Действенное применение С++».

Все это приводит к тому, что многим командам разработчиков такие языки, как Java/C# и C, разрешат выполнить проект стремительнее, лучше и с меньшим числом недочетов. Многие отдельные разработчики смогут вычислять себя «надёжными обладателями оружия», создавая прекрасные и прекрасные коды, написать каковые возможно лишь при помощи С++. Но, в большинстве случаев, большая часть людей предпочитают или полностью избегать С++, либо же разрабатывать строгую внутреннюю политику в отношении того, какие конкретно функции этого языка будут употребляться в проекте, а какие конкретно нет.

Пол Конвэй, разработчик на пенсии, любитель научной фантастики

Я писал коды на С++ еще со времен Zortech. Я видел, как с течением времени язык все больше приукрашали. И еще в то время я осознал, что с С++, как и при с С, нужна дисциплина по поводу его применения. Тот факт, что данный язык имеет кое-какие очень экзотические и непривычные функции, совсем не свидетельствует, что их непременно необходимо впихнуть в программу.
Что касается того, по какой причине С++ вычисляют таким плохим – слушая вторых программистов, я осознал, что существует огромное множество предрассудков касательно этого языка. Я встречал людей, каковые говорили, что язык С прекрасен, и тех, кто именовал С++ совсем ненужным и тщетным. И я не согласен ни с теми, ни с другими.

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

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

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

Тот документ отложили в дальний коробку, и в том месте он лежит и по сей день, как мне известно. Практически все время с того момента я трудился с фактически трактуемыми языками. Но совсем сравнительно не так давно, к моему удивлению, мне довелось поработать с базой исходных кодов, которую я не видел очень много лет. И поразмыслить лишь, я заметил в том месте солидную часть кода, написанного на С++! Представьте себе, как я был удивлен.

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

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

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

Я думаю, база аналогичного отношения закладывается еще на протяжении обучения компьютерным наукам. Высшие учебные заведения стремятся снизить цена обучения за счет применения бесплатного ПО, исходя из этого многие программисты начинают с бесплатных и везде видящихся Unix/Linux и С.

Помимо этого, поэтому компания Микрософт создала первый компилятор С++, но я видел стойкое презрение к данной компании со стороны многих программистов, и подобным же негативом и презрением они награждали С++.

На мой взор, С++ — это прекрасный язык, и если он и сломан, то лишь собственной усложненностью. Но, как я уже сказал, я очень бережно использую предоставляемые им возможности. Это значит, что многие из них я не применял ни при каких обстоятельствах. А вдруг я это и делал, то очень бережно, дабы это не позвало неприятностей с обслуживанием кода.

Начать обучение с языка C++ — Вопросы и Ответы #36


Интересные записи: