zabr3dun
Специалист
|
Внимание! Тема-детектор! Одним из побочных эффектов от прочтения этой темы является так называемый баттхерт. Если вы начнёте ощущать боль в нижней части спины, следует немедленно прекратить дальнейшее чтение. |
[HR][/HR]
[SUP]<< [/SUP]На говне сметану не сделаешь [SUB]>>[/SUB][SUB]
[/SUB][SUB] - Народ о Qt для C++
[/SUB]
[HR][/HR]
С++ (си-плюс-плюс, си два плюса, cpp, кресты, плюсы, сипипи, цепепе, приплюснутый, ци с классами, The Programming Language) — язык программирования, который за минимальными исключениями знаком всем программистам, но которым пока никто полностью не овладел. Создан Страус-трупом с целью поднять зарплаты специалистов в индустрии, что, судя по всему, ему успешно удалось, так как по сложности изучения С++ превосходит все остальные промышленно используемые языки программирования вместе взятые.
Первоначально представлял собой C + ООП + тележка разных прелестей. Ныне же, со всеми доработками и библиотеками, абсолютно всеобъемлющ, поэтому предположительно является языком, на котором Б-г написал Вселенную. Реализует все парадигмы, включает в себя все технологии, годен для любых целей. Несмотря на это, продолжает эволюционировать. При этом быдлокодеры находят в нём простоту и ясность, а гуру-программеры — сложность и глубину. Правда, ровно до тех пор, пока не увидят чужого кода, который, как правило, отличается от их собственного так же, как они сами от автора того кода.
Чудо-оружие эпохи технофашизма, о чём громко говорит имя описывающего его стандарта: ANSI ISO/IEC 14882:1998. Самый новый стандарт называется C++11 или ANSI ISO/IEC 14882:2011
Всё это безусловно доказывает безграничную многоликость Языка и выявляет его божественную природу, что некоторыми неверными интерпретируется как воплощение вселенского зла.
Первоначально представлял собой C + ООП + тележка разных прелестей. Ныне же, со всеми доработками и библиотеками, абсолютно всеобъемлющ, поэтому предположительно является языком, на котором Б-г написал Вселенную. Реализует все парадигмы, включает в себя все технологии, годен для любых целей. Несмотря на это, продолжает эволюционировать. При этом быдлокодеры находят в нём простоту и ясность, а гуру-программеры — сложность и глубину. Правда, ровно до тех пор, пока не увидят чужого кода, который, как правило, отличается от их собственного так же, как они сами от автора того кода.
Чудо-оружие эпохи технофашизма, о чём громко говорит имя описывающего его стандарта: ANSI ISO/IEC 14882:1998. Самый новый стандарт называется C++11 или ANSI ISO/IEC 14882:2011
Всё это безусловно доказывает безграничную многоликость Языка и выявляет его божественную природу, что некоторыми неверными интерпретируется как воплощение вселенского зла.
Как же так вышло
[HR][/HR][SUP]<< [/SUP]Не вызывай strlen в контексте строки его! [SUB]>>[/SUB][SUB][/SUB][SUB]- Дейкстра
[/SUB]
Сначала где-то в 60-70-х как развитие процедурного программирования была придумана ересь под названием ООП. Уже тогда великий Дейкстра прочуял ****ец и отозвался о ней как об «исключительно плохой идее, которую могли придумать только в Калифорнии», но сделать ничего не мог, так как туча мозгоблудов тут же эту идею подхватили. Следствием этого стали многочисленные языки программирования, реализующие задумку. В начале 70-х гении, чьи имена нельзя упоминать всуе, создали Юникс и Це. Первое стало навсегда лучшей осью для серьёзных машин, а второе языком, на котором эта ось написана, и лучшим языком для системного программирования.В начале 80-х некто Страуструп решил улучшить лучший язык программирования, а также поднять свое ЧСВ до уровня K&R, заодно за счёт троллинга студентов, которых начали дрессировать именно на этом сабже, и это тот самый сабж который они знают и ненавидят больше всего. Так как на слуху тогда было именно ООП, то он решил прикрутить к лучшему языку для системного программирования ООП, да так, чтобы получившийся гибрид был быстр и совместим с Це. Ему удалось. Почти. К сожалению, полная совместимость достигнута не была.Когда Р-чи хотел внести в C очередную фичу, К-рниган говорил: «Если тебе нужен PL/1, ты знаешь, где его взять.» Видимо, Страуструп не знал, где взять PL/1. В общем получилось так, что на продвинутый ассемблер накрутили продвинутое ООП. Это типа как бомжа не помыли, а надели фрак, а потом еще и корону.Но всем было б по***, если б в тех же 80-х в мировой прогресс не вмешались ИБМ со своими персоналками. Внезапно, вместо однородных блоков числовых данных программам стало необходимо обрабатывать пёстрые массы офисной инфы, причём чуть ли не каждый кусочек её имел своё множество допустимых значений и требовал особого обхождения, что в переводе на компьютерный матан означает, что каждый такой кусочек имел свой тип данных. Когда же в начале 90-х на экранах персоналок замаячили окна и от программ потребовали ещё и гуёв, то профит от использования ООП стал очевидно прогнозируемым. С учётом невысоких тех. характеристик тогдашних машин, наиболее удачным решением выглядел переход на С++. Что и было массово осуществлено всей индустрией.Далее, стремительно заполонив все ниши, С++ столкнулся с множеством проблем и вызовов. На вызовы он, проявляя чудеса гибкости и расширяемости, отвечал внедрением новых фич и возможностей, а на проблемы забивал. Впрочем, большинство из них можно обойти, если знать как.
Великий подход II
[HR][/HR]
[SUP]<< [/SUP]Ты уверен, что ты писал на C++, а не на C с классами?… [SUB]>>[/SUB][SUB]
[/SUB][SUB]- RSDN
[/SUB]
Потоки[/SUB][SUB]- RSDN
[/SUB]
Здесь должен быть текст про MFC, но погромистов под MFC осталось так мало (сошли с ума, десу), что и рассказывать-то некому. В общем, это был неправильный Ц++ и он ушёл от нас.А вот недавно вышедший стандарт C++11 (gcc, clang, microsoft visual studio уже собирают, так-то) порадовал ключевым словом «auto» (привет, «var» из C#) и лямбдазамыканиями. Да-да, элементы функциональщины теперь и в моём C++.Под *nix-ами С++ уверенно отбивается от Явы, а ещё летает в космос и пикает в чипе карточки метрополитена.Под Виндой включён в Visual Studio и сделался C#-подобен: арифметика указателей по умолчанию оторвана, компилируется в IL-код для .Net. Но можно собирать на простые, не .Net-овские exe-шники.Веб-дизайнеры его, ес-но, не знают и не хотят знать.Хотя CMS на C++ имеются (CppCMS, wt) и годятся для годного троллинга.Отставшим от жизни олдфагам новый стандарт ничем не угрожает, «потому что пока примут, пока появятся компиляторы, пока рак на горе свистнет». А люди передовые уже в курсе, что поддержка тех же лямбд и потоков есть уже практически везде, и gcc и clang поддерживают новый стандарт целиком, а их стремительно догоняют Microsoft C++, Intel C++ и IBM XLC++ (да! есть и у них свой компилятор!). А вот C++Builder морально устарел и скоро помрёт такими темпами.Сейчас C++ поддерживается и развивается наибольшим количеством всеразличных корпораций за всю его историю. Так что поднять на нём сотни нефти более, чем реально. Но для этого надо прокачивать внимательность, опыт, начитанность и культуру программирования. Никакие сотни строк своего и перелопачивание тысяч строк чужого кода в этом не помогут.
Жабисты вроде
Сборка мусора
Без которой невозможна полноценная обработка исключений. Есть она в C++ или её нет?
На самом деле, сборка мусора была уже в Simula (откуда в C++ переехали классы), но Страуструп перенёс её в дополнительные библиотеки, чтобы разработчики сами решали, когда она будет, а когда нет. Сборщик мусора по умолчанию вызывает порядочные тормоза и не позволяет использовать язык для программирования ракет и ядерных боеголовок. Так что качаем сборщики мусора от сторонних производителей, а в маленьких проектах или в локальных функциях (где сверху объект создали, а снизу его же и удалили) юзаем std::unique_ptr. Вообще, надо RTFM, чтобы понять, какие бывают сборщики и почему в C++ есть аж 3 типа, просто быдлокодеры, как правило, ниасиливают даже 1 из них.
Если приходится работать с чужим кодом, где этого нету и указатели побились, просто помним, что у каждого объекта есть owner (функция, в которой его вызвали или класс, в поле которого он лежит) и именно owner обязан сделать delete. И при любом удалении любого объекта, который виден более одной функции, присвой указателю 0(особенно актуально для try-catch) (спойлер: а если 0 попадёт на вход delete, то delete 0 уже не удалит ничего, и код будет работать, как целый швейцарский часовой магазин).
Жабисты вроде
Кравецкого
, изучавшие C++ по улучшенному учебнику C, страшно возмущены тем, что узнавать, сколько элементов в массиве нужно хитро вывернутой конструкцией sizeof(array_name) / sizeof(array_type). А если бы они вместо флейма в ЖЖ почитали справку, то ВНЕЗАПНО! бы выяснили, что старые массивы оставлены для совместимости, а в STL уже много лет имеется вполне себе шустрый и динамичный std::dynarray
. Ну и не забываем про vector<>.Сборка мусора
Без которой невозможна полноценная обработка исключений. Есть она в C++ или её нет?
На самом деле, сборка мусора была уже в Simula (откуда в C++ переехали классы), но Страуструп перенёс её в дополнительные библиотеки, чтобы разработчики сами решали, когда она будет, а когда нет. Сборщик мусора по умолчанию вызывает порядочные тормоза и не позволяет использовать язык для программирования ракет и ядерных боеголовок. Так что качаем сборщики мусора от сторонних производителей, а в маленьких проектах или в локальных функциях (где сверху объект создали, а снизу его же и удалили) юзаем std::unique_ptr. Вообще, надо RTFM, чтобы понять, какие бывают сборщики и почему в C++ есть аж 3 типа, просто быдлокодеры, как правило, ниасиливают даже 1 из них.
Если приходится работать с чужим кодом, где этого нету и указатели побились, просто помним, что у каждого объекта есть owner (функция, в которой его вызвали или класс, в поле которого он лежит) и именно owner обязан сделать delete. И при любом удалении любого объекта, который виден более одной функции, присвой указателю 0(особенно актуально для try-catch) (спойлер: а если 0 попадёт на вход delete, то delete 0 уже не удалит ничего, и код будет работать, как целый швейцарский часовой магазин).
Самая первая большая программа, написанная на C++, была многопоточной. Это был распределённый Unix с ядром, широко раскинувшимся по нескольким компам, а писал его сам Страуструп для своей докторской диссертации. А потом оказалось, что компы бывают разные, и не во всех больше 1 процессора, и не во всех была стандартная архитектура, и т.д. и т.п. Поэтому потоки тоже разрешили пилить самостоятельно.
Именно отсюда пришёл известный тролльский вопрос на 90% собеседований по C++ и смежным языкам «Напишите синглтон... Хорошо. А теперь сделайте его потокобезопасным». Ведущие C++-шники Лурка советуют не теряться, почитать мануалы и дать не менее тролльский ответ, которым можно вызвать stack overflow у неопытного интервьювера (спойлерсогласно стандарту C++11, правильно написанный синглтон (например, Майерса из книжки More Effective C++) уже является потокобезопасным (см. первый коммент). Когда интервьюевер перезагрузится, можете рассказать ему про double-lock от Майерса-Александреску. И про std::thread, о котором большая часть людей, видевших C++ последний раз в универе, даже не подозревает.).
Что же дальше
C++ всех победит.
[HR][/HR]Десятое правило Гринспена гласит: «Любая достаточно сложная программа на C или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp.» Шаблоны являются таким недолиспом, встроенным в язык C++.
Шаблоны.они (
- Полны по Тьюрингу.
- Вычисляются на этапе компиляции, что с учётом первого преимущества позволяет добиться сколь угодно долгой сборки программы.
- Круче дженериков, что является важным аргументом в спорах C++ кодеров с их коллегами, пишущими на Java или C#.
- Позволяют в полной мере реализовать обобщённое программирование, функциональное программирование, объектно-ориентированное программирование, в общем все парадигмы, которые С++ как бы реализует.
- Круче макросов. Что оспаривается любителями C. Любители С++ же используют и то и другое в одном месте, и им мало.
- Boost состоит из шаблонов чуть более чем на семь четвёртых.
- STL состоит из шаблонов чуть менее чем полностью.
STL
[HR][/HR]Это была идея Вирта, что «Алгоритмы + структуры данных = программы».
Ну вот, а Степанов когда-то придумал, что алгоритмы и структуры данных должны быть порознь. Идея посетила его светлую голову, когда он находился в состоянии бреда, вызванного отравлением то ли рыбой, то ли грибами. С появлением С++ и шаблонов в нём, идея оказалась воплотима, и была разработана библиотека STL, позже вошедшая в Стандарт.
В качестве структур данных выступают контейнеры, такие, как массив, список, словарь, а в качестве алгоритмов — сотня какой-то непонятной хрени вроде lexicographical_compare и set_symmetric_difference.
STL.он (
- На 3,1415926535897932384626433832795% реализуется разработчиком компилятора (из-за расовых разногласий
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!), поэтому существует десяток реализаций, каждая со своимиЧтобы видеть скрытое содержание Зарегистрируйтесь на форуме!.
- Содержит
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!. Нормально, шаблон vector<T> — контейнер STL типа вектор, содержащий T. Но vector<bool> — ни разу не контейнер STL и никаких bool не содержит. Но всем абсолютно по***, взамен юзают vector<char>.
- Множества и словари в STL сделаны не на хеш-таблицах, а с применением деревьев поиска, что обычно печально с точки зрения производительности (есть версии, реализованные на хеш-таблицах, нужно просто добавить префикс hash_ или unordered_).
- Громоздкое в использовании API из-за стремления к максимальной общности. Например, для получения значения по ключу из ассоциативного массива (без потенциального изменения состояния последнего) необходимо написать байт 200 кода. Для кого-то лечится макросами вроде BOOST_FOREACH и RANGE.
- Вызывает привыкание:
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++, но и в объектно-ориентированном программировании вообще. Вот что он пишет про ООП:
«Я уверен, что ООП методологически неверна. Она начинает с построения классов. Это как если бы математики начинали с аксиом. Но реально никто не начинает с аксиом, все начинают с доказательств. Только когда найден набор подходящих доказательств, лишь тогда на этой основе выводится аксиома. То есть, в математике вы заканчиваете аксиомой. То же самое и с программированием: сначала вы должны начинать развивать алгоритмы, и только в конце этой работы приходите к тому, что вы в состоянии сформулировать четкие и непротиворечивые интерфейсы. Именно из-за этой неразберихи в ООП так популярен рефакторинг — из-за ущербности парадигмы вы просто обречены на переписывание программы, уже в тот самый момент, когда только задумали её спроектировать в ООП-стиле».
Тысячи возможностей выстрелить себе в ногу в языке являются результатом совмещения высокоуровневых концепций ООП с более низкоуровневым языком С и говорят о продуманности дизайна С++ и уважении принципов обратной совместимости. Отсутствие сборки мусора говорит о попытках экономии памяти — а ещё о том, что без глобальных переменных, или как их называют теперь, «Паттерн Одиночка», программировать не получится. Зато конечный результат почему-то есть. И откуда же он взялся?…
Аргументы в пользу принадлежности C++ к «илитарным» языкам не выдерживают критики. Порог вхождения низок; как показывает опыт, каждую обезьянку, пишущую на решётках или на жаббе, можно заставить писать на С++ (хотя далеко не каждую — читать). При этом, засилье шаблонов STL и Boost побуждает гореваятелей делать даже простейшие вещи вроде сортировки данных в массиве предельно громоздкими, ресурсоемкими и неочевидными методами.
Избыток сложности не может компенсировать низкий порог вхождения, что влечёт за собой гигабайты говнокода, кривых программ, и, как следствие наличия большого числа «типа шарящих» — низкую оплату труда письма на нём. Зачем нанимать профессионала за пять косых, если можно нанять десяток голодных студентов за пятьсот, которые хоть и наебошат говно, но зато наебошат же.
Студентами и написано на C++ относительно большое количество программ, а дописывается еще бо́льшим количеством индусов. Если системный код Windows написан на C, то свистелки и перделки, вроде IE, шелла, и прочего — чаще всего на С++. Даже мышкой херачить можно: для этого есть Видимая Студия и Борланд Ц-Быдлер. Достаточно знать 15 функций и хорошо манипулировать операторами if и while, и «программный продукт» готов.
А то, что на выходе получается АдовЪ ГовнокодЪ — никого не волнует.
- говорит Lurkmore.to
Я закончил.
Последнее редактирование:
