| [досмотренная версия] | [ожидает проверки] |
|
|
| − | {{obvious}} | + | {{Q|{{Acronym|There are just two kinds of languages: the ones everybody complains about and the ones nobody uses.|Существуют только два вида языков: те, на которые все жалуются, и те, которые никто не использует.}}|Bjarne Stroustrup}} |
| | + | {{Q|На говне сметану не сделаешь|Народ о '''Qt''' для C++}} |
| | | | |
| − | {{Q|{{Acronym|There are just two kinds of languages: the ones everybody complains about and the ones nobody uses.|Существуют только два вида языков: те, на которые все жалуются и те, которые никто не использует}}|Bjarne Stroustrup}}
| + | [[Файл:IsItVietnamNoItsCpp.png|[[Выстрелить себе в ногу|Ветеран движения]]|thumb|300px]] |
| | + | {{Video|93SYc_FD9Jw|width=200|Типичный программист на C++}} |
| | | | |
| − | {{Q|На говне сметану не сделаешь|Народ о Qt для C++}}
| + | '''С++''' (''си-плюс-плюс, плюсы́, cpp, [[Тюрьма|кресты]], приплюснутый, [[ЧСВ|чсвшн]]. The Programming Language'') — язык программирования, о котором слышали многие, но которым, судя по всему, пока никто полностью не овладел. Создан мужиком типично [[нерд]]ической внешности (очки, свитер, лысина) с забавной фамилией [[Омская птица|Страус]][[Насиловать труп|труп]] с целью [[Серьёзный бизнес|поднять зарплаты]] [[Индусский код|специалистов в индустрии]], что, судя по всему, ему успешно удалось.<!-- «так как по сложности изучения С++ превосходит все остальные промышленно используемые языки программирования вместе взятые»: типичный бред высокомерия, что подтвердит любой, изучавший монады и прочий ФПшный атсрал. --> |
| | | | |
| − | '''С++''' (''си-плюс-плюс, си два плюса, cpp, кресты, плюсы, сипипи, цепепе, приплюснутый, ци с классами, The Programming Language'') — язык программирования, который за минимальными исключениями знаком всем программистам, но которым пока никто полностью не овладел. Создан [[Голубь|Страус]][[Насиловать труп|трупом]] с целью [[С блэкджеком и шлюхами|поднять зарплаты]] [[Индус|специалистов в индустрии]], что, судя по всему, ему успешно удалось, так как по сложности изучения С++ превосходит все остальные промышленно используемые языки программирования. Первоначально представлял собой [[Pure C|C]] + ООП + [[Свистелки и перделки|тележка разных прелестей]]. Ныне же, со всеми доработками и библиотеками, абсолютно всеобъемлющ, поэтому предположительно является языком, на котором [[Б-г]] написал Вселенную. Реализует все парадигмы, включает в себя все технологии, годен для любых целей. Несмотря на это продолжает эволюционировать. При этом [[быдлокодер]]ы находят в нём простоту и ясность, а [[гуру]]-программеры — [[СПГС|сложность и глубину]]. Правда, ровно до тех пор, пока не увидят [[Умение разбираться в чужом коде|чужого кода]], который, как правило, отличается от их собственного так же, как они сами от автора того кода. Кроме всего, C++ является вторым [[Вундервафля|WW]] технофашизма, о чём громко говорит имя описывающего его стандарта: ANSI ISO/IEC [[14/88|1488]]2:1998.
| + | Первоначально представлял собой [[Pure C|язык Си]] (в него же и компилировался, чтобы затем [[Хитрый план|использовать многочисленные готовые компиляторы Си]] под конкретную платформу), к которому прикрутили «классы» (сишные структуры с функциями внутри) и оператор ''++'' («увеличить на единицу»/«сделать шаг вперёд»), от которого и произошло название. Ныне же, со всеми доработками и библиотеками, <del>представляет свалку метафор и паттернов</del> является универсальным {{Acronym|ЯП|языком программирования}}, поддерживаемым на чуть менее, чем всех платформах. Очень сильно [[Эдип|потеснил своего предка]], благодаря чему большинство соответствующих инструментов теперь маркируется как «C/C++». Благодаря такой генетике на нём до сих пор можно писать шустрый и не требующий больших ресурсов код, способный без тормозов <del>и мыла</del> влезть в <del>жопу</del> каждую кофеварку. |
| | | | |
| − | Всё это безусловно доказывает безграничную многоликость Языка и выявляет его божественную природу. | + | Язык быстро стал заложником собственной популярности: из-за дрочки на совместимость с тоннами практически сразу же написанного кода его развитие пошло по «системе Ниппель», когда невозможно вычистить что-то из нового стандарта, не доставив анальной боли той или иной группе хомяков. Одновременно с этим, он очень сильно отличается от старичка Си (и других популярных языков) тем, что акцент в развитии сделан не на функционале (которым стандартная библиотека крайне скудна), а на конь-септуальности<ref>Нет, библиотек, реализующих любой функционал, до жопы и более. Но вот необходимость тащить стороннюю библиотеку (одну из сотен) для вещей, которые ''встроены'' в остальные языки дарит море [[НЕНАВИСТЬ|радости и счастья]].</ref>. Благодаря сочетанию этих двух факторов, в одном C++'ном проекте можно встретить [[Ах ты ж ёбаный ты нахуй|10 и более разных типов строк]]<ref>И это только более-менее ''стандартных'' типов строк! Общее же число [[Костыль|реализаций]] строковых классов на порядки превосходит [[9000|сакральное число]].</ref>. |
| | + | |
| | + | [[Медведь и шлюха|Никому не принадлежит]]. Если [[Java]] [[pwned]] by [[Oracle]] и сильно прихватизирована [[Google|силами зла]], а [[C Sharp|C#]] анально имеем [[Microsoft]]'ом, плюсики [[:w:Законы Паркинсона|разрабатываются комитетом]]. Отсюда, в основном, и проистекают его многочисленные достоинства и недостатки: |
| | + | * '''Весьма невысокая {{Acronym|выразительность|Трудноформализуемое свойство языка программирования позволять писать на нём короткий и понятный код вместо простыней, которые надо долго вкуривать.}}'''. Ввести новое ключевое слово, даже если оно сто лет назад было зарезервировано и об этом написано на каждом заборе, [[Я гарантирую это|гарантированно]] означает сделать чей-то продукт некомпилируемым, а значит представители владельцев этого продукта в комитете будут упираться раком и голосовать против. Поэтому то, что в других языках будет принято [[Добровольно-принудительно|с песней и энтузиазмом]], в C++ будет не принято вовсе или реализовано самым неочевидным способом<ref>Пример. Вместо записи:<br /><br />''var i = 5;''<br /><br />(что значит: «Компилятор, объяви переменную i и сам догадайся, [[Капитан Очевидность|какого она типа, раз в неё надо записать 5]]»), принятой в чуть менее, чем всех языках, C++ предлагает писать:<br /><br />''[[Не такой, как все|auto i = 5;]]''.</ref>. |
| | + | * '''[[Retarded|Отсталость]]'''. Причины те же. |
| | + | * Всё ж таки, комитет не просто штаны протирает, а реально отстаивает усреднённые интересы IT'шного бизнеса, а значит и типичного сферического [[Быдлокодер|разработчика в вакууме]]. |
| | + | * Можно не бояться, что завтра компания-владелец свернёт лавочку, язык предаст анафеме, начнёт [[Встретимся в суде|стращать судом]] [[опенсорс]]ников и срать разработчикам в души и карманы. |
| | + | |
| | + | [[Вундервафля|Чудо-оружие]] эпохи [[технофашизм]]а, о чём громко говорит имя описывающего его стандарта: ANSI ISO/IEC [[14/88|1488]]2:1998. Самый новый стандарт называется C++[[2020|20]] (ISO/IEC 14882:2020). |
| | + | |
| | + | == Как же так вышло? == |
| | + | {{MorphFile |
| | + | |CppIn21DaysBookCover.jpg|Есть два способа выучить C++ за 21 день: фантастический… |
| | + | |C++ prosto.png|…и реалистичный. |
| | + | }} |
| | + | Всё началось <del>в океане</del> с того, что парень по имени [[:w:Алан Кей|Алан Кей]] изобрёл<ref>В том же смысле, в каком Virgin/Westwood [[Dune II|изобрели]] жанр RTS: разрозненные элементы были и до этого, но кому-то надо было их собрать.</ref> [[НЁХ]] под названием {{Acronym|ООП|Объектно-ориентированное программирование}} (воплотив свои идеи в языке ''SmallTalk''). История этого изобретения не только доставляет, но и способна навести на кое-какие умные мысли. Как-то раз Алан, [https://habr.com/ru/post/507996/ ползая раком по коридору с распечатками своих программ], подметил случай вопиющей [[РЛО|дискриминации]]: оказалось, что обычные переменные можно объединить в структуры (что примерно соответствует созданию шаблона карточки), а вот функции — хрен. Это делало простые переменные [[Белый человек|гражданами первого класса]], а функции на их фоне — [[Чурка|гражданами каких-то других классов]]. «[[BLM|Шо за несправедливость]]!», — подумал Алан, вспоминая, как за несколько дней до этого профессор в Университете Юты Боб Бартон отлил в граните: «'''Базовый принцип рекурсивного проектирования состоит в том, что сущности на любом уровне вложенности должны обладать равными возможностями'''». Оказалось, что уравнять функции и переменные в праве находиться внутри структур, это как дать возможность к карточке добавлять кнопки, при нажатии на которые карточка [[Колдунство|сама]] может слазить в картотеку, распечататься на принтере и т.п. |
| | + | |
| | + | Принцип этот дичайше доставляет тем, что будучи применён ещё раз, [[ИЧСХ]] — снова к функциям, но только в другом контексте (функции сделали гражданами первого класса, разрешив наряду с данными передавать их как параметры в другие функции, а также хранить их внутри переменных, описывая в виде простых выражений) — он порождает не менее великую НЁХ — {{Acronym|ФП|Функциональное программирование}}. Так что, анон, подумай на досуге, кого ещё можно с кем уравнять в правах — глядишь, изобретёшь что-то не менее великое, чем ООП и ФП и твой фотопортрет спрячут в хрестоматию. |
| | + | |
| | + | Как бы то ни было, в начале [[80-е|80-х]], примерно через 15 лет после описываемых событий, компания [[:w:Bell Labs|Bell Labs]] поручила своему сотруднику, [[:w:Бьярне Страуструп|Бьярне Страуструпу]], написать какую-то информационную систему под собственные нужды (что-то связанное с телефонными вызовами, как и положено компании Белла). Бьярне подошёл к задаче как [[типичный]], сцуко, программист: он решил, что для напейсания ему требуется <del>свой фреймворк</del> <del>своя библиотека</del> свой язык! Во всех имеющихся языках имелся [[фатальный недостаток]]. А вот конец этой истории оказался вовсе даже [[Не такой, как все|не типичным]]: вместо того, чтобы проебать [[Дедлайн|все сроки]], нихуя не написать и быть уволенным за долбоебизм и мегаломанию, Бьерне ВНЕЗАПНО закончил работу над языком, написал к нему транслятор и даже требуемую изначально информационную систему. Богатырь — не вы! |
| | + | |
| | + | Изначально Страусик хотел писать всё на [[:w:Simula|Симуле]] — языке, содержавшем [[зайчатки]] ООП ещё в те времена, когда Алан Кей не разродился Смолтоком. Однако оказалось, что результат такого программирования на доступном ему железе тормозит как [[Крузис]] на [[Спектрум]]е. А говнокодить на низкоуровневом языке ''BCPL'' в силу ущербности последнего ему показалось дольше, чем написать свой язык с [[блекджек]]ом. В результате он взял за основу [[Pure C|Си]], приделал к нему ООП в духе Симулы/Смолтока, и написал ''cfront'' — транслятор из нового улучшенного Си («Си с классами») в олдфажный Си. Язык неожиданно для Бьярне стал дичайше популярен среди его коллег, например, а потом — и среди прочих [[мимокрокодил]]ов. |
| | + | |
| | + | Первое время [[свистоперделки]] к языку он добавлял в одного, но позже передал эти обязанности комитету по стандартизации. Где-то примерно в это же время [[Люби Россию, пидор!|русский по фамилии '''СТ'''епанов]] и китаец по фамилии '''Л'''и набыдлячили библиотеку ''STL'', что, якобы, расшифровывается как ''Standard Template Library'' (но мы-то знаем!). С одной стороны, это была хорошая, годная библиотека, ибо позволяла при помощи шаблонов работать с такими сущностями, как строки и массивы. С другой — она была полна дичайших изъёбств в названиях (вместо Array — vector, вместо Add() — push_back() и т.п.) и спорных архитектурных решений (считать алгоритмы не частью объектов, как, казалось бы, следует из духа ООП, а независимыми сущностями). К восторгу одних и ужасу других, эта библиотека стала частью стандартной библиотеки языка. |
| | + | |
| | + | [[Файл:CppVsC.jpg|thumb|300px|Казино принимает ваши ставки!|]] |
| | + | Позже выяснилось, что строковый тип, который нихуя не умеет работать с текстом (заменять фрагменты, например) — это, конечно, круто, стильно, молодёжно, но немного недостаточно для плодотворного программирования. То же самое касалось отсутствующих [[регексп]]ов, работы [[Машина времени|со временем]] и другого функционала, доступного в прочих языках из коробки, но требующего от сиплюсплюсника прибегать к старым добрым, но устаревшим сишным функциям. Тогда другие [[Сумрачный гений|умники, чьи имена не столь известны]], запилили ''boost'' — хтонический многогигабайтный ужоснах, построенный на тех же принципах, что и STL, но дающий искомый функционал. О его [[Упячка|простоте и дружелюбности]] красноречиво говорит название модуля для работы со временем: ''Boost.Chrono''. К ещё большей попоболи [[Небыдло|обладающих вкусом месье]] части Буста тоже начали стандартизировать. Параллельно с этим язык обзаводился совершенно инопланетным синтаксисом (аж целых несколько операторов приведения типов, один из которых выглядит как ''std::uintptr_t v1 = reinterpret_cast<std::uintptr_t>(&i);'' и прочий [[BDSM]]). |
| | + | |
| | + | Наконец, под влиянием более молодых конкурентов — всяких шарпов — к языку прикрутили элементы ФП ([[:w:Лямбда-исчисление|лямбды]] и прочее), отчего язык [[ВП|окончательно начал]] выглядеть инфернально. |
| | + | |
| | + | Тем не менее, он и в 2021 году остаётся чуть ли не единственным языком, гарантирующим максимальную переносимость, наличие библиотек на все случаи жизни, отсутствие нежданчика с производительностью и независимость от каких-либо крупных вендоров. |
| | + | |
| | + | === Священная книга === |
| | + | Как и положено каждой уважающей себя секте, программисты на C++ обзавелись собственным священным писанием — Стандартом. Именно так, с большой буквы и никак иначе (см. эту статью, например). |
| | + | |
| | + | Стандарт [[состоит из]] множества нумерованных разделов, подразделов и подраздельчиков (типа, «7.6.2.9»), исчерпывающе описывающих, почему твой говнокод обязательно приведёт к ''Undefined Behavior'' — ситуации, когда в зависимости от [[Фаза Луны|фазы Луны]], разработчика твоего компилятора, версии операционной системы и других факторов произойдёт что угодно, что совершенно невозможно предсказать заранее. Например, твой компьютер превратится в кашалота или горшок с петунией. |
| | + | |
| | + | Великие гуру способны, глядя в произвольный исходник, по памяти называть номера разделов, которые нарушает каждая строчка такого кода. |
| | + | |
| | + | == И к чему пришло? == |
| | + | Язык <del>цветёт и</del> пахнет. В смысле, вполне себе жив. Если верить [https://www.tiobe.com/tiobe-index/ TIOBE] (это такое [[кармадрочер]]ство для языков, может, не самое справедливое или объективное, но на другие никто не ссылается), уже долгие, долгие годы в [[Царь горы|Царя горы]] играют [[Java]] с [[Pure C]], по очереди сталкивая друг друга с первого места на второе. А наш герой стабильно входит в пятёрку самых популярных, выше [[C Sharp|Шарп]]а, но ниже [[Питон]]а, лол. |
| | + | |
| | + | Язык прочно занял свои ниши — движки игр, например — и вряд ли их сдаст в ближайшее время. |
| | + | |
| | + | В вебе, как бы ни казалось обратное, он тоже незримо присутствует. Взять хоть браузеры, которые его отображают. Или [[:w:MySQL|Мускул]]/[[:w:MariaDB|Машу]], где данные анонимуса хранит большая часть сайтов. Все они написаны на связке языков, в которой плюсы занимают почётное место. |
| | + | |
| | + | Ах да, как сообщают с мест, [[Всем похуй|битва за карточку метрополитена проиграна Жабе]]. [[Это печально]]. |
| | | | |
| | == Хелловорлды == | | == Хелловорлды == |
| | + | [[Файл:Cpp.gif|thumb|[[DNIWE EBANOE]]]] |
| | {{NSFW|title='''Самый элементарный'''|content= | | {{NSFW|title='''Самый элементарный'''|content= |
| | <source lang="cpp"> | | <source lang="cpp"> |
|
|
| | int main() | | int main() |
| | { | | { |
| − | printf( "Hello, World\n" ); | + | puts( "Hello, World" ); |
| | + | return 0; |
| | } | | } |
| | </source> | | </source> |
|
|
| | int main() | | int main() |
| | { | | { |
| − | std::cout << "Hello, World" << std::endl; | + | std::cout << "Hello, World\n"; |
| | } | | } |
| | </source> | | </source> |
| − | Сферический, в вакууме. | + | Сферический в вакууме. |
| | + | Отмечается, что "\n" не эквивалентно "std::endl", так что вариант #1 более верен. |
| | }} | | }} |
| | <!-- ////////////////////////////////////////////////////////////////////// --> | | <!-- ////////////////////////////////////////////////////////////////////// --> |
| | {{NSFW|title='''Вариант 1'''|content= | | {{NSFW|title='''Вариант 1'''|content= |
| | + | <source lang="cpp"> |
| | + | #include <iostream> |
| | + | int main() |
| | + | { |
| | + | std::cout << "Hello, World" << std::endl; |
| | + | } |
| | + | </source> |
| | + | }} |
| | + | <!-- ////////////////////////////////////////////////////////////////////// --> |
| | + | {{NSFW|title='''Вариант 2'''|content= |
| | <source lang="cpp"> | | <source lang="cpp"> |
| | #include <stdio.h> | | #include <stdio.h> |
| | int main(void) | | int main(void) |
| | { | | { |
| − | char *message[] = {"Hello ", "World"}; | + | const char *message[] = {"Hello ", "World"}; |
| | int i; | | int i; |
| | | | |
|
|
| | }} | | }} |
| | <!-- ////////////////////////////////////////////////////////////////////// --> | | <!-- ////////////////////////////////////////////////////////////////////// --> |
| − | {{NSFW|title='''Вариант 2'''|content= | + | {{NSFW|title='''Вариант 3'''|content= |
| | <source lang="cpp"> | | <source lang="cpp"> |
| | #include <iostream.h> | | #include <iostream.h> |
|
|
| | } | | } |
| | </source> | | </source> |
| − | Учитывая, что в описаниях классов по умолчанию «включен» режим private, приходим к выводу, что это — поделие быдлокодера, который решил подстраховаться, а также [[ниасилил]] стандартную библиотеку.
| + | Как то так. |
| | }} | | }} |
| | <!-- ////////////////////////////////////////////////////////////////////// --> | | <!-- ////////////////////////////////////////////////////////////////////// --> |
| − | {{NSFW|title='''Вариант 3'''|content= | + | {{NSFW|title='''Вариант 4'''|content= |
| | <source lang="cpp"> | | <source lang="cpp"> |
| | #include <cstdio> | | #include <cstdio> |
|
|
| | | | |
| | </source> | | </source> |
| − | Для олдфагов. На [[труЪ|настоящем]] паскале выглядит, впрочем, несколько [[Pascal|иначе]]. | + | Для олдфагов. На [[труЪ|настоящем]] [[Pascal|паскале]] выглядит, впрочем, несколько [[Не тот|иначе]]. |
| | }} | | }} |
| | <!-- ////////////////////////////////////////////////////////////////////// --> | | <!-- ////////////////////////////////////////////////////////////////////// --> |
| − | {{NSFW|title='''Вариант 4'''|content= | + | {{NSFW|title='''Вариант 5'''|content= |
| | <source lang="cpp"> | | <source lang="cpp"> |
| | #include <iostream> | | #include <iostream> |
|
|
| | }} | | }} |
| | <!-- ////////////////////////////////////////////////////////////////////// --> | | <!-- ////////////////////////////////////////////////////////////////////// --> |
| − | {{NSFW|title='''Вариант 5'''|content= | + | {{NSFW|title='''Вариант 6'''|content= |
| | <source lang="cpp"> | | <source lang="cpp"> |
| | #include <string.h> | | #include <string.h> |
|
|
| | }} | | }} |
| | <!-- ////////////////////////////////////////////////////////////////////// --> | | <!-- ////////////////////////////////////////////////////////////////////// --> |
| − | {{NSFW|title='''Вариант 6'''|content= | + | {{NSFW|title='''Вариант 7'''|content= |
| | <source lang="cpp"> | | <source lang="cpp"> |
| | #include <iostream> | | #include <iostream> |
|
|
| | } | | } |
| | </source> | | </source> |
| | + | |
| | C++11 ^__^. Здесь присутствуют такие ништяки как: initializer lists, type inference (т.е. auto), range-based for-loop, lambda и for_each. К сожалению, регэкспы пока в gcc-4.6* не пашут. | | C++11 ^__^. Здесь присутствуют такие ништяки как: initializer lists, type inference (т.е. auto), range-based for-loop, lambda и for_each. К сожалению, регэкспы пока в gcc-4.6* не пашут. |
| | }} | | }} |
| − | == Как же так вышло == | + | <!-- ////////////////////////////////////////////////////////////////////// --> |
| | + | {{NSFW|title='''Вариант 8'''|content= |
| | + | <source lang="cpp"> |
| | + | #include <iostream> |
| | + | #include <cstring> |
| | + | using namespace std; |
| | + | int main() |
| | + | { |
| | + | char str[strlen("Hello, World!") + 1]; |
| | | | |
| − | Сначала где-то в 60-70-х как развитие процедурного программирования была придумана [[ересь]] под названием ООП. Уже тогда великий Дейкстра прочуял пиздец и отозвался о ней как об «исключительно плохой идее, которую могли придумать только в Калифорнии», но сделать ничего не мог, так как туча мозгоблудов тут же эту идею подхватили. Следствием этого стали многочисленные языки программирования, реализующие задумку. В начале 70-х гении, чьи имена нельзя упоминать всуе, создали Юникс и Це. Первое стало навсегда лучшей осью для серьёзных машин, а второе языком, на котором эта ось написана, и лучшим языком для системного программирования.
| + | strcpy(str, "Hello, World!"); |
| | + | cout << str; |
| | + | return 0; |
| | + | } |
| | + | </source> |
| | + | Исправленный пример от Анонимуса. |
| | + | }} |
| | + | {{NSFW|title='''Вариант 9'''|content= |
| | + | <source lang="c"> |
| | + | #include <stdio.h> |
| | + | |
| | + | int main() |
| | + | { |
| | + | char * h="Hello, World!\n\0"; |
| | + | for(;*h;putchar(*h++)); |
| | + | return 0; |
| | + | } |
| | | | |
| − | В начале 80-х некто Страуструп решил улучшить лучший язык программирования, а также поднять свое [[ЧСВ]] до уровня K&R. Так как на слуху тогда было именно ООП, то он решил прикрутить к лучшему языку для системного программирования ООП, да так, чтобы [[Детский сад|получившийся гибрид]] был быстр и совместим с Це. Ему удалось. Почти. [[Всем похуй|К сожалению]], полная совместимость достигнута [[fail|не была]]. Однако скомпилированный код получался не менее шустрым, чем у папочки Це.
| |
| | | | |
| − | Когда Р-чи хотел внести в [[C]] очередную фичу, К-рниган говорил: «Если тебе нужен PL/1, ты знаешь, где его взять.»
| + | </source> |
| − | Видимо, Страуструп не знал, где взять PL/1.
| + | Вариант на Си: Побуквенный вывод фразы - "Hello, World!". |
| | + | }} |
| | + | {{NSFW|title='''Вариант 10'''|content= |
| | + | <source lang="cpp"> |
| | + | using namespace std; |
| | + | #include<ofstream> |
| | | | |
| − | Но [[Всем похуй|всем было б похуй]], если б в тех же 80-х в мировой прогресс не вмешались ИБМ со своими персоналками. Внезапно, вместо однородных блоков числовых данных программам стало необходимо обрабатывать пёстрые массы офисной инфы, причём чуть ли не каждый кусочек её имел своё множество допустимых значений и требовал особого обхождения, что в переводе на компьютерный матан означает, что каждый такой кусочек имел свой тип данных. Когда же в начале 90-х на экранах персоналок замаячили окна и от программ потребовали ещё и [[ГУЙ|гуёв]], то [[профит]] от использования ООП стал очевидно прогнозируемым. С учётом невысоких тех. характеристик тогдашних машин, наиболее удачным решением выглядел переход на С++. Что и было массово осуществлено [[Миллионы мух не могут ошибаться|всей индустрией]].
| + | class hello{ |
| | + | public: |
| | + | hello() |
| | + | { |
| | + | ofstream hello; |
| | + | hello.open ("hello.com"); |
| | + | hello << "»..№..ґ.Љ.CН.вщН Hello, World!"; |
| | + | hello.close(); |
| | + | system("hello.com"); |
| | + | }}put; |
| | | | |
| − | Далее, стремительно заполонив все ниши, С++ столкнулся с множеством проблем и вызовов. На вызовы он, проявляя [[грязный хак|чудеса гибкости и расширяемости]], отвечал внедрением новых [[свистелки и перделки|фич и возможностей]], а на проблемы конечно забивал. Впрочем, большинство из них можно обойти, [[власти скрывают|если знать как]].
| + | int main(){ |
| | + | return 0; |
| | + | } |
| | + | </source> |
| | + | Братишка! Я тебе покушать принёс! |
| | + | Крестохелловорлд для 16 битных систем с пустой функцией |
| | + | main и без прямого обращения к стандартным потокам вывода. |
| | + | На Windows 7, Linux не работает к сожалению. |
| | + | Последний раз запускал на XP SP2 пару лет назад. |
| | + | }} |
| | + | {{NSFW|title='''Вариант 11'''|content= |
| | + | <source lang="cpp"> |
| | + | #include<iostream> |
| | + | #include<conio.h> |
| | | | |
| − | == Шаблоны ==
| + | using namespace std; |
| − | [[Файл:Carmen.jpg|thumb|[[Думать — это тупо!|Шаблоны — это просто.]]]]
| + | |
| | | | |
| − | Шаблоны являются ключевым элементом современного С++.
| + | int main() |
| | + | { |
| | + | cout<<"Hello world!!!\n"; |
| | + | _getch(); |
| | + | return 0; |
| | + | } |
| | + | </source> |
| | + | Пример от Анонимуса[2] |
| | + | }} |
| | + | {{NSFW|title='''Вариант 12'''|content= |
| | + | <source lang="cpp"> |
| | + | #include <iostream> |
| | | | |
| − | Преимущества шаблонов:
| + | int main() |
| | + | { |
| | + | char *s; |
| | | | |
| − | * [[BrainFuck|Полны по Тьюрингу]]. | + | s = "Hello, World!\n"; |
| | + | |
| | + | std::cout << s; |
| | + | |
| | + | return 0; |
| | + | } |
| | + | </source> |
| | + | Пример от Анонимуса [3] |
| | + | }} |
| | + | {{NSFW|title='''Вариант 13'''|content= |
| | + | <source lang="cpp"> |
| | + | #define _str "Hello, World!\n" |
| | + | #include <cstdio> |
| | + | #include <cstdlib> |
| | + | #include <cstring> |
| | + | |
| | + | int main() |
| | + | { |
| | + | char *s; |
| | + | |
| | + | s = (char *)malloc(15); |
| | + | |
| | + | strcpy(s, _str); |
| | + | printf("%s", s); |
| | + | |
| | + | return 0; |
| | + | } |
| | + | </source> |
| | + | Пример от Анонимуса [4] |
| | + | }} |
| | + | {{NSFW|title='''Вариант 14'''|content= |
| | + | <source lang="cpp"> |
| | + | #define _str "Hello, World!\n" |
| | + | #include <cstdio> |
| | + | #include <cstring> |
| | + | |
| | + | int main() |
| | + | { |
| | + | char *s; |
| | + | |
| | + | s = strdup(_str); |
| | + | |
| | + | printf("%s", s); |
| | + | |
| | + | return 0; |
| | + | } |
| | + | </source> |
| | + | Пример от Анонимуса [5]. От предыдущего отличается тем, что strdup() сама выделяет память. |
| | + | }} |
| | + | {{NSFW|title='''Вариант 15'''|content= |
| | + | <source lang="cpp"> |
| | + | #include <cstdio> |
| | + | |
| | + | int main(void) |
| | + | { |
| | + | for(const char* c = "Hello, World!"; *c; putchar(*c++)); |
| | + | return 0; |
| | + | } |
| | + | </source> |
| | + | Пример от Анонимуса [6]. Как вариант 9, только правильно. |
| | + | }} |
| | + | {{NSFW|title='''Вариант 16'''|content= |
| | + | <source lang="cpp"> |
| | + | #include <iostream> |
| | + | #include <conio.h> |
| | + | using namespace std; |
| | + | |
| | + | void hello(){ |
| | + | cout << "Hello, world!"; |
| | + | } |
| | + | |
| | + | void main(){ |
| | + | hello(); |
| | + | _getch(); |
| | + | } |
| | + | </source> |
| | + | }} |
| | + | {{NSFW|title='''Вариант 17'''|content= |
| | + | <source lang="cpp"> |
| | + | #include <iostream> |
| | + | #include <algorithm> |
| | + | |
| | + | void foo(char ch) |
| | + | { |
| | + | std::cout << ch; |
| | + | } |
| | + | |
| | + | int main() |
| | + | { |
| | + | char* str = "Hello, world!"; |
| | + | std::for_each(str, str + strlen(str), foo); |
| | + | |
| | + | return 0; |
| | + | } |
| | + | </source> |
| | + | }} |
| | + | {{NSFW|title='''Вариант 18'''|content= |
| | + | <source lang="cpp"> |
| | + | #include <iostream> |
| | + | #include <string> |
| | + | #include <iterator> |
| | + | |
| | + | int main() |
| | + | { |
| | + | std::string str = "Hello, world!"; |
| | + | std::copy(begin(str), end(str), std::ostream_iterator<char>(std::cout)); |
| | + | return 0; |
| | + | } |
| | + | </source> |
| | + | }} |
| | + | {{NSFW|title='''Вариант 19'''|content= |
| | + | <source lang="cpp"> |
| | + | #include <cstdio> |
| | + | |
| | + | void main() |
| | + | { |
| | + | char line[30000]={0}; |
| | + | int cell=0; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | while(line[cell]) |
| | + | { |
| | + | cell++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | cell++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | cell++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | cell++; |
| | + | line[cell]++; |
| | + | cell--; |
| | + | cell--; |
| | + | cell--; |
| | + | cell--; |
| | + | line[cell]--; |
| | + | } |
| | + | cell++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | putchar(line[cell]); |
| | + | cell++; |
| | + | line[cell]++; |
| | + | putchar(line[cell]); |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | putchar(line[cell]); |
| | + | putchar(line[cell]); |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | putchar(line[cell]); |
| | + | cell++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | putchar(line[cell]); |
| | + | cell--; |
| | + | cell--; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | putchar(line[cell]); |
| | + | cell++; |
| | + | putchar(line[cell]); |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | line[cell]++; |
| | + | putchar(line[cell]); |
| | + | line[cell]--; |
| | + | line[cell]--; |
| | + | line[cell]--; |
| | + | line[cell]--; |
| | + | line[cell]--; |
| | + | line[cell]--; |
| | + | putchar(line[cell]); |
| | + | line[cell]--; |
| | + | line[cell]--; |
| | + | line[cell]--; |
| | + | line[cell]--; |
| | + | line[cell]--; |
| | + | line[cell]--; |
| | + | line[cell]--; |
| | + | line[cell]--; |
| | + | putchar(line[cell]); |
| | + | cell++; |
| | + | line[cell]++; |
| | + | putchar(line[cell]); |
| | + | cell++; |
| | + | putchar(line[cell]); |
| | + | } |
| | + | </source> |
| | + | А программист на BrainFuck'е видит так. |
| | + | }} |
| | + | {{NSFW|title='''Вариант 20'''|content= |
| | + | <source lang="cpp"> |
| | + | #include <iostream> |
| | + | #include <cstring> |
| | + | |
| | + | char print(const char* str ) |
| | + | { |
| | + | if (*str == 'H') |
| | + | return *str; |
| | + | |
| | + | std::cout << print(str-1); |
| | + | return *str; |
| | + | } |
| | + | |
| | + | int main() |
| | + | { |
| | + | char str[] = "Hello world!"; |
| | + | std::cout << print(str+strlen(str)) << std::endl; |
| | + | |
| | + | return 0; |
| | + | } |
| | + | </source> |
| | + | }} |
| | + | {{NSFW|title='''Вариант 21'''|content= |
| | + | <source lang="cpp"> |
| | + | #include <iostream> |
| | + | |
| | + | int hi() { |
| | + | std::cout << "Hello World!" << std::endl; |
| | + | return 0; |
| | + | } |
| | + | |
| | + | int i = hi(); |
| | + | |
| | + | int main(void) { |
| | + | return 0; |
| | + | } |
| | + | </source> |
| | + | Вариант с пустым main() для эстетов. |
| | + | }} |
| | + | {{NSFW|title='''Вариант 22'''|content= |
| | + | <source lang="cpp"> |
| | + | #include "stdafx.h" |
| | + | #include "iostream" |
| | + | using namespace std; |
| | + | |
| | + | int _tmain(int argc, _TCHAR* argv[]) |
| | + | { |
| | + | cout << "Hello, world!\n"; |
| | + | return 0; |
| | + | } |
| | + | </source> |
| | + | вариант M$ visual studio 2013 |
| | + | }} |
| | + | {{NSFW|title='''Вариант 23'''|content= |
| | + | <source lang="cpp"> |
| | + | #include <Windows.h> |
| | + | |
| | + | int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) |
| | + | { |
| | + | MessageBox(NULL, L"This is Win32 API Hello World!", L"Hello World!", MB_OK); |
| | + | return 0; |
| | + | } |
| | + | </source> |
| | + | [[Гуй]]-версия — вместо консоли выводит окошко с сообщением. Работает только в Microsoft Windows, использует Windows API. Сишным компилятором тоже должно жеваться. |
| | + | }} |
| | + | {{NSFW|title='''Вариант 24'''|content= |
| | + | <source lang="cpp"> |
| | + | #include <iostream> |
| | + | #include <iterator> |
| | + | |
| | + | int main() |
| | + | { |
| | + | std::ostream_iterator<const char*>(std::cout) = "Hello, World!\n"; |
| | + | return EXIT_SUCCESS; |
| | + | } |
| | + | </source> |
| | + | }} |
| | + | {{NSFW|title='''Вариант 25'''|content= |
| | + | <source lang="cpp"> |
| | + | #include <iostream> |
| | + | |
| | + | template <typename... Arguments> |
| | + | class HW; |
| | + | |
| | + | |
| | + | template <class T> |
| | + | class HW<T> |
| | + | { |
| | + | public: |
| | + | HW(T t): ch(t) {} |
| | + | ~HW() { std::cout << ch;} |
| | + | private: |
| | + | T ch; |
| | + | }; |
| | + | |
| | + | template <typename T, typename... ARGS> |
| | + | class HW<T, ARGS...> : public HW<ARGS...> |
| | + | { |
| | + | public: |
| | + | HW(T t, ARGS... args):HW<ARGS...>(args...), ch(t){} |
| | + | ~HW() { std::cout << ch;} |
| | + | private: |
| | + | T ch; |
| | + | }; |
| | + | |
| | + | template <typename... ARGS> |
| | + | void Print(ARGS... args) |
| | + | { |
| | + | HW<ARGS...> hw(args...); |
| | + | (void)hw; |
| | + | } |
| | + | |
| | + | int main() |
| | + | { |
| | + | Print('H','e','l','l','o',' ','W','o','r','l','d','\n'); |
| | + | } |
| | + | </source> |
| | + | }} |
| | + | {{NSFW|title='''Вариант 26'''|content= |
| | + | <source lang="cpp"> |
| | + | #include <iostream> |
| | + | #include <conio.h> |
| | + | |
| | + | using namespace std; |
| | + | |
| | + | int main() |
| | + | { |
| | + | char ch = 0; |
| | + | |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | cout << ch; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | cout << ch; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | cout << ch; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | cout << ch; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | cout << ch; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | cout << ch; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; |
| | + | cout << ch; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | cout << ch; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | cout << ch; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | cout << ch; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | cout << ch; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | cout << ch; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; ch--; |
| | + | ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; ch++; |
| | + | ch++; ch++; ch++; |
| | + | cout << ch; |
| | + | |
| | + | _getch(); |
| | + | return 0; |
| | + | } |
| | + | </source> |
| | + | Инкрементно-декрементный вариант. |
| | + | }} |
| | + | <!-- ////////////////////////////////////////////////////////////////////// --> |
| | + | {{NSFW|title='''Вариант 27'''|content= |
| | + | <source lang="cpp"> |
| | + | #include <stdio.h> |
| | + | |
| | + | asm( |
| | + | ".PRINT:\n" |
| | + | ".ascii \"Hello, World\\0\"\n" |
| | + | ); |
| | + | |
| | + | int main(){ |
| | + | asm( |
| | + | "leaq .PRINT(%rip), %rcx\n" |
| | + | "call printf\n" |
| | + | ); |
| | + | return 0; |
| | + | } |
| | + | </source> |
| | + | С использованием ассемблерной вставки. |
| | + | }} |
| | + | |
| | + | == Шаблоны == |
| | + | [[Файл:LearnCppInOneVideo.jpg|thumb|[[Думать — это тупо!|Шаблоны — это просто.]]]] |
| | + | |
| | + | Десятое правило Гринспена гласит: «Любая достаточно сложная программа на C или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка [[Lisp|Common Lisp]]». Шаблоны являются таким недолиспом, встроенным в язык C++. |
| | + | |
| | + | === Шаблоны.они (=== |
| | + | * [[BrainFuck|Полны по Тьюрингу]]. Что это значит? Это значит, что если написать достаточно сложный код с шаблонами, бедный компилятор, пытаясь их скомпилировать, начнёт выполнять вычисления, которые можно сделать ''произвольными'' (и тем самым решить любую задачу, например, эмулировать любой, самый сложный комп, хоть Apple с M1). Только вот входные данные для таких вычислений надо тоже явно задавать в коде. Практическая польза от ''шаблонного метапрограммирования'' находится где-то на уровне: «Если купить новый [[Форд Фокус]], отковырять пластиковую заглушку в крыше, вынуть оттуда маленькую лампочку, которая горит, когда открыты двери, примотать её к голове, на спину повесить автомобильный аккумулятор, соединить проводами и нырнуть головой в унитаз, то можно будет пугать светом всех встречных кротов». |
| | * Вычисляются на этапе компиляции, что с учётом первого преимущества позволяет добиться [[только закончил собирать|сколь угодно долгой]] сборки программы. | | * Вычисляются на этапе компиляции, что с учётом первого преимущества позволяет добиться [[только закончил собирать|сколь угодно долгой]] сборки программы. |
| − | * [[фаллометрия|Круче]] дженериков, что является важным аргументом в [[Special Olympics|спорах]] C++ кодеров с их коллегами, пишущими на [[Java]] или [[C-решетка|C#]]. | + | * Статические, а не динамические, как {{Acronym|дженерики|Generic — конструкция, используемая для обобщённого программирования в Шарпе/Джабе}}, что позволяет устраивать [[Special Olympics|километровые забеги]], выясняя, что [[Фаллометрия|круче]]. |
| − | * Позволяют в полной мере реализовать обобщённое программирование, функциональное программирование, объектно-ориентированное программирование, в общем все парадигмы, которые С++ [[как бы]] реализует. | + | * Семантические, а не текстуальные, как {{Acronym|макросы|Инструкции для компилятора, как обработать исходный код перед компиляцией, используя правила замены и конкатенации}}, что позволяет не только устраивать [[Special Olympics|километровые забеги]], выясняя, что [[Фаллометрия|круче]], но и вводить в ступор [[Умение разбираться в чужом коде|читателей кода]], используя и то и другое одновременно в одном фрагменте. |
| − | * Круче макросов. Что оспаривается любителями [[C]]. [[Упоротый|Любители С++]] же используют и то и другое в одном месте, и им мало.
| + | * Лежат в основе ''STL'', который состоит из них чуть менее чем полностью, и ''boost'', который состоит из них чуть более чем на семь четвёртых. |
| − | * Boost состоит из шаблонов чуть более чем на семь четвёртых.
| + | |
| − | * STL состоит из шаблонов чуть менее чем полностью. {{Spoiler|[[Капитан Очевидность|Cтандартная библиотека шаблонов состоит из шаблонов чуть менее чем полностью]]}} | + | '''<h3>);</h3>''' |
| − | * Десятое правило Гринспена гласит: «Любая достаточно сложная программа на C или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка [[Lisp|Common Lisp]].» Шаблоны являются таким недолиспом, встроенным в язык C++.
| + | |
| | + | === Примеры === |
| | {{NSFW|title='''Вычисление факториала на стадии компиляции'''|content= | | {{NSFW|title='''Вычисление факториала на стадии компиляции'''|content= |
| | <source lang="cpp"> | | <source lang="cpp"> |
|
|
| | {{NSFW|title='''А это — факториал от авторов Phoenix-а, без всяких б-гомерзких enum-ов и static-ов'''|content= | | {{NSFW|title='''А это — факториал от авторов Phoenix-а, без всяких б-гомерзких enum-ов и static-ов'''|content= |
| | <source lang="cpp"> | | <source lang="cpp"> |
| − | struct fact_impl | + | #include <vector> |
| | + | #include <algorithm> |
| | + | #include <iostream> |
| | + | #include <boost/phoenix/core.hpp> |
| | + | #include <boost/phoenix/function.hpp> |
| | + | |
| | + | struct factorial_impl |
| | { | | { |
| − | template <typename Sig>
| + | template <typename Sig> |
| − | struct result;
| + | struct result; |
| − |
| + | |
| − | template <typename This, typename Arg>
| + | template <typename This, typename Arg> |
| − | struct result<This(Arg const &)>
| + | struct result<This(Arg)> |
| − | {
| + | : result<This(Arg const &)> |
| − | typedef Arg type; | + | {}; |
| − | }
| + | |
| − |
| + | template <typename This, typename Arg> |
| − | template <typename Arg>
| + | struct result<This(Arg &)> |
| − | Arg operator () (Arg const & n) const
| + | { |
| − | {
| + | typedef Arg type; |
| − | return (n <= 1) ? 1 : n * (*this) (n-1);
| + | }; |
| − | }
| + | |
| | + | template <typename Arg> |
| | + | Arg operator()(Arg n) const |
| | + | { |
| | + | return (n <= 0) ? 1 : n * this->operator()(n-1); |
| | + | } |
| | }; | | }; |
| | | | |
| − | function<fact_impl> const fact = fact_impl(); | + | |
| | + | int |
| | + | main() |
| | + | { |
| | + | using boost::phoenix::arg_names::arg1; |
| | + | boost::phoenix::function<factorial_impl> factorial; |
| | + | int i = 4; |
| | + | std::cout << factorial(i)() << std::endl; |
| | + | std::cout << factorial(arg1)(i) << std::endl; |
| | + | return 0; |
| | + | } |
| | </source> | | </source> |
| | }} | | }} |
|
|
| | triforce! | | triforce! |
| | --> | | --> |
| − | [http://www.xs4all.nl/~weegen/eelis/analogliterals.xhtml Moar здесь] | + | [http://nullroute.eu.org/mirrors/analogliterals/analogliterals.xhtml Moar здесь] |
| | Шаблоны здесь нужны для того, чтобы значения этих литералов вычислялись на этапе компиляции, являясь так называемыми expression templates. | | Шаблоны здесь нужны для того, чтобы значения этих литералов вычислялись на этапе компиляции, являясь так называемыми expression templates. |
| | }} | | }} |
| − | == STL ==
| |
| | | | |
| − | [[Файл:C++ prosto.png|thumb|[[TIME PARADOX|Самый простой способ выучить C++]]]] | + | [https://habrahabr.ru/company/pvs-studio/blog/301736/ Согласно альтернативному мнению шаблоны превращают C++ в тормозное функциональное говно!] |
| − | «Алгоритмы + структуры данных = программы» — [[Pascal|Н. Вирт]].
| + | |
| | | | |
| − | А. Степанов когда-то придумал, что алгоритмы и структуры данных должны быть порознь. Идея посетила его [[Сумрачный гений|светлую]] голову, когда он находился в состоянии бреда, вызванного отравлением то ли рыбой, то ли [[вещества|грибами]]. Тем не менее, с появлением С++ и шаблонов в нём, идея оказалась воплотима, и была разработана библиотека STL, позже вошедшая в Стандарт.
| + | == STL == |
| | + | Как было сказано выше, Алан Кей пропагандировал идею, что «Алгоритмы + структуры данных = объекты». |
| | | | |
| − | В качестве структур данных выступают 8 контейнеров, такие как массив, список, словарь, а в качестве алгоритмов — сотня какой-то непонятной хрени вроде lexicographical_compare и set_symmetric_difference.
| + | А некто Степанов в ответ придумал, что алгоритмы и структуры данных должны быть порознь. Идея посетила его [[Сумрачный гений|светлую]] голову, когда он находился в состоянии бреда, вызванного отравлением то ли [[Фугу|рыбой]], то ли [[Грибы|грибами]]. С появлением С++ и шаблонов в нём, идея оказалась воплотима, и была разработана библиотека STL, позже вошедшая в Стандарт. |
| | | | |
| − | Недостатки STL:
| + | В качестве структур данных выступают контейнеры, такие, как массив, список, словарь, а в качестве алгоритмов — сотни какой-то непонятной хрени вроде lexicographical_compare и set_symmetric_difference. |
| − | * На 3,1415926535897932384626433832795% реализуется разработчиком компилятора (из-за расовых разногласий [[ОС]]), поэтому существует десяток реализаций, каждая со своими [[баг|клопами]].
| + | |
| − | * Содержит [[разрыв шаблона]]. Нормально, шаблон vector<T> — контейнер STL типа вектор, содержащий T. Но vector<bool> — ни разу не контейнер STL и никаких bool не содержит. Но всем абсолютно похуй, взамен юзают vector<char>.
| + | |
| − | * Множества и словари в STL сделаны не на хеш-таблицах, а с применением деревьев поиска, что обычно печально с точки зрения производительности.
| + | |
| − | * Громоздкое в использовании API из-за стремления к максимальной общности. Например, для получения значения по ключу из ассоциативного массива (без потенциального изменения состояния последнего) необходимо написать байт 200 кода. Для кого-то лечится макросами вроде BOOST_FOREACH и RANGE.
| + | |
| | | | |
| − | Некоторые из этих недостатков являются [[фатальный недостаток|фатальными]], а потому будут исправлены в С++0х, [[Мы работаем над этим|когда, наконец, разрабы компиляторов родят детище, полностью поддерживающее оный стандарт]]...
| + | === STL.он (=== |
| | + | * На 3,14159% реализуется разработчиком компилятора (из-за расовых разногласий по поводу [[ОС]]), поэтому существует десяток реализаций, каждая со своими [[баг|клопами]]. |
| | + | * Содержит [[разрыв шаблона]]. Шаблон ''vector<T>'' — контейнер STL типа вектор, содержащий T. Но ''vector<bool>'' — ни разу не контейнер STL и никаких bool не содержит. Нормально, да? Но всем абсолютно [[похуй]], взамен юзают ''vector<char>''. |
| | + | * Реализует множества и словари не на хеш-таблицах, а с применением деревьев поиска, что обычно [[печально]] с точки зрения производительности. (Хинт: есть версии, реализованные на хеш-таблицах, нужно просто добавить префикс ''hash_'' или ''unordered_''). |
| | + | * Имеет громоздкий в использовании API из-за стремления к максимальной общности. Например, для получения значения по ключу из ассоциативного массива (без потенциального изменения состояния последнего) необходимо написать аж две сотни букв. Для кого-то лечится макросами вроде ''BOOST_FOREACH'' и ''RANGE''. |
| | + | * Вызывает привыкание: |
| | | | |
| | <blockquote>{{Acronym|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.|STL… Это алсо такая вещь, которая, когда первый раз сталкиваешься с ней, заставляет задуматься, что курили её разработчики. А когда к ней привыкнешь, начинаешь задумываться, почему бы разработчикам других библиотек не начать курить то же самое.}}</blockquote> | | <blockquote>{{Acronym|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.|STL… Это алсо такая вещь, которая, когда первый раз сталкиваешься с ней, заставляет задуматься, что курили её разработчики. А когда к ней привыкнешь, начинаешь задумываться, почему бы разработчикам других библиотек не начать курить то же самое.}}</blockquote> |
| | | | |
| − | По мере своего старения и уменьшения головного мозга, Александр Александрович полностью разочаровался не только в C++, но и в объектно-ориентированном программировании вообще, вот что он пишет про ООП: «Я уверен, что ООП методологически неверна. Она начинает с построения классов. Это как если бы математики начинали бы с аксиом. Но реально никто не начинает с аксиом, все начинают с доказательств. Только когда найден набор подходящих доказательств, лишь тогда на этой основе выводится аксиома. То есть в математике вы заканчиваете аксиомой. Тоже самое и с программированием: сначала вы должны начинать развивать алгоритмы, и только в конце этой работы приходите к тому, что вы в состоянии сформулировать четкие и непротиворечивые интерфейсы. Именно из-за этой неразберихи в ООП так популярен рефакторинг — из-за ущербности парадигмы вы просто обречены на переписывание программы, уже в тот самый момент, когда только задумали её спроектировать в ООП-стиле» (пруфлинк — [http://blogerator.ru/page/oop_why-objects-have-failed Почему объектно-ориентированное программирование провалилось?]) | + | '''<h3>);</h3>''' |
| | + | |
| | + | === Итоги === |
| | + | По мере своего старения и уменьшения головного мозга, Александр Александрович полностью разочаровался не только в C++, но и в объектно-ориентированном программировании вообще. Вот что он пишет про ООП: |
| | + | |
| | + | <blockquote>«Я уверен, что ООП методологически неверна. Она начинает с построения классов. Это как если бы математики начинали с аксиом. Но реально никто не начинает с аксиом, все начинают с доказательств. Только когда найден набор подходящих доказательств, лишь тогда на этой основе выводится аксиома. То есть, в математике вы заканчиваете аксиомой. То же самое и с программированием: сначала вы должны начинать развивать алгоритмы, и только в конце этой работы приходите к тому, что вы в состоянии сформулировать четкие и непротиворечивые интерфейсы. Именно из-за этой неразберихи в ООП так популярен рефакторинг — из-за ущербности парадигмы вы просто обречены на переписывание программы, уже в тот самый момент, когда только задумали её спроектировать в ООП-стиле».</blockquote> |
| | + | |
| | + | Пруфлинк: «[http://blogerator.ru/page/oop_why-objects-have-failed Почему объектно-ориентированное программирование провалилось]». |
| | + | |
| | + | Это как если бы [[Папа Римский]] вышел на балкон в Ватикане и сказал: «Молиться Иисусу — методологически неверно, Аллах акбар!» |
| | + | |
| | + | К сожалению, несмотря на такой каминг-аут, откатить все STL'ные правки из стандарта [[КЕМ]] не представляется возможным в силу причин, описанных выше. |
| | + | |
| | + | В середине десятых Александр Александрович выступал перед сотрудниками [[Яндекс]]а, где долго и с видимым удовольствием рассказывал, [[Ты хуй|какими эпитетами]] награждают его в письмах благодарные программисты и в турне [[ПНХ|по каким местам]] предлагают отправиться. К ещё большему сожалению, он объявил, что решительно отказывается их посещать. |
| | + | |
| | + | == CUDA и OpenCL == |
| | + | : ''для тех, кого забанили в педивикии: OpenCL != OpenGL ; OpenCL != OpenML ; OpenCL != OpenAL'' |
| | + | [[Матан]]овые библиотеки, позволяющие получить на C++ ещё больше скорости, так как вместо медленного центрального процессора задействуют графический процессор или другой вычислительный ускоритель. |
| | + | |
| | + | Своим появлением обязаны развитию графических шейдеров, изначально представлявших собой коротенькие инструкции для операций с текстурами (типа сложить текстуру A с текстурой B). Со временем сложность шейдеров нарастала, позволяя реализовывать более сложные операции, а помимо текстурных шейдеров появились вершинные шейдеры — для изменения координат вершины треугольника<ref>В современной компьютерной графике модель представляет собой многогранник из множества треугольников</ref>. В общем, компьютерная графика развивалась, и по вычислительной мощности<ref>Если измерять в флопсах, то есть скорости выполнения операция над числами с плавающей запятой/точкой.</ref> графические процессоры превзошли центральные процессоры общего назначения. |
| | + | |
| | + | Затем появился PhysX — специализированный процессор для работы с физикой, на которую ранее в компьютерных играх тупо забивали болт. Этот процессор превосходил по своей мощности центральные процессоры общего назначения, так что при воспроизведении какого-нибудь физического эффекта центральный процессор тормозил, а PhysX показывал невозможное. Но был один минус: физический ускоритель PhysX стоил ощутимых денег, и потому многих начала так же ощутимо душить жаба, при том что далеко не все игры поддерживали новые физические спецэффекты, и получалось, что недешёвую карту физического ускорителя нужно покупать, чтобы узреть красоту в [[3,5]] играх при отсутствии какого-либо другого влияния на игровой процесс (второй [[Half-Life]] с его гравитационной пушкой ещё не появился). |
| | + | |
| | + | И пока хомячки пищали, но готовили свои кошельки… вдруг эсперты выяснили, что несложные физические вычисления, типа сложить пару-тройку векторов, можно выполнить и через вершинный шейдер, а если [[аутофелляция|извернуться]], то можно посчитать физику и на текстурных шейдерах. Правда, всё это с бутылочным горлышком перегонки массивов данных из обычной памяти в графическую и обратно с участием центрального процессора. В общем, радужные перспективы PhysX, стали для специалистов и экспертов тускнеть и становиться туманными, в то время как для обычных хомячков, «эффективных» менеджеров с их гуманитарным образованием, и биржевых трейдеров, торгующих акциями, перспективы продолжали казаться такими же радужными… => его создатели постарались его побыстрее продать, пока не упали акции, а nVidia постаралась его побыстрей купить, пока это не сделали конкуренты. В итоге nVidia: |
| | + | # включила все наработки PhysX в свои видеокарты, |
| | + | # переделала текстурные и вершинные шейдеры в шейдеры общего назначения, |
| | + | # запилила CUDA, что позволяет считать произвольный [[матан]] на шейдерах общего назначения. |
| | + | |
| | + | WIN! |
| | | | |
| | == Boost == | | == Boost == |
| − | [[Файл:Forget C++.jpg|thumb|left]] | + | [[Файл:Forget C++.jpg|thumb|Как забыть C++]] |
| | | | |
| − | Два C++ программиста, приняв пару стаканов вина, обсуждали разработку открытых библиотек, которые должны были бы содержать всё необходимое, не включенное в недавно вышедший Стандарт. Один из них упомянул, что Герб Саттер готовил пропозицию языка программирования Booze, который должен был быть лучше, чем [[Java]]. Смысл этой [[Петросян|остроумной шутки]] в том, что java — сорт кофе, а booze — «бухло». Продолжением [[шизофазия|игры слов]] стало название «Boost» для набора открытых библиотек, куда на сегодняшний день вошли около сотни библиотек, а некоторые из них даже были запилены в будущий Стандарт (пруфлинк — [http://www.boost.org/users/faq.html FAQ буста]).
| + | В некотором царстве, в некотором государстве, два C++ программиста, приняв пару стаканов вина, обсуждали разработку открытых библиотек, которые должны были бы содержать всё необходимое, не включенное в недавно вышедший Стандарт. Один из них упомянул, что Герб Саттер готовил пропозицию языка программирования Booze, который должен был быть лучше, чем [[Java]]. Смысл этой [[Петросян|остроумной шутки]] в том, что java — сорт [[кофе]], а booze — «[[Алкоголь|бухло]]». Продолжением [[шизофазия|игры слов]] стало название «Boost» для набора открытых библиотек, куда на сегодняшний день вошли около сотни библиотек, а некоторые из них даже были запилены в нынешний или будущий Стандарт (пруфлинк — [http://www.boost.org/users/faq.html FAQ буста]). |
| | | | |
| | Использование этого набора библиотек в промышленном коде является предметом споров, причём не только в форумах интернетов, но и [[IRL]] с заказчиком, начальником или коллегой. [[Олд пердун|Консерваторам]] не очевиден профит применения проверенных решений вместо написания своих [[велосипед]]ов, также их пугает размер и сложность буста. На первый взгляд, опасения кажутся небезосновательными — эта штука собирается полностью около часа на не самом слабом ПК и занимает несколько гигабайт в собранном виде со всеми либами во всех конфигурациях; многие библиотеки кажутся полными [[матан]]а и возникают сомнения в способности быдлокодеров использовать их. [[На самом деле]], вышеприведенные опасения — хуита, а поддержка своих велосипедов или написание [[Китайский код|«минималистичного» кода]] обходятся дороже. | | Использование этого набора библиотек в промышленном коде является предметом споров, причём не только в форумах интернетов, но и [[IRL]] с заказчиком, начальником или коллегой. [[Олд пердун|Консерваторам]] не очевиден профит применения проверенных решений вместо написания своих [[велосипед]]ов, также их пугает размер и сложность буста. На первый взгляд, опасения кажутся небезосновательными — эта штука собирается полностью около часа на не самом слабом ПК и занимает несколько гигабайт в собранном виде со всеми либами во всех конфигурациях; многие библиотеки кажутся полными [[матан]]а и возникают сомнения в способности быдлокодеров использовать их. [[На самом деле]], вышеприведенные опасения — хуита, а поддержка своих велосипедов или написание [[Китайский код|«минималистичного» кода]] обходятся дороже. |
| | + | |
| | + | == Qt == |
| | + | Ещё в 90-х двое троллей решили подшутить над владельцами тёплых ламповых машинок, и показать миру быстрый и лёгкий GUI. В итоге была организована компания [[:w:Trolltech|Trolltech]], и их детище — Qt получило неиллюзорный коммерческий и просто народный успех. Позже это всё богатство было продано Nokia, затем перепродано Digia, в свете анальной связи Nokia с [[Microsoft]]. |
| | + | Алсо «Qt developers are happy developers. [[95%]] Satisfaction.» (c) [http://www.qt.io www.qt.io] |
| | + | |
| | + | === Достоинства === |
| | + | * GUI можно строить покрасивее, чем в [[Delphi|дэльфи]] и прочих — есть даже поддержка CSS, HTML и даже пародия на [[JavaScript]], в виде [[:w:QML|QML]]. |
| | + | * Весьма и весьма шустрая и небольшая библиотека. |
| | + | * Сигналы и слоты. |
| | + | * Имеются порты на десятки языков. |
| | + | * Одна из основных сред [[Linux|слюникса]]. |
| | + | * Полноценный фреймворк, даже есть пародия на GC (все объекты наследующие QObject удаляются автоматически). |
| | + | * Парадигма MVC, ограждающая вменяемых программистов от [[Быдлокодер|быдлокодеров]]<ref>см. [[:w:Магическая кнопка]]</ref>. |
| | + | * [[KDE|Плазма]] не [[Плазма не падает|падает]]. |
| | + | |
| | + | === Недостатки === |
| | + | * Таки довольно хуёвая кроссплатформенность. |
| | + | * Несмотря на простоту, школьникам всё равно не даётся. |
| | + | * Нужно полное понимание ООП, из-за чего [[школота|школьникам]] и [[быдло]]/[[C]]-кодерам не даётся. |
| | + | * Зависимости: если решил внести в софтину новую функциональность — нужно пересобирать всю библиотеку (если же распространять «как есть» — вес библиотек составляет почти 30мб). |
| | + | * На [[нищеброд|нищебродских машинках]] тормозит, ибо слишком широк и создан без понятия цели создания. |
| | + | * В версиях до 4.* все кнопки, полоски просмотра и прочие элементы окон рисовались везде одинаково (и везде одинаково убого), начиная с 4 под каждую систему всё прорисовывается как нативное. |
| | + | * Moc компилятор. |
| | + | * Был создан, как легковесная графическая библиотека, а превратился в широкий глобус с чуть менее видными краями. |
| | + | * Сборка под виндами — весьма [[депрессия|тоскливое]] занятие. |
| | + | * Qt Creator и плагины для прочих IDE могут в один прекрасный день перестать видеть qmake (для Qt < 5.x) |
| | + | |
| | + | == Где он живёт == |
| | + | {{Q|Большинство С++-программистов не знают, что делает большинство С++-программистов.|Андрей Александреску}} |
| | + | |
| | + | В наши дни C++ программисты по-прежнему очень нужны. Когда такого программиста удаётся поймать, его сажают за компьютер и заставляют: |
| | + | |
| | + | * Поддерживать стародивный С++ (а то и Pure С) код. |
| | + | * Писать большие коробочные игры (куча готовых движков/библиотек плюс быстрота) |
| | + | * Задрачивать системное/низкоуровневое программирование (драйвера, работа с портами, ядра ОС и т. п.) |
| | + | * Писать ядро высоконагруженных систем, для которых [[Java]] слишком требовательна, а [[Erlang]] тормознут. Apache, например. Или Dropbox. |
| | + | * Писать приложения конкурентоспособность которых определяется быстродействием (от агрегаторов фондовых бирж до движка практически каждого браузера и т. д.) |
| | + | * Писать ядро приложения, которое обрамляет код на более простом и понятном языке. Всякий научный и узкоспецифический софт вроде Mathematica. |
| | + | |
| | + | Разумеется, адекватные программисты пишут на C++ только основные части, самые требовательные к нагрузкам и памяти. Для интерфейсов, внешней логики и прочей [[Haskell|функциональщины]] используют внешние языки (Lua, Ruby, Boost:[[Python]]), которые милосердней к пользователю. А то и вовсе компилируют код в библиотеку и подключают к своему уютненькому проектику на [[PHP]]. |
| | + | |
| | + | А вот всякий интерпрайз и корпоративные приложения выбирают [[Java]] и [[C#]]. Для них C++ решительно не подходит: |
| | + | * Сложен и настроить в нём можно всё. За счёт этого не помещается в голове даже у самого Страуструпа. |
| | + | * Чтобы работать стало легко и приятно, надо осилить STL/Boost. А про них в учебниках пишут редко и скомкано: большинство программистов до сих пор учится по книгам, которые описывает не столько C++, сколько именно C с классами. Желающие писать на C++ крутотень и зарабатывать OVER9000 баксов должны узнавать что-то новое каждый день и неустанно постигать библиотеки (начинаешь с книжки 21st Century C: C Tips from the New School и далее по нарастающей) |
| | + | * Крайне сложная формализация. Поэтому в то время, как под Python/Java/C# есть ReSharper, который находит очепятки в коде прямо на лету, на C++ приходится каждый раз компилировать и распутывать запутанные ошибки компилятора, который в очередной раз подавился шаблоном. Спасибо, что подсветка синтаксиса есть. |
| | + | * Язык универсален — а веб-морду всё равно не сделаешь. Конечно, есть [http://www.webtoolkit.eu/wt WT], но без сборки мусора пыхтеть придётся долго. |
| | + | |
| | + | Писать большой проект с нуля и на C++ заслуженно считается малоудачной идеей. Любой программист прокачавшийся выше хеллоувордщика допускает на 10 000 строк кода примерно одинаковое количество ошибок (которое варьируется от 1 у Кнутов и [[Кармак|Кормаков]] до 10 000+ у типичного быдлокодера). А код на C++ обычно длиннее, чем на более поздних языках, и багов, разумеется, будет намного больше. В разы проще написать пусть медленный, но макет на чём-то хоть и медленном, но со сборкой мусора (обычно это [[C#]], [[Java]] или [[Python]], так как умеют читать C+±библиотеки), а потом переписать особенно тормозящие участки (которые, как водится, окажутся совсем не там, где ты думал). Наконец, бывает так, что единственная скорость, которой хочет заказчик — это скорость разработки и он ''покупает макет и начинает юзать его как нормальную программу'', оставляя программистов наедине с баблом и удивлением. |
| | + | |
| | + | В результате мы имеем всякие экзотические конфигурации вроде заводского сервера для станков на MINIX (видимо, переделывали из собственной дипломной работы, вдохновлённой общеизвестной книгой Таненбаума). |
| | + | |
| | + | А заказчик, помучившись год, начинает требовать версию 2.0, с кучей новых фич, а «скорости мне хватает». В результате макет переделывается, и снова переделывается, и снова… с перспективой превратиться в [[Фантом ОС|операционную систему на managed-коде]], которая, в отличии от Фантом ОС, ещё и запускается. |
| | + | |
| | + | [[А разгадка одна]]: в некоторых самоучителях (aka «tutorial»-ах) можно прочесть, что сабж++ и не [[ASM|рыба]], и не [[Java|мясо]], но является языком ВНЕЗАПНО «среднего уровня». |
| | + | |
| | + | * Означает сие следующее: сабж неплохо портируется на какие угодно платформы и архитектуры (ибо сравнительно малые трудозатраты на сей кропотливый процесс), и при том он держит как минимум марку «малый [[джентльменский набор]]», случись потребность перекомпилировать некий высокоуровневый (быдло)код. И потому удобно софт автоматом декомпилировать для последующего refactoring или даже reverse engineering не в ассемблер, а именно в Си или же СиПиПи, оно же ЦоПеПе. |
| | + | |
| | + | * С одной стороны, C++ aka {{Acronym|''CPP''|аббревиатура от C Plus Plus}} уступает в читабельности языкам высокого уровня (и притом отнюдь не только [[Python|Пайтону]]), для хоть какой-то эргономичности язык требует доработки напильником (вроде готового {{Acronym|фреймворка|Framework}}, заточенного под некую задачу) или нуждается в костыле, делающего язык визуально понятным (даже [[отечественный производитель]] с 1996-го для подобных нужд вывел в [[Халява|общественное достояние]] костыль-"язык «{{Acronym|Д.Р.А.К.О.Н.|ДРужелюбный Алгоритмический, Который Обеспечивает Наглядность}}», чтобы «гибр''ы''дный» DRAKON-CPP можно было хоть как-то читать непрофессионалу с учёной степенью [[МГИМО|по международному социологическому менеджменту]]. |
| | | | |
| | == Почему «быдлокодерский» == | | == Почему «быдлокодерский» == |
| | + | {{Q|А вы друзья, как ни садитесь —<br>всё в программисты не годитесь…|Эпос о Гильгамеше, XXII век до н.э.}} |
| | + | [[Файл:За еду.jpg|thumb|Типичный представитель]] |
| | | | |
| − | [[Файл:За еду.jpg|left|thumb|Типичный представитель]] | + | Тысячи возможностей [[выстрелить себе в ногу]] в языке являются результатом совмещения высокоуровневых концепций ООП с более низкоуровневым языком С и говорят о продуманности дизайна С++ и уважении принципов обратной совместимости. Отсутствие сборки мусора говорит о попытках экономии памяти — а ещё о том, что без глобальных переменных, или как их называют теперь, «Паттерн Одиночка», программировать не получится. Зато конечный результат почему-то есть. И откуда же он взялся?… |
| − | [[Файл:Cpp.gif|thumb]]
| + | |
| | | | |
| − | Тысячи возможностей [[выстрелить себе в ногу]] в языке являются результатом совмещения высокоуровневых концепций ООП с более низкоуровневым языком С и говорят о продуманности дизайна С++ и уважении принципов обратной совместимости. Отсутствие сборки мусора говорит о попытках экономии памяти, а ещё о том, что действительно кошерные лямбды прикрутить невозможно, те, что в с++0x — говно. (И да, никакие смартпоинтеры С++ не заменят настоящую сборку мусора).
| + | Аргументы в пользу принадлежности C++ к «илитарным» языкам не выдерживают критики. Порог вхождения низок; как показывает опыт, каждую обезьянку, пишущую на [[C Sharp|решётках]] или на [[Java|жаббе]], можно заставить писать на С++ (хотя далеко не каждую — читать). При этом, засилье шаблонов STL и Boost побуждает гореваятелей делать даже простейшие вещи вроде сортировки данных в массиве [[:en.w:Rube Goldberg machine|предельно громоздкими]], ресурсоёмкими и неочевидными методами. |
| | | | |
| − | С другой стороны, принадлежность его к быдлокодерским неоспорима.
| + | Избыток сложности не может компенсировать низкий порог вхождения, что влечёт за собой гигабайты говнокода, кривых программ, и, как следствие наличия большого числа «типа шарящих» — низкую оплату труда письма на нём. Зачем нанимать профессионала за пять косых, если можно нанять десяток голодных студентов за пятьсот, которые хоть и наебошат говно, но зато наебошат же. |
| − | Многие аргументы в пользу принадлежности его к небыдлокодерским не выдерживают критики. Порог вхождения низок; фактически, каждую обезьянку, пишущую на Java или [[C Sharp|C-решетка]], можно заставить писать на С++.
| + | |
| − | На cpp написано большое количество программ большим количеством индусов. Если системный код Windows написан на C, то юзермодные свистелки и перделки, вроде [[IE]], шелла, и прочие — чаще всего с использованием С++. Даже писать мышкой можно — для этого есть Борланд С-Быдлер. Достаточно знать 15 функций и хорошо манипулировать операторами if, while.
| + | |
| | | | |
| − | Тем не менее, на [[фаллометрия|Topcoder'е]] среди [[задрот|участников]] в [[вин|первом]] дивизионе доля пишущих на C++ существенно выше, чем во [[фэйл|втором]] ([http://www.topcoder.com/tc?module=ProblemDetail&rd=14180&pm=10726], [http://www.topcoder.com/tc?module=ProblemDetail&rd=14180&pm=10725]), см. также как было с этим в 2003 году [http://www.topcoder.com/tc?module=ProblemDetail&rd=4515&pm=1704].
| + | Студентами и написано на C++ относительно большое количество программ, а дописывается еще бо́льшим количеством индусов. Если системный код Windows написан на C, то свистелки и перделки, вроде [[IE]], шелла, и прочего — чаще всего на С++. Даже мышкой херачить можно: для этого есть Видимая Студия и Борланд Ц-Быдлер. Достаточно знать 15 функций и хорошо манипулировать операторами if и while, и «программный продукт» готов. |
| | + | |
| | + | А то, что на выходе получается АдовЪ ГовнокодЪ — никого не волнует. |
| | | | |
| | == Положение в современном мире == | | == Положение в современном мире == |
| | + | [[Файл:Cpp professional.jpg|thumb|++Ↄ профессионал смотрит на тебя как на…]] |
| | + | [[Файл:CppSlave.png|thumb|]] |
| | | | |
| − | [[Файл:Cpp professional.jpg|thumb|C++ профессионал смотрит на тебя как на…]]
| |
| | Серьёзный бизнес мало интересуют субъективные рассуждения школяров-задротов, наподобие изложенных выше, и поэтому на реальную роль С++ действуют совершенно иные факторы. А именно: | | Серьёзный бизнес мало интересуют субъективные рассуждения школяров-задротов, наподобие изложенных выше, и поэтому на реальную роль С++ действуют совершенно иные факторы. А именно: |
| | # Переусложнённость, сочетание прямой работы с памятью с грязной реализацией ООП, что для новых проектов означает увеличенный бюджет и более высокий риск фейла. | | # Переусложнённость, сочетание прямой работы с памятью с грязной реализацией ООП, что для новых проектов означает увеличенный бюджет и более высокий риск фейла. |
| − | # Универсальность, никому как правило не нужная. | + | # Универсальность, никому, как правило, не нужная. |
| − | # Большой объём уже написанного на С++ кода, который приходится поддерживать. | + | # Все прошивки для всех микроконтроллеров (их сложно найти только в лампах накаливания) пишутся на C. Кто-то где-то пытался их писать на паскале, но уже поздно. |
| − | # <del>Свежее мясо</del> Новых программистов обычно учат на этом языке и это именно тот язык, который они знают лучше всего. | + | # Большой объём уже написанного на С++ кода, который приходится поддерживать. Или же кода, написанного на C и которому на кой-то хер нужно было [[трап|сменить парадигму]]. |
| − | # Это по-прежнему весьма и весьма шустрый язык.
| + | # <del>Свежее мясо</del> Новых программистов обычно уже не учат на этом языке (а учат этой вашей Java, C# и прочим более устойчивым к быдлокодерству языкам), и это уже вовсе не тот язык, который они знают лучше всего (а stl и boost студентота не знает чуть менее, чем вовсе). |
| | | | |
| − | == [[Луговский#Подражатели|Xenocephal]] ==
| + | Кроме того, если посмотреть на рейтинг популярности языков на сайте |
| − | {{drama}}
| + | [http://www.tiobe.com/content/paperinfo/tpci/index.html www.tiobe.com], то можно заметить две вещи. Во-первых, по популярности C++ никогда не обходил [[C|своего папу]], а лишь однажды к нему приблизился, но было это в конце 90-х. Во-вторых, с появлением яблофона и яблолопаты, идейный брат C++, Objective-C, который используется почти исключительно Яблокорпорацией для их продукции и дотоле почти неизвестный, стал также набирать в популярности. Того и глядишь, через пару лет мы узнаем, почему Objective-C [[haters gonna hate|на самом деле непереносимо ужасный язык]]. |
| − | <!-- ребята, не спорьте с этим, это цит^H^H^H копипаста -->
| + | |
| | + | Олсо C++ практически (чуть более, чем целиком) не используется для написания этих ваших [[Unix|Linux Kernels & Daemons]], что кагбе намекает всем нам. |
| | + | |
| | + | И не забудьте ещё раз поправить именно эту часть статьи и донести до нас [[На самом деле|Правду!]] |
| | + | |
| | + | И наконец, — |
| | + | <br />{{NSFW|1='''[[Луговский]] ставит последние точки над «ё»:'''|2=<nowiki></nowiki> |
| | {{Цитата|pre=1|C++ — довольно таки примитивное, но монстровое поделие, полное исторически сложившихся нелепых нагромождений. Человек, который хорошо в нем ориентируется — это хорошее зубрилко, а не хороший программист. Умение героически преодолевать трудности, которые создает твой собственный инструмент, вместо того, чтобы решать непосредственно прикладную задачу, в современном мире ценится разве что только среди прыщавых сосок. Работодатель же это сомнительное умение не ценит, и совершенно справедливо. | | {{Цитата|pre=1|C++ — довольно таки примитивное, но монстровое поделие, полное исторически сложившихся нелепых нагромождений. Человек, который хорошо в нем ориентируется — это хорошее зубрилко, а не хороший программист. Умение героически преодолевать трудности, которые создает твой собственный инструмент, вместо того, чтобы решать непосредственно прикладную задачу, в современном мире ценится разве что только среди прыщавых сосок. Работодатель же это сомнительное умение не ценит, и совершенно справедливо. |
| | | | |
| − | В общем, так: хороший программист обязан знать Си. Хороший программист может знать C++, но это не обязательно уже. Главное, чтоб C и C++ не были единственными доступными программисту инструментами — иначе это адски паршивый программист.|source=http://www.sql.ru/forum/actualthread.aspx?bid=16&tid=466654}} | + | В общем, так: хороший программист обязан знать Си. Хороший программист может знать C++, но это не обязательно уже. Главное, чтоб C и C++ не были единственными доступными программисту инструментами — иначе это адски паршивый программист. |source=[http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=466654&msg=4576490 SQL.ru]}}}} |
| | | | |
| | == См. также == | | == См. также == |
| | * [[Быдлокодер]] | | * [[Быдлокодер]] |
| − | * [[C|Няшня Сишка]] | + | * [[Pure C|Няшная Сишка]] |
| | * [[Умение разбираться в чужом коде]] | | * [[Умение разбираться в чужом коде]] |
| | * [[Только закончил собирать]] | | * [[Только закончил собирать]] |
| − | * [[СПГС]]
| |
| | * [http://harmful.cat-v.org/software/c++/ C++ considered harmful], гарантируют даже [[Линус]] и [[RMS]] | | * [http://harmful.cat-v.org/software/c++/ C++ considered harmful], гарантируют даже [[Линус]] и [[RMS]] |
| | * [http://yosefk.com/c++fqa/ Почему C++ не торт] | | * [http://yosefk.com/c++fqa/ Почему C++ не торт] |
| | + | * [http://cs.mipt.ru/docs/comp/rus/develop/other/stroustrup_interview/ Лжестрауструп об ужасных плюсах] |
| | | | |
| | + | == Примечания == |
| | + | <references /> |
| | | | |
| − | {{Языки программирования}}
| |
| | | | |
| | + | {{Языки программирования}} |
| | + | {{Software}} |
| | [[w:C++]] | | [[w:C++]] |
| | [[en.w:C++]] | | [[en.w:C++]] |
| − | <!-- [[ae:C++]] redirects to C, lol-->
| + | [[ae:C++]] |