Личные инструменты
Счётчики
Рекламодателям
В других энциклопедиях

C++

Материал из Lurkmore

Перейти к: навигация, поиск
Kapitan ochevidnost'.jpgCaptain Obvious to the rescue!
Сия статья создавалась при активном участии Капитана Очевидность, в результате чего она пространно повествует о вещах, достаточно полное представление о которых имеет даже младенец-имбецил. Так-то!
«

There are just two kinds of languages: the ones everybody complains about and the ones nobody uses.

»
— Bjarne Stroustrup
«

На говне сметану не сделаешь

»
— Народ о Qt для C++

С++ (си-плюс-плюс, си два плюса, cpp, кресты, плюсы, сипипи, цепепе, приплюснутый, ци с классами, The Programming Language) — язык программирования, который за минимальными исключениями знаком всем программистам, но которым пока никто полностью не овладел. Создан Страуструпом с целью поднять зарплаты специалистов в индустрии, что, судя по всему, ему успешно удалось, так как по сложности изучения С++ превосходит все остальные промышленно используемые языки программирования вместе взятые. Первоначально представлял собой C + ООП + тележка разных прелестей. Ныне же, со всеми доработками и библиотеками, абсолютно всеобъемлющ, поэтому предположительно является языком, на котором Б-г написал Вселенную. Реализует все парадигмы, включает в себя все технологии, годен для любых целей. Несмотря на это продолжает эволюционировать. При этом быдлокодеры находят в нём простоту и ясность, а гуру-программеры — сложность и глубину. Правда, ровно до тех пор, пока не увидят чужого кода, который, как правило, отличается от их собственного так же, как они сами от автора того кода. Кроме всего, C++ является вторым WW технофашизма, о чём громко говорит имя описывающего его стандарта: ANSI ISO/IEC 14882:1998.

Всё это безусловно доказывает безграничную многоликость Языка и выявляет его божественную природу.

Содержание

[править] Хелловорлды

[править] Как же так вышло

Сначала где-то в 60-70-х как развитие процедурного программирования была придумана ересь под названием ООП. Уже тогда великий Дейкстра прочуял пиздец и отозвался о ней как об «исключительно плохой идее, которую могли придумать только в Калифорнии», но сделать ничего не мог, так как туча мозгоблудов тут же эту идею подхватили. Следствием этого стали многочисленные языки программирования, реализующие задумку. В начале 70-х гении, чьи имена нельзя упоминать всуе, создали Юникс и Це. Первое стало навсегда лучшей осью для серьёзных машин, а второе языком, на котором эта ось написана, и лучшим языком для системного программирования.

В начале 80-х некто Страуструп решил улучшить лучший язык программирования, а также поднять свое ЧСВ до уровня K&R, заодно за счёт троллинга студентов, которых начали дрессировать именно на этом сабже, и это тот самый сабж который они знают и ненавидят больше всего. Так как на слуху тогда было именно ООП, то он решил прикрутить к лучшему языку для системного программирования ООП, да так, чтобы получившийся гибрид был быстр и совместим с Це. Ему удалось. Почти. К сожалению, полная совместимость достигнута не была. Однако скомпилированный код получался ничуть не менее шустрым, чем у папочки Це, всего лишь чуть менее, чем в пару раз тормознее.

Когда Р-чи хотел внести в C очередную фичу, К-рниган говорил: «Если тебе нужен PL/1, ты знаешь, где его взять.» Видимо, Страуструп не знал, где взять PL/1.

Но всем было б похуй, если б в тех же 80-х в мировой прогресс не вмешались ИБМ со своими персоналками. Внезапно, вместо однородных блоков числовых данных программам стало необходимо обрабатывать пёстрые массы офисной инфы, причём чуть ли не каждый кусочек её имел своё множество допустимых значений и требовал особого обхождения, что в переводе на компьютерный матан означает, что каждый такой кусочек имел свой тип данных. Когда же в начале 90-х на экранах персоналок замаячили окна и от программ потребовали ещё и гуёв, то профит от использования ООП стал очевидно прогнозируемым. С учётом невысоких тех. характеристик тогдашних машин, наиболее удачным решением выглядел переход на С++. Что и было массово осуществлено всей индустрией.

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

[править] Шаблоны

Шаблоны являются ключевым элементом современного С++.

Преимущества шаблонов:

  • Полны по Тьюрингу.
  • Вычисляются на этапе компиляции, что с учётом первого преимущества позволяет добиться сколь угодно долгой сборки программы.
  • Круче дженериков, что является важным аргументом в спорах C++ кодеров с их коллегами, пишущими на Java или C#.
  • Позволяют в полной мере реализовать обобщённое программирование, функциональное программирование, объектно-ориентированное программирование, в общем все парадигмы, которые С++ как бы реализует.
  • Круче макросов. Что оспаривается любителями C. Любители С++ же используют и то и другое в одном месте, и им мало.
  • Boost состоит из шаблонов чуть более чем на семь четвёртых.
  • STL состоит из шаблонов чуть менее чем полностью. (спойлер: Cтандартная библиотека шаблонов состоит из шаблонов чуть менее чем полностью)
  • Десятое правило Гринспена гласит: «Любая достаточно сложная программа на C или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp.» Шаблоны являются таким недолиспом, встроенным в язык C++.

[править] STL

«Алгоритмы + структуры данных = программы» — Н. Вирт.

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

В качестве структур данных выступают 8 контейнеров, такие как массив, список, словарь, а в качестве алгоритмов — сотня какой-то непонятной хрени вроде lexicographical_compare и set_symmetric_difference.

Недостатки STL:

  • На 3,1415926535897932384626433832795% реализуется разработчиком компилятора (из-за расовых разногласий ОС), поэтому существует десяток реализаций, каждая со своими клопами.
  • Содержит разрыв шаблона. Нормально, шаблон vector<T> — контейнер STL типа вектор, содержащий T. Но vector<bool> — ни разу не контейнер STL и никаких bool не содержит. Но всем абсолютно похуй, взамен юзают vector<char>.
  • Множества и словари в STL сделаны не на хеш-таблицах, а с применением деревьев поиска, что обычно печально с точки зрения производительности.
  • Громоздкое в использовании API из-за стремления к максимальной общности. Например, для получения значения по ключу из ассоциативного массива (без потенциального изменения состояния последнего) необходимо написать байт 200 кода. Для кого-то лечится макросами вроде BOOST_FOREACH и RANGE.

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

STL … It’s also something that, when you first encounter it, makes you wonder what the hell the designer was smoking. And once you’ve gotten used to it, you start wondering why other library designers don’t start smoking the same thing.

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

[править] Qt

Чего не хватает в C++? Правильно, триллиардов классов и формошлёпства со всеми вытекающими (C++ Быдлер не в счёт, ибо Delphi с другим синтаксисом). Ещё в 90-х двое троллей решили подшутить над владельцами тёплых ламповых машинок, и показать миру быстрый и лёгкий GUI. В итоге была организована компания Trolltech, и их детище — Qt получило неиллюзорный коммерческий и просто народный успех. Сейчас же всё это богатство продано Nokia, ну а индусского мастерства им не занимать (см. старые версии исходников Symbian).

Достоинства:

  • Кроссплатформенность почти как у жабы.
  • GUI можно строить покрасивее чем в дэльфи и прочих — есть даже поддержка CSS и HTML.
  • Весьма и весьма шустрая и небольшая библиотека (чистые библиотеки без свистелок и перделок — ~200 кб).
  • Сигналы и слоты.
  • Имеются порты на десятки языков.

Недостатки:

  • Несмотря на простоту школьникам всё равно не даётся.
  • C GUI можно работать только из главного класса, или же писать свои прослойки для остальных.

[править] Boost

Forget C++.jpg

Два C++ программиста, приняв пару стаканов вина, обсуждали разработку открытых библиотек, которые должны были бы содержать всё необходимое, не включенное в недавно вышедший Стандарт. Один из них упомянул, что Герб Саттер готовил пропозицию языка программирования Booze, который должен был быть лучше, чем Java. Смысл этой остроумной шутки в том, что java — сорт кофе, а booze — «бухло». Продолжением игры слов стало название «Boost» для набора открытых библиотек, куда на сегодняшний день вошли около сотни библиотек, а некоторые из них даже были запилены в будущий Стандарт (пруфлинк — FAQ буста).

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

[править] Почему «быдлокодерский»

Типичный представитель
Cpp.gif

Тысячи возможностей выстрелить себе в ногу в языке являются результатом совмещения высокоуровневых концепций ООП с более низкоуровневым языком С и говорят о продуманности дизайна С++ и уважении принципов обратной совместимости. Отсутствие сборки мусора говорит о попытках экономии памяти, а ещё о том, что действительно кошерные лямбды прикрутить невозможно, те, что в с++0x — говно. (И да, никакие смартпоинтеры С++ не заменят настоящую сборку мусора, которая, к слову, в C++ тоже есть, в чистом виде, но ее никто серьезно не использует, ибо не стандарт).

С другой стороны, принадлежность его к быдлокодерским неоспорима. Многие аргументы в пользу принадлежности его к небыдлокодерским не выдерживают критики. Порог вхождения низок; фактически, каждую обезьянку, пишущую на Java или C-решетка, можно заставить писать на С++ (хотя далеко не каждую — читать потом это понаписанное на C++, что кагбе намекает). Засилье шаблонов STL и Boost, при этом, побуждает гореваятелей делать даже простейшие вещи вроде сортировки данных в массиве предельно громоздкими, ресурсоемкими и неочевидными методами, что порой плохо сказывается на производительности[1]. Тем не менее, на cpp написано относительно большое количество программ, и дописывается еще бо́льшим количеством индусов. Если системный код Windows написан на C, то юзермодные свистелки и перделки, вроде IE, шелла, и прочие — чаще всего с использованием С++. Даже писать мышкой можно — для этого есть Борланд С-Быдлер. Достаточно знать 15 функций и хорошо манипулировать операторами if, while.

Тем не менее, на Topcoder'е среди участников в первом дивизионе доля пишущих на C++ существенно выше, чем во втором ([1], [2]), см. также как было с этим в 2003 году [3].

Олсо C++ практически (чуть более, чем целиком) не используется для написания этих ваших Linux Kernels & Daemons, что кагбе намекает всем нам.

[править] Положение в современном мире

C++ профессионал смотрит на тебя как на…

Серьёзный бизнес мало интересуют субъективные рассуждения школяров-задротов, наподобие изложенных выше, и поэтому на реальную роль С++ действуют совершенно иные факторы. А именно:

  1. Переусложнённость, сочетание прямой работы с памятью с грязной реализацией ООП, что для новых проектов означает увеличенный бюджет и более высокий риск фейла.
  2. Универсальность, никому как правило не нужная.
  3. Большой объём уже написанного на С++ кода, который приходится поддерживать.
  4. Свежее мясо Новых программистов обычно уже не учат на этом языке (а учат этой вашей Java, C# и прочим более устойчивым к быдлокодерству языкам), и это уже вовсе не тот язык, который они знают лучше всего (а stl и boost студентота не знает чуть менее, чем вовсе).
  5. Это по-прежнему весьма и весьма шустрый язык, отличающийся одним из самых тормозных компиляторов при этом.

[править] Xenocephal

Drama.pngZOMG TEH DRAMA!!!11
Обсуждение этой статьи неиллюзорно доставляет не хуже самой статьи. Рекомендуем ознакомиться и причаститься, а то и поучаствовать, иначе впечатление будет неполным.

C++ — довольно таки примитивное, но монстровое поделие, полное исторически сложившихся нелепых нагромождений. Человек, который хорошо в нем ориентируется — это хорошее зубрилко, а не хороший программист. Умение героически преодолевать трудности, которые создает твой собственный инструмент, вместо того, чтобы решать непосредственно прикладную задачу, в современном мире ценится разве что только среди прыщавых сосок. Работодатель же это сомнительное умение не ценит, и совершенно справедливо. В общем, так: хороший программист обязан знать Си. Хороший программист может знать C++, но это не обязательно уже. Главное, чтоб C и C++ не были единственными доступными программисту инструментами — иначе это адски паршивый программист.

http://www.sql.ru/forum/actualthread.aspx?bid=16&tid=466654

[править] См. также

[править] Примечания

  1. Тут следует заметить, что сопровождаемый код, коим его как раз-таки призваны сделать шаблоны, библиотеки и некоторые устоявшиеся традиции написания ПО, зачастую ценится намного больше, чем просто быстрый код, потому что это позволяет масштабировать производство, передавать в другие руки, делать форк и т.п. Однако это не умаляет достоинств свежевыпочкованных кодо-пейсателей, и во многих случаях по мере развития и обрастания костылями код все равно становится кучей несъедобного говна, непригодного для качественного скачка в эволюции продукта из 2.xx.xx в 3.0.


Источник — «http://lurkmore.to/C%2B%2B»