C++: различия между версиями
Перенаправление на Си плюс минус |
>VandalExample2 Нет описания правки |
||
| Строка 1: | Строка 1: | ||
# | {{Цитата|{{укроним|There are just two kinds of languages: the ones everybody complains about and the ones nobody uses.|Существуют только два вида языков: те, на которые все жалуются и те, которые никто не использует}}|Bjarne Stroustrup}} | ||
'''С++''' (си-плюс-плюс, cpp, сипипи, цепепе, The Programming Language) — язык программирования, который за минимальными исключениями знаком всем программистам, но которым пока никто полностью не овладел<ref>Ибо 95%</ref>. Создан [[Голубь|Страус]][[Насиловать труп|трупом]] с целью [[С блэкджеком и шлюхами|поднять зарплаты]] [[Программисты|специалистов в индустрии]], что, судя по всему, ему успешно удалось, так как по сложности изучения С++ превосходит все остальные промышленно используемые языки программирования. Первоначально представлял собой [[Pure C|C]] + ООП + [[Свистелки и перделки|тележка разных прелестей]]. Ныне же, со всеми доработками и библиотеками, абсолютно всеобъемлющ, поэтому предположительно является языком, на котором [[Б-г]] написал Вселенную. Реализует все парадигмы{{lolwhat}}, включает в себя все технологии{{lolwhat}}, годен для любых целей{{lolwhat}}. Несмотря на это продолжает эволюционировать. При этом [[быдлокодер]]ы находят в нём простоту и ясность, а [[гуру]]-программеры — [[СПГС|сложность и глубину]]. Правда, ровно до тех пор, пока не увидят чужого кода, который, как правило, отличается от их собственного так же, как они сами от автора того кода. Кроме всего, C++ является вторым [[Вундервафля|WW]] технофашизма, о чём громко говорит имя описывающего его стандарта: ANSI ISO/IEC [[14/88|1488]]2:1998. | |||
Всё это безусловно доказывает безграничную многоликость Языка и выявляет его божественную природу. | |||
== Хелловорлды == | |||
{{NSFW|title='''Самый элементарный'''|content= | |||
<source cpp> | |||
#include <cstdio> | |||
int main() | |||
{ | |||
printf( "Hello, World" ); | |||
} | |||
</source> | |||
}} | |||
{{NSFW|title='''Вариант 0'''|content= | |||
<source cpp> | |||
#include <iostream> | |||
int main() | |||
{ | |||
std::cout << "Hello, World" << std::endl; | |||
} | |||
</source> | |||
Сферический, в вакууме. | |||
}} | |||
{{NSFW|title='''Вариант 1'''|content= | |||
<source cpp> | |||
#include <stdio.h> | |||
int main(void) | |||
{ | |||
char *message[] = {"Hello ", "World"}; | |||
int i; | |||
for(i = 0; i < 2; ++i) | |||
printf("%s", message[i]); | |||
printf("\n"); | |||
} | |||
</source> | |||
[[На самом деле]] это сишный код, но сипипи компилером он тоже жуётся. | |||
}} | |||
{{NSFW|title='''Вариант 2'''|content= | |||
<source cpp> | |||
#include <iostream.h> | |||
#include <string.h> | |||
class string | |||
{ | |||
private: | |||
int size; | |||
char *ptr; | |||
public: | |||
explicit string(const char* chrs = 0) : size(chrs ? strlen(chrs) : 0) | |||
{ | |||
ptr = new char[size + 1]; | |||
if (chrs) | |||
strcpy(ptr, chrs); | |||
else | |||
ptr[size] = 0; | |||
} | |||
string(const string &s) : size(s.size) | |||
{ | |||
ptr = new char[size + 1]; | |||
strcpy(ptr, s.ptr); | |||
} | |||
~string() | |||
{ | |||
delete [] ptr; | |||
} | |||
friend ostream &operator <<(ostream &, const string &); | |||
string &operator=(const char *); | |||
string &operator=(const string&); | |||
}; | |||
ostream &operator<<(ostream &stream, const string &s) | |||
{ | |||
return(stream << s.ptr); | |||
} | |||
string &string::operator=(const string &s) | |||
{ | |||
this->~string (); | |||
new (this) string (s); | |||
return(*this); | |||
} | |||
string &string::operator=(const char *chrs) | |||
{ | |||
*this = string(chrs); | |||
return(*this); | |||
} | |||
int main() | |||
{ | |||
string str; | |||
str = "Hello World"; | |||
cout << str << endl; | |||
return(0); | |||
} | |||
</source> | |||
Поделие быдлокодера, который [[butthurt|ниасилил]] стандартную библиотеку<ref>Учитывая, что в описаниях классов по умолчанию "включен" режим private, приходим к выводу, что это таки и впрямь поделие быдлокодера, решившего поцстраховаться.</ref> | |||
}} | |||
{{NSFW|title='''Вариант 3'''|content= | |||
<source cpp> | |||
[ | |||
uuid(2573F8F4-CFEE-101A-9A9F-00AA00342820) | |||
] | |||
library LHello | |||
{ | |||
// bring in the master library | |||
importlib("actimp.tlb"); | |||
importlib("actexp.tlb"); | |||
// bring in my interfaces | |||
#include "pshlo.idl" | |||
[ | |||
uuid(2573F8F5-CFEE-101A-9A9F-00AA00342820) | |||
] | |||
cotype THello | |||
{ | |||
interface IHello; | |||
interface IPersistFile; | |||
}; | |||
}; | |||
[ | |||
exe, | |||
uuid(2573F890-CFEE-101A-9A9F-00AA00342820) | |||
] | |||
module CHelloLib | |||
{ | |||
// some code related header files | |||
importheader(<windows.h>); | |||
importheader(<ole2.h>); | |||
importheader(<except.hxx>); | |||
importheader("pshlo.h"); | |||
importheader("shlo.hxx"); | |||
importheader("mycls.hxx"); | |||
// needed typelibs | |||
importlib("actimp.tlb"); | |||
importlib("actexp.tlb"); | |||
importlib("thlo.tlb"); | |||
[ | |||
uuid(2573F891-CFEE-101A-9A9F-00AA00342820), | |||
aggregatable | |||
] | |||
coclass CHello | |||
{ | |||
cotype THello; | |||
}; | |||
}; | |||
#include "ipfix.hxx" | |||
extern HANDLE hEvent; | |||
class CHello : public CHelloBase | |||
{ | |||
public: | |||
IPFIX(CLSID_CHello); | |||
CHello(IUnknown *pUnk); | |||
~CHello(); | |||
HRESULT __stdcall PrintSz(LPWSTR pwszString); | |||
private: | |||
static int cObjRef; | |||
}; | |||
#include <windows.h> | |||
#include <ole2.h> | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include "thlo.h" | |||
#include "pshlo.h" | |||
#include "shlo.hxx" | |||
#include "mycls.hxx" | |||
int CHello::cObjRef = 0; | |||
CHello::CHello(IUnknown *pUnk) : CHelloBase(pUnk) | |||
{ | |||
cObjRef++; | |||
return; | |||
} | |||
HRESULT __stdcall CHello::PrintSz(LPWSTR pwszString) | |||
{ | |||
printf("%ws\n", pwszString); | |||
return(ResultFromScode(S_OK)); | |||
} | |||
CHello::~CHello(void) | |||
{ | |||
// when the object count goes to zero, stop the server | |||
cObjRef--; | |||
if( cObjRef == 0 ) | |||
PulseEvent(hEvent); | |||
return; | |||
} | |||
#include <windows.h> | |||
#include <ole2.h> | |||
#include "pshlo.h" | |||
#include "shlo.hxx" | |||
#include "mycls.hxx" | |||
HANDLE hEvent; | |||
int _cdecl main( | |||
int argc, | |||
char * argv[] | |||
) { | |||
ULONG ulRef; | |||
DWORD dwRegistration; | |||
CHelloCF *pCF = new CHelloCF(); | |||
hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); | |||
// Initialize the OLE libraries | |||
CoInitializeEx(NULL, COINIT_MULTITHREADED); | |||
CoRegisterClassObject(CLSID_CHello, pCF, CLSCTX_LOCAL_SERVER, | |||
REGCLS_MULTIPLEUSE, &dwRegistration); | |||
// wait on an event to stop | |||
WaitForSingleObject(hEvent, INFINITE); | |||
// revoke and release the class object | |||
CoRevokeClassObject(dwRegistration); | |||
ulRef = pCF->Release(); | |||
// Tell OLE we are going away. | |||
CoUninitialize(); | |||
return(0); } | |||
extern CLSID CLSID_CHello; | |||
extern UUID LIBID_CHelloLib; | |||
CLSID CLSID_CHello = { /* 2573F891-CFEE-101A-9A9F-00AA00342820 */ | |||
0x2573F891, | |||
0xCFEE, | |||
0x101A, | |||
{ 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 } | |||
}; | |||
UUID LIBID_CHelloLib = { /* 2573F890-CFEE-101A-9A9F-00AA00342820 */ | |||
0x2573F890, | |||
0xCFEE, | |||
0x101A, | |||
{ 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 } | |||
}; | |||
#include <windows.h> | |||
#include <ole2.h> | |||
#include <stdlib.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include "pshlo.h" | |||
#include "shlo.hxx" | |||
#include "clsid.h" | |||
int _cdecl main( | |||
int argc, | |||
char * argv[] | |||
) { | |||
HRESULT hRslt; | |||
IHello *pHello; | |||
ULONG ulCnt; | |||
IMoniker * pmk; | |||
WCHAR wcsT[_MAX_PATH]; | |||
WCHAR wcsPath[2 * _MAX_PATH]; | |||
// get object path | |||
wcsPath[0] = '\0'; | |||
wcsT[0] = '\0'; | |||
if( argc > 1) { | |||
mbstowcs(wcsPath, argv[1], strlen(argv[1]) + 1); | |||
wcsupr(wcsPath); | |||
} | |||
else { | |||
fprintf(stderr, "Object path must be specified\n"); | |||
return(1); | |||
} | |||
// get print string | |||
if(argc > 2) | |||
mbstowcs(wcsT, argv[2], strlen(argv[2]) + 1); | |||
else | |||
wcscpy(wcsT, L"Hello World"); | |||
printf("Linking to object %ws\n", wcsPath); | |||
printf("Text String %ws\n", wcsT); | |||
// Initialize the OLE libraries | |||
hRslt = CoInitializeEx(NULL, COINIT_MULTITHREADED); | |||
if(SUCCEEDED(hRslt)) { | |||
hRslt = CreateFileMoniker(wcsPath, &pmk); | |||
if(SUCCEEDED(hRslt)) | |||
hRslt = BindMoniker(pmk, 0, IID_IHello, (void **)&pHello); | |||
if(SUCCEEDED(hRslt)) { | |||
// print a string out | |||
pHello->PrintSz(wcsT); | |||
Sleep(2000); | |||
ulCnt = pHello->Release(); | |||
} | |||
else | |||
printf("Failure to connect, status: %lx", hRslt); | |||
// Tell OLE we are going away. | |||
CoUninitialize(); | |||
} | |||
return(0); | |||
} | |||
</source> | |||
[[Неведомая Ебаная Хуйня|Программа]] с использованием виндовых фич а-ля COM. Имеет такое же отношение к С++, как и к здравому смыслу.<br/> | |||
}} | |||
{{NSFW|title='''Вариант 4'''|content= | |||
<source cpp> | |||
#include <cstdio> | |||
#define HelloWorld | |||
#define BEGIN { | |||
#define END } | |||
#define PROGRAM int main() | |||
#define WRITELN(a) puts(a); | |||
PROGRAM HelloWorld | |||
BEGIN | |||
WRITELN("Hello, World") | |||
END | |||
</source> | |||
Для олдфагов. На [[труЪ|настоящем]] паскале выглядит, впрочем, несколько [[Pascal|иначе]]. | |||
}} | |||
{{NSFW|title='''Вариант 5'''|content= | |||
<source cpp> | |||
#include <iostream> | |||
#include <boost/mpl/vector_c.hpp> | |||
#include <boost/mpl/for_each.hpp> | |||
#include <boost/lambda/lambda.hpp> | |||
typedef boost::mpl::vector_c<char,'H','e','l','l','o',',', ' ','W','o','r','l','d'> string; | |||
int main() | |||
{ | |||
boost::mpl::for_each<string>(std::cout<<boost::lambda::_1); | |||
std::cout<<std::endl; | |||
}; | |||
</source> | |||
Шаблонно-бустовый | |||
}} | |||
{{NSFW|title='''Вариант 6'''|content= | |||
<source cpp> | |||
#include <string.h> | |||
#include <unistd.h> | |||
int main() | |||
{ | |||
char *str="Hello, World!"; | |||
write(1, str, strlen(str)); | |||
return 0; | |||
} | |||
</source> | |||
По принципу ассемблера. Тоже сишный код, кстати. | |||
}} | |||
== Как же так вышло == | |||
Сначала где-то в 60-70-х хз зачем<ref>[http://en.wikipedia.org/wiki/Object-oriented_programming#History Какже-какже]. Имитационное моделирование в терминах взаимодействующих объектов (Simula), событийный [[ГУЙ|графический интерфейс]], окошеджьки (Smalltalk). There were reasonz.</ref>, была придумана [[ересь]] под названием ООП. Уже тогда великий Дейкстра прочуял пиздец и отозвался о ней как об «исключительно плохой идее, которую могли придумать только в Калифорнии», но сделать ничего не мог, так как туча мозгоблудов тут же эту идею подхватили. Следствием этого стали многочисленные языки программирования, реализующие задумку. В начале 70-х гении, чьи имена я не буду упоминать всуе, создали Юникс и Це. Первое стало навсегда лучшей осью для серьёзных машин, а второе языком, на котором эта ось написана, и лучшим языком для системного программирования. | |||
В начале 80-х некто Страуструп решил улучшить лучший язык программирования, а так как на слуху тогда было именно ООП, то он решил прикрутить к лучшему языку для системного программирования ООП<ref>Вообще-то, наоборот: он хотел поднять скорость Симулы до скорости Си.</ref>, да так чтобы получившийся гибрид был совместим с Це. Зачем это ему понадобилось - непонятно<ref>Со временем становится ясно, что человек просто [[ЧСВ|хотел поднять своё имя до уровня К-рнигана и Р-чи]]. Он и сегодня пыжится, придумывая, чего бы ещё такого добавить в свой язык, человек просто компенсирует комплекс неполноценности. У C++ всегда будет свой комплекс.</ref>, однако ему это удалось<ref>Ну почти. [[всем похуй|К сожалению]], полная совместимость достигнута [[fail|не была]]. Утешением может служить то, что такой совместимостью обладает язык [[Apple|Objective C]], не менее быдлокодерский, и <s>не менее</s>более объектно-ориентированый, с динамической типизацией.</ref>, причём скомпилированный код получался не<s>намного</s> менее шустрым, чем у папочки Це. Когда Р-чи хотел внести в [[C]] очередную фичу, К-рниган говорил: | |||
Если тебе нужен PL/1, ты знаешь, где его взять. Видимо, Страуструп не знал, где взять PL/1. | |||
Но на это [[Всем похуй|всем было б похуй]], если б в тех же 80-х в мировой прогресс не вмешались ИБМ со своими персоналками. Внезапно, вместо однородных блоков числовых данных программам стало необходимо обрабатывать пёстрые массы офисной инфы, причём чуть ли не каждый кусочек её имел своё множество допустимых значений и требовал особого обхождения, что в переводе на компьютерный матан означает, что каждый такой кусочек имел свой тип данных. Когда же в начале 90-х на экранах персоналок замаячили окна и от программ потребовали ещё и [[ГУЙ|гуёв]], то [[профит|профит]] от использования ООП стал очевидно прогнозируемым. С учётом невысоких тех. характеристик тогдашних машин, наиболее удачным решением выглядел переход на С++. Что и было массово осуществлено [[Миллионы мух не могут ошибаться|всей индустрией]]. | |||
Далее, стремительно заполонив все ниши, С++ столкнулся с множеством проблем и вызовов. На вызовы он, проявляя [[грязный хак|чудеса гибкости и расширяемости]], отвечал внедрением новых [[свистелки и перделки|фич и возможностей]], а на проблемы конечно забивал, непрерывно накапливая. Впрочем, большинство из них можно обойти, [[власти скрывают|если знать как]]. | |||
== Шаблоны == | |||
[[Изображение:Carmen.jpg|thumb|300px|[[Думать — это тупо!|Шаблоны — это просто.]]]] | |||
Шаблоны являются ключевым элементом современного С++. | |||
Преимущества шаблонов: | |||
* [[BrainFuck|Полны по Тьюрингу]]. | |||
* Вычисляются на этапе компиляции, что, с учётом первого преимущества, позволяют добиться [[только закончил собирать|сколь угодно долгой]] сборки программы. | |||
* [[фаллометрия|Круче]] дженериков, что является важным аргументом в [[Special Olympics|спорах]] C++ кодеров с их коллегами, пишущими на [[Java]] или [[C-решетка|C#]]. | |||
* Позволяют в полной мере реализовать обобщённое программирование, функциональное программирование, объектно-ориентированное программирование, в общем все парадигмы, которые С++ [[как бы]] реализует. | |||
* Круче макросов. Что оспаривается любителями [[C]]. [[Упоротый|Любители С++]] же используют и то и другое в одном месте, и им мало. | |||
* Boost состоит из шаблонов чуть более чем на семь четвёртых. | |||
* STL состоит из шаблонов чуть менее чем полностью. {{spoiler|[[Капитан Очевидность | Cтандартная библиотека шаблонов состоит из шаблонов чуть менее чем полностью]]}} | |||
* Десятое правило Гринспена гласит: «Любая достаточно сложная программа на C или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка [[Lisp|Common Lisp]].» Шаблоны являются таким недолиспом, встроенным в язык C++. | |||
{{NSFW|title='''Вычисление факториала на стадии компиляции'''|content= | |||
<source cpp> | |||
#include <iostream> | |||
template<int N> | |||
struct fact | |||
{ | |||
enum | |||
{ | |||
value = N * fact<N - 1>::value | |||
}; | |||
}; | |||
template<> | |||
struct fact<0> | |||
{ | |||
enum | |||
{ | |||
value = 1 | |||
}; | |||
}; | |||
int main() | |||
{ | |||
const int n = 6; | |||
std::cout << n << "! = " << fact<n>::value << std::endl; | |||
return EXIT_SUCCESS; | |||
} | |||
</source> | |||
}} | |||
{{NSFW|title='''Шаблоны - это просто'''|content= | |||
<source cpp> | |||
template<typename C> class Basic_operations | |||
{ | |||
public: | |||
bool operator==(const C& a)const | |||
{ | |||
if(derived().size() != a.size()) return false; | |||
for(int i=0; i < derived().size(); ++i) | |||
if(derived()[i] != a[i]) return false; | |||
return true; | |||
} | |||
bool operator!=(const C&)const; // определение где-то но не здесь | |||
// ... еще ряд функций; | |||
// доступ к операциям класс С | |||
const C& derived()const {return static_cast<const C&>(*this);} | |||
}; | |||
template<typename T> class Math_container: public Basic_operations<Math_container<T> > | |||
{ | |||
public: | |||
std::size_t size()const; | |||
T& operator[](size_t); | |||
const T& operator[](size_t)const; | |||
}; | |||
</source> | |||
Классический пример с автоматической перегрузкой оператора сравнения для наследников класса Basic_operations. | |||
}} | |||
{{NSFW|title='''Библиотека Analog Literals'''|content= | |||
Пользуясь этой библиотекой, можно писать такой код: | |||
<source> | |||
assert( top( o-------o | |||
|L \ | |||
| L \ | |||
| o-------o | |||
| ! ! | |||
! ! ! | |||
o | ! | |||
L | ! | |||
L| ! | |||
o-------o ) == ( o-------o | |||
| ! | |||
! ! | |||
o-------o ) ); | |||
</source> | |||
[http://www.xs4all.nl/~weegen/eelis/analogliterals.xhtml Moar здесь] | |||
Шаблоны здесь нужны для того, чтобы значения этих литералов вычислялись на этапе компиляции, являясь так называемыми expression templates. | |||
}} | |||
== STL == | |||
«Алгоритмы + структуры данных = программы» — [[Pascal|Н. Вирт]]. | |||
А. Степанов когда-то придумал, что алгоритмы и структуры данных должны быть порознь. Идея посетила его [[Сумрачный гений|светлую]] голову, когда он находился в состоянии бреда, вызванного отравлением то ли рыбой, то ли [[вещества|грибами]]. Тем не менее, с появлением С++ и шаблонов в нём, идея оказалась воплотима, и была разработана библиотека STL, позже вошедшая в Стандарт. | |||
В качестве структур данных выступают 8 контейнеров, такие как массив, список, словарь, а в качестве алгоритмов — сотня какой-то непонятной хрени вроде lexicographical_compare и set_symmetric_difference. | |||
Недостатки STL: | |||
* Реализуется разработчиком компилятора, поэтому существует десяток реализаций, каждая со своими [[баг|клопами]]. | |||
* Содержит [[разрыв шаблона]]. Нормально, шаблон vector<T> — контейнер STL типа вектор, содержащий T. Но vector<bool> — ни разу не контейнер STL и никаких bool не содержит. Но всем абсолютно похуй, взамен юзают vector<char>. | |||
* Множества и словари в STL сделаны не на хеш-таблицах, а с применением деревьев поиска, что обычно печально с точки зрения производительности. | |||
* Громоздкое в использовании API из-за стремления к максимальной общности. Например, для получения значения по ключу из ассоциативного массива (без потенциального изменения состояния последнего) необходимо написать байт 200 кода. Для кого-то лечится макросами вроде BOOST_FOREACH и RANGE. | |||
Некоторые из этих недостатков являются [[фатальный недостаток|фатальными]], а потому будут исправлены в С++0х, [[второе пришествие|когда же он наконец выйдет]]. | |||
<blockquote>{{укроним|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 Почему объектно-ориентированное программирование провалилось?]) | |||
== Boost == | |||
[[Изображение:Forget_C++.jpg|thumb|left]] | |||
Два C++ программиста, приняв пару стаканов вина, обсуждали разработку открытых библиотек, которые должны были бы содержать всё необходимое, не включенное в недавно вышедший Стандарт. Один из них упомянул, что Герб Саттер готовил пропозицию языка программирования Booze, который должен был быть лучше, чем [[Java]]. Смысл этой [[Петросян|остроумной шутки]] в том, что java — сорт кофе, а booze — «бухло». Продолжением [[шизофазия|игры слов]] стало название «Boost» для набора открытых библиотек, куда на сегодняшний день вошли около сотни библиотек, а некоторые из них даже были запилены в будущий Стандарт (пруфлинк — [http://www.boost.org/users/faq.html FAQ буста]). | |||
Использование этого набора библиотек в промышленном коде является предметом споров, причём не только в форумах интернетов, но и [[IRL]] с заказчиком, начальником или коллегой. [[Олд пердун|Консерваторам]] не очевиден профит применения проверенных решений вместо написания своих [[велосипед]]ов, также их пугает размер и сложность буста. На первый взгляд, опасения кажутся небезосновательными — эта штука собирается полностью около часа на не самом слабом ПК и занимает несколько гигабайт в собранном виде со всеми либами во всех конфигурациях; многие библиотеки кажутся полными [[матан]]а и возникают сомнения в способности быдлокодеров использовать их. [[На самом деле]], вышеприведенные опасения — хуита, а поддержка своих велосипедов или написание [[Китайский код|«минималистичного» кода]] обходятся дороже. | |||
== Почему «быдлокодерский» == | |||
[[Изображение:За еду.jpg|left|thumb|Типичный представитель]] | |||
[[Изображение:Cpp.gif|thumb|right]] | |||
Многие аргументы в пользу принадлежности его к небыдлокодерским не выдерживают критики. Порог вхождения низок, фактически, каждую обезьянку, пишущую на Java или [[C Sharp|C-решетка]] можно заставить писать на С++. Тысячи возможностей [[выстрелить себе в ногу]] являются результатом совмещения высокоуровневых концепций ООП с более низкоуровневым языком С и говорят о продуманности дизайна С++<ref>Хотя на самом деле они говорят о глупости оратора и только. Обратная совместимость с С была одним из ключевых пунктов в создании C++, делалось это, что бы привлечь программеров на C, которые в то время составляли 99% программерского рынка, a так же для того, что бы эти программеры свободно использовали свой готовый код на C, который в то время так же составлял 99% всего написанного кода вообще.</ref>. Отсутствие сборки мусора<ref>Автор этого пункта сосет хуй, потому что С++ писался с языка Симула-67, который Страуструпа устраивал всем, за исключением низкой производительности, как раз из-за сборки мусора</ref> <ref>Автор нижеследующего пункта сосет хуй, ибо сам пункт основан [http://netcoder.ru/blog/csharp/176.html ни на чём]. Впрочем, автор этого пункта сосёт хуй дважды - один раз за необоснованный наезд, а второй за то, что притащил быдлокодерскую бредятину в статью. За подробностями в [http://lurkmore.ru/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:C%2B%2B Обсуждение].</ref> говорит о том же самом<ref>Вообще-то, действительное понимание областей видимости объектов и знание правил автоматических вызовов конструкторов и деструкторов, позволяют не горевать особо о мусоросборщиках а-ля [[Жаба]], экономят доступную память и увеличивают быстродействие программы. Правда, обладают этими действительными знанием и пониманием лишь около 5% кодеров на Це-плюсь-плюсе. Остальные [[95%|95]] — ругаются с компилятором и говорят, что С++ «не работает».</ref>, а ещё о том, что действительно кошерные лямбды прикрутить невозможно, те, что в с++0x — говно. (И да, никакие смартпоинтеры С++ не заменят настоящую сборку мусора). | |||
С другой стороны, принадлежность его к быдлокодерским неоспорима. На нём написано большое количество программ большим количеством индусов. Если системный код Windows написан на C, то юзермодные свистелки и перделки, вроде [[IE]], шелла, и прочие — чаще всего, с использованием С++.<ref>Довольно странный «неоспоримый» вывод. Может мне Кэп подскажет — на чем писать гуй, если не на плюсах? Только чур сидеть в консоли без свистелок или юзать ТруЪ С с его [http://en.wikipedia.org/wiki/GObject Г*] (ну или скриптовый Tcl/Tk в купе с использующимся исключительно для программирования АйФонов Objective C) не предлагать. КО отвечает: пиши свой гуй на HTML, браузер есть везде, пусть бородатые дятьки за тебя позаботятся о портировании браузера, а ты его используй, web2.0 же.</ref>Даже писать мышкой можно — для этого есть Борланд С-Быдлер. Достаточно знать 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]. | |||
По мнению лоровского быдлокодера-аналитика, С++ — это наспех сколоченная волосатым ублюдком быдлоподелка под объектно-ориентированный язык, который с гиками и гаками приняли такие же Dynamic-Cast-быдло-ублюдочные создания со страусофилическими наклонностями, мнящие себя супер-пупер-мега-программерами.[http://www.linux.org.ru/news/opensource/2133816#comment-2134635] | |||
== Положение в современном мире == | |||
[[Изображение:Cpp_professional.jpg|thumb|C++ профессионал смотрит на тебя как на...]] | |||
Серьёзный бизнес мало интересуют субъективные рассуждения школяров-задротов, наподобие изложенных выше, и поэтому на реальную роль С++ действуют совершенно иные факторы. А именно: | |||
# Переусложнённость, сочетание прямой работы с памятью с грязной реализацией ООП, что для новых проектов означает увеличенный бюджет и более высокий риск фейла. | |||
# Универсальность, никому как правило не нужная. | |||
# Большой объём уже написанного на С++ кода, который приходится поддерживать. | |||
# <s>Свежее мясо</s> Новых программистов обычно учат на этом языке и это именно тот язык, который они знают лучше всего. | |||
# Это по-прежнему весьма и весьма шустрый язык. | |||
== [[Луговский#Подражатели|Xenocephal]] == | |||
{{drama}} | |||
<!-- ребята, не спорьте с этим, это цит^H^H^H копипаста --> | |||
{{Цитата|width=auto|C++ — довольно таки примитивное, но монстровое поделие, полное исторически сложившихся нелепых нагромождений. Человек, который хорошо в нем ориентируется — это хорошее зубрилко, а не хороший программист. Умение героически преодолевать трудности, которые создает твой собственный инструмент, вместо того, чтобы решать непосредственно прикладную задачу, в современном мире ценится разве что только среди прыщавых сосок. Работодатель же это сомнительное умение не ценит, и совершенно справедливо. | |||
В общем, так: хороший программист обязан знать Си. Хороший программист может знать C++, но это не обязательно уже. Главное, чтоб C и C++ не были единственными доступными программисту инструментами — иначе это адски паршивый программист.|source=http://www.sql.ru/forum/actualthread.aspx?bid=16&tid=466654}} | |||
== См. также == | |||
* [[Быдлокодер]] | |||
* [[C|Няшня Сишка]] | |||
* [[Умение разбираться в чужом коде]] | |||
* [[Только закончил собирать]] | |||
* [[СПГС]] | |||
== Примечания == | |||
<references /> | |||
{{Шаблон:Языки программирования}} | |||
[[w:C++]] | |||
[[en.w:C++]] | |||
<!-- [[ae:C++]] redirects to C, lol--> | |||
Версия от 20:00, 10 ноября 2010
| — Bjarne Stroustrup | ||
С++ (си-плюс-плюс, cpp, сипипи, цепепе, The Programming Language) — язык программирования, который за минимальными исключениями знаком всем программистам, но которым пока никто полностью не овладел[1]. Создан Страуструпом с целью поднять зарплаты специалистов в индустрии, что, судя по всему, ему успешно удалось, так как по сложности изучения С++ превосходит все остальные промышленно используемые языки программирования. Первоначально представлял собой C + ООП + тележка разных прелестей. Ныне же, со всеми доработками и библиотеками, абсолютно всеобъемлющ, поэтому предположительно является языком, на котором Б-г написал Вселенную. Реализует все парадигмыШаблон:Lolwhat, включает в себя все технологииШаблон:Lolwhat, годен для любых целейШаблон:Lolwhat. Несмотря на это продолжает эволюционировать. При этом быдлокодеры находят в нём простоту и ясность, а гуру-программеры — сложность и глубину. Правда, ровно до тех пор, пока не увидят чужого кода, который, как правило, отличается от их собственного так же, как они сами от автора того кода. Кроме всего, C++ является вторым WW технофашизма, о чём громко говорит имя описывающего его стандарта: ANSI ISO/IEC 14882:1998.
Всё это безусловно доказывает безграничную многоликость Языка и выявляет его божественную природу.
Хелловорлды
Шаблон:NSFW Шаблон:NSFW Шаблон:NSFW
Как же так вышло
Сначала где-то в 60-70-х хз зачем[2], была придумана ересь под названием ООП. Уже тогда великий Дейкстра прочуял пиздец и отозвался о ней как об «исключительно плохой идее, которую могли придумать только в Калифорнии», но сделать ничего не мог, так как туча мозгоблудов тут же эту идею подхватили. Следствием этого стали многочисленные языки программирования, реализующие задумку. В начале 70-х гении, чьи имена я не буду упоминать всуе, создали Юникс и Це. Первое стало навсегда лучшей осью для серьёзных машин, а второе языком, на котором эта ось написана, и лучшим языком для системного программирования.
В начале 80-х некто Страуструп решил улучшить лучший язык программирования, а так как на слуху тогда было именно ООП, то он решил прикрутить к лучшему языку для системного программирования ООП[3], да так чтобы получившийся гибрид был совместим с Це. Зачем это ему понадобилось - непонятно[4], однако ему это удалось[5], причём скомпилированный код получался ненамного менее шустрым, чем у папочки Це. Когда Р-чи хотел внести в C очередную фичу, К-рниган говорил:
Если тебе нужен PL/1, ты знаешь, где его взять. Видимо, Страуструп не знал, где взять PL/1.
Но на это всем было б похуй, если б в тех же 80-х в мировой прогресс не вмешались ИБМ со своими персоналками. Внезапно, вместо однородных блоков числовых данных программам стало необходимо обрабатывать пёстрые массы офисной инфы, причём чуть ли не каждый кусочек её имел своё множество допустимых значений и требовал особого обхождения, что в переводе на компьютерный матан означает, что каждый такой кусочек имел свой тип данных. Когда же в начале 90-х на экранах персоналок замаячили окна и от программ потребовали ещё и гуёв, то профит от использования ООП стал очевидно прогнозируемым. С учётом невысоких тех. характеристик тогдашних машин, наиболее удачным решением выглядел переход на С++. Что и было массово осуществлено всей индустрией.
Далее, стремительно заполонив все ниши, С++ столкнулся с множеством проблем и вызовов. На вызовы он, проявляя чудеса гибкости и расширяемости, отвечал внедрением новых фич и возможностей, а на проблемы конечно забивал, непрерывно накапливая. Впрочем, большинство из них можно обойти, если знать как.
Шаблоны
Шаблоны являются ключевым элементом современного С++.
Преимущества шаблонов:
- Полны по Тьюрингу.
- Вычисляются на этапе компиляции, что, с учётом первого преимущества, позволяют добиться сколь угодно долгой сборки программы.
- Круче дженериков, что является важным аргументом в спорах C++ кодеров с их коллегами, пишущими на Java или C#.
- Позволяют в полной мере реализовать обобщённое программирование, функциональное программирование, объектно-ориентированное программирование, в общем все парадигмы, которые С++ как бы реализует.
- Круче макросов. Что оспаривается любителями C. Любители С++ же используют и то и другое в одном месте, и им мало.
- Boost состоит из шаблонов чуть более чем на семь четвёртых.
- STL состоит из шаблонов чуть менее чем полностью. Cтандартная библиотека шаблонов состоит из шаблонов чуть менее чем полностью
- Десятое правило Гринспена гласит: «Любая достаточно сложная программа на C или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp.» Шаблоны являются таким недолиспом, встроенным в язык C++.
Шаблон:NSFW Шаблон:NSFW Шаблон:NSFW
STL
«Алгоритмы + структуры данных = программы» — Н. Вирт.
А. Степанов когда-то придумал, что алгоритмы и структуры данных должны быть порознь. Идея посетила его светлую голову, когда он находился в состоянии бреда, вызванного отравлением то ли рыбой, то ли грибами. Тем не менее, с появлением С++ и шаблонов в нём, идея оказалась воплотима, и была разработана библиотека STL, позже вошедшая в Стандарт.
В качестве структур данных выступают 8 контейнеров, такие как массив, список, словарь, а в качестве алгоритмов — сотня какой-то непонятной хрени вроде lexicographical_compare и set_symmetric_difference.
Недостатки STL:
- Реализуется разработчиком компилятора, поэтому существует десяток реализаций, каждая со своими клопами.
- Содержит разрыв шаблона. Нормально, шаблон vector<T> — контейнер STL типа вектор, содержащий T. Но vector<bool> — ни разу не контейнер STL и никаких bool не содержит. Но всем абсолютно похуй, взамен юзают vector<char>.
- Множества и словари в STL сделаны не на хеш-таблицах, а с применением деревьев поиска, что обычно печально с точки зрения производительности.
- Громоздкое в использовании API из-за стремления к максимальной общности. Например, для получения значения по ключу из ассоциативного массива (без потенциального изменения состояния последнего) необходимо написать байт 200 кода. Для кого-то лечится макросами вроде BOOST_FOREACH и RANGE.
Некоторые из этих недостатков являются фатальными, а потому будут исправлены в С++0х, когда же он наконец выйдет.
По мере своего старения и уменьшения головного мозга, Александр Александрович полностью разочаровался не только в C++, но и в объектно-ориентированном программировании вообще, вот что он пишет про ООП: «Я уверен, что ООП методологически неверна. Она начинает с построения классов. Это как если бы математики начинали бы с аксиом. Но реально никто не начинает с аксиом, все начинают с доказательств. Только когда найден набор подходящих доказательств, лишь тогда на этой основе выводится аксиома. Т.е. в математике вы заканчиваете аксиомой. Тоже самое и с программированием: сначала вы должны начинать развивать алгоритмы, и только в конце этой работы приходите к тому, что вы в состоянии сформулировать четкие и непротиворечивые интерфейсы. Именно из-за этой неразберихи в ООП так популярен рефакторинг - из-за ущербности парадигмы вы просто обречены на переписывание программы, уже в тот самый момент, когда только задумали её спроектировать в ООП-стиле» (пруфлинк — Почему объектно-ориентированное программирование провалилось?)
Boost
Два C++ программиста, приняв пару стаканов вина, обсуждали разработку открытых библиотек, которые должны были бы содержать всё необходимое, не включенное в недавно вышедший Стандарт. Один из них упомянул, что Герб Саттер готовил пропозицию языка программирования Booze, который должен был быть лучше, чем Java. Смысл этой остроумной шутки в том, что java — сорт кофе, а booze — «бухло». Продолжением игры слов стало название «Boost» для набора открытых библиотек, куда на сегодняшний день вошли около сотни библиотек, а некоторые из них даже были запилены в будущий Стандарт (пруфлинк — FAQ буста).
Использование этого набора библиотек в промышленном коде является предметом споров, причём не только в форумах интернетов, но и IRL с заказчиком, начальником или коллегой. Консерваторам не очевиден профит применения проверенных решений вместо написания своих велосипедов, также их пугает размер и сложность буста. На первый взгляд, опасения кажутся небезосновательными — эта штука собирается полностью около часа на не самом слабом ПК и занимает несколько гигабайт в собранном виде со всеми либами во всех конфигурациях; многие библиотеки кажутся полными матана и возникают сомнения в способности быдлокодеров использовать их. На самом деле, вышеприведенные опасения — хуита, а поддержка своих велосипедов или написание «минималистичного» кода обходятся дороже.
Почему «быдлокодерский»
Многие аргументы в пользу принадлежности его к небыдлокодерским не выдерживают критики. Порог вхождения низок, фактически, каждую обезьянку, пишущую на Java или C-решетка можно заставить писать на С++. Тысячи возможностей выстрелить себе в ногу являются результатом совмещения высокоуровневых концепций ООП с более низкоуровневым языком С и говорят о продуманности дизайна С++[6]. Отсутствие сборки мусора[7] [8] говорит о том же самом[9], а ещё о том, что действительно кошерные лямбды прикрутить невозможно, те, что в с++0x — говно. (И да, никакие смартпоинтеры С++ не заменят настоящую сборку мусора).
С другой стороны, принадлежность его к быдлокодерским неоспорима. На нём написано большое количество программ большим количеством индусов. Если системный код Windows написан на C, то юзермодные свистелки и перделки, вроде IE, шелла, и прочие — чаще всего, с использованием С++.[10]Даже писать мышкой можно — для этого есть Борланд С-Быдлер. Достаточно знать 15 функций и хорошо манипулировать операторами if, while.
Тем не менее, на Topcoder'е среди участников в первом дивизионе доля пишущих на C++ существенно выше, чем во втором ([1], [2]), см. также как было с этим в 2003 году [3].
По мнению лоровского быдлокодера-аналитика, С++ — это наспех сколоченная волосатым ублюдком быдлоподелка под объектно-ориентированный язык, который с гиками и гаками приняли такие же Dynamic-Cast-быдло-ублюдочные создания со страусофилическими наклонностями, мнящие себя супер-пупер-мега-программерами.[4]
Положение в современном мире
Серьёзный бизнес мало интересуют субъективные рассуждения школяров-задротов, наподобие изложенных выше, и поэтому на реальную роль С++ действуют совершенно иные факторы. А именно:
- Переусложнённость, сочетание прямой работы с памятью с грязной реализацией ООП, что для новых проектов означает увеличенный бюджет и более высокий риск фейла.
- Универсальность, никому как правило не нужная.
- Большой объём уже написанного на С++ кода, который приходится поддерживать.
Свежее мясоНовых программистов обычно учат на этом языке и это именно тот язык, который они знают лучше всего.- Это по-прежнему весьма и весьма шустрый язык.
Xenocephal
См. также
Примечания
- ↑ Ибо 95%
- ↑ Какже-какже. Имитационное моделирование в терминах взаимодействующих объектов (Simula), событийный графический интерфейс, окошеджьки (Smalltalk). There were reasonz.
- ↑ Вообще-то, наоборот: он хотел поднять скорость Симулы до скорости Си.
- ↑ Со временем становится ясно, что человек просто хотел поднять своё имя до уровня К-рнигана и Р-чи. Он и сегодня пыжится, придумывая, чего бы ещё такого добавить в свой язык, человек просто компенсирует комплекс неполноценности. У C++ всегда будет свой комплекс.
- ↑ Ну почти. К сожалению, полная совместимость достигнута не была. Утешением может служить то, что такой совместимостью обладает язык Objective C, не менее быдлокодерский, и
не менееболее объектно-ориентированый, с динамической типизацией. - ↑ Хотя на самом деле они говорят о глупости оратора и только. Обратная совместимость с С была одним из ключевых пунктов в создании C++, делалось это, что бы привлечь программеров на C, которые в то время составляли 99% программерского рынка, a так же для того, что бы эти программеры свободно использовали свой готовый код на C, который в то время так же составлял 99% всего написанного кода вообще.
- ↑ Автор этого пункта сосет хуй, потому что С++ писался с языка Симула-67, который Страуструпа устраивал всем, за исключением низкой производительности, как раз из-за сборки мусора
- ↑ Автор нижеследующего пункта сосет хуй, ибо сам пункт основан ни на чём. Впрочем, автор этого пункта сосёт хуй дважды - один раз за необоснованный наезд, а второй за то, что притащил быдлокодерскую бредятину в статью. За подробностями в Обсуждение.
- ↑ Вообще-то, действительное понимание областей видимости объектов и знание правил автоматических вызовов конструкторов и деструкторов, позволяют не горевать особо о мусоросборщиках а-ля Жаба, экономят доступную память и увеличивают быстродействие программы. Правда, обладают этими действительными знанием и пониманием лишь около 5% кодеров на Це-плюсь-плюсе. Остальные 95 — ругаются с компилятором и говорят, что С++ «не работает».
- ↑ Довольно странный «неоспоримый» вывод. Может мне Кэп подскажет — на чем писать гуй, если не на плюсах? Только чур сидеть в консоли без свистелок или юзать ТруЪ С с его Г* (ну или скриптовый Tcl/Tk в купе с использующимся исключительно для программирования АйФонов Objective C) не предлагать. КО отвечает: пиши свой гуй на HTML, браузер есть везде, пусть бородатые дятьки за тебя позаботятся о портировании браузера, а ты его используй, web2.0 же.