Krótka historia C++
Pomysłodawcą i pierwszym implementatorem C++ jest Bjarne Stroustrup. Jeszcze przed uzyskaniem doktoratu w Cambridge sformułował wstępnie założenia pod wpływem kłopotów z pracą dyplomową, którą usiłował zrobić w Simuli (chwalił język, ale narzekał na aktualnie dostępną mu implementację), a w końcu zmuszony był sfinalizować w BCPL. Po podjęciu pracy w Bell Laboratories w AT&T zapoznawał się dokładnie z językiem C i – ze względu głównie na jego przenośność i niezależność od platformy – ustanowił podstawą jego "wyśnionego" języka.
Pierwsza jego koncepcja, znana jako "C z klasami" pojawiła się w roku 1979 (z tego okresu pochodzą Modula-2 i Smalltalk-80). Pierwotnym założeniem było stworzenie języka do programowania systemowego, który łączyłby właściwości obiektowe Simuli 67 z elastycznością i wydajnością języka C. Później zaczęto używać nazwy w rodzaju "nowy C" itp., co sprowadzało język C do określenia "stary C", będącego dość niefortunnym. Nazwa C++ została użyta pierwszy raz w grudniu 1983 roku, a zasugerował ją Rick Mascitti.
Bjarne Stroustrup [wym. `biarne strovstrup'; przytaczam dlatego, że podobno to jedno z najczęściej zadawanych mu pytań :)] długo już interesuje się filozofią i historią. W swojej książce pt. "Projektowanie i rozwój języka C++" przedstawiając swoją awersję do idealistów, którzy próbują uszczęśliwiać innych, wyjaśnia czym podyktowane są rozwiązania, jakie w C++ zastosowano. Z tego właśnie powodu język ten w założeniu miał być językiem, który "nie zmusza" użytkownika do robienia czegoś w ściśle określony sposób. Faktem jest jednak, że założenie to jest w wielu wypadkach niemal niemożliwe do uzyskania, a poza tym twórcy decydowali się często na zaimplementowanie i dobre wspieranie przez C++ tych właściwości, które oferują większą wydajność zarówno projektu jak i pracy nad projektem, raczej niż dobre wspieranie wszelkich możliwych technik programowania. Mimo tego C++ oferuje dużo różnych technik programowania, adekwatnych do różnych sytuacji. Jest językiem dużego wyboru, jednak w konsekwencji dla wielu ten wybór jest "za duży". Przez to krąży wśród ludzi opinia, że tego języka nie da się w pełni opanować.
Język C++ jest bezpośrednio bazowany na Simuli 67 i C, jednak na jego rozwój miało wpływ wiele języków programowania, m.in. "ojciec języków strukturalnych" Algol 68 (przeciążanie operatorów, referencje, dowolne miejsce dla deklaracji zmiennych), Ada (wzorce, wyjątki, przestrzenie nazw), ML i Clu (wyjątki). Języki takie jak Modula, Smalltalk i CLOS specjalnie nie wpłynęły na C++, stąd ich modele programowania i projektowania są całkiem odmienne.
Obecnie standardyzacją języka C++ zajmują się odpowiednie komitety ANSI i ISO. Standard ISO C++ istnieje na razie tylko jeden i powstał w 1998 roku (rok później w stosunku do ANSI C++). W ISO C++ dokonano dość sporej przebudowy C++ (wraz z zerwaniem definicyjnym ze zgodnością z wersją "ARM" [Annotated Reference Manual] C++), co wpłynęło zlekka na kwestię dotychczasowych programów. Różnie jednak wygląda kwestia zgodności kompilatorów z owymi standardami. Np. kompilator Visual C++ 5.0 z roku 1997 przestrzenie nazw ma dopiero po zaaplikowaniu odpowiedniego service-packa, ten jednak nadal nie honoruje dość znaczącej reguły, że zmienna deklarowana w pętli for należy do JEJ kontekstu, a nie do kontekstu wyżej (jest to więc tak pół jednego i pół drugiego standardu). Ten kompilator stanowczo odradzam nie tylko z uwagi na braki w implementacji (i udokumentowane błędy w plikach wynikowych!), ale głównie na totalnie dezinformujące komunikaty o błędach kompilacji (krótko mówiąc: kompilator mówi jaki ON ma problem, a nie jaki błąd być może zrobił użytkownik; odwrotnie jak gcc). Visual C++ 6.0 jest już mocno poprawiony w wielu kwestiach (co do "for", to można to ustawić, ale to może spowodować niekompilowalność niektórych bibliotek jak MFC), jednak każda wieloplatformowa biblioteka, która się chce dostosować do każdego kompilatora (jak np. Boost, czy Qt) zawsze w szczególny sposób traktuje Visual C++ 6.0 (5.0 z kolei w ogóle nie wspierają) informując, że "niektóre właściwości biblioteki tam nie są dostępne". Visual C++ zarówno 5 jak i 6 nie wspierają też niektórych najnowszych właściwości wzorców, jak częściowa specjalizacja (wspiera to dopiero Visual 7.1). Żaden ze znanych mi kompilatorów takoż nie honoruje słowa "export" (no, za wyjątkiem Comeau) dla wzorców (co jest – nie ukrywam – średnio przydatne, a bardzo trudne do zaimplementowania). Z kompilatorami Borlanda jest podobno mniej kłopotów (ale ich nie znam, więc się nie wypowiem). Jednym z najlepiej dopracowanych kompilatorów jest z kolei gcc, jednak posiada on dość trudny wybór: albo mocno zgodny ze standardem ISO C++ GCC 3.x, albo mniej więcej zgodne ze standardem ISO C++ GCC 2.95 i GCC 2.96. Te ostatnie mają taką wadę, że przestrzeń nazw std jest aliasem do przestrzeni globalnej, zatem będą chodzić programy, które używają std, ale nie będą takie które definiują symbole o tych samych nazwach, co istniejące w std (musieli tak zrobić, bo nie było czasu na zmiany w bibliotekach). GCC 2.96 jest troche lepiej zgodny, ma trochę poprawione komunikaty i dostarcza nagłówek <sstream>, czego nie ma w 2.95, jednak podobno jest to wersja rozwojowa, a więc mniej pewna. Natomiast gcc 3.0 choć jest lepiej zgodny ze standardem i bardziej restrykcyjny (zwłaszcza w bibliotekach standardowych), to jednak ok. 10 razy wolniej kompiluje i produkuje też mniej efektywny kod (choć niektórzy twierdzą, że w większości przypadków bardziej efektywny), zwłaszcza problemy optymalizacyjne ma przy mocnym korzystaniu ze wzorców. W chwili, gdy to piszę, gcc 3 jest wciąż rozwijany, więc pozostaje mieć nadzieję, że z tymi optymalizacjami będzie coraz lepiej.
Starałem się, aby ten dokument przedstawił C++ od najlepszej strony. Nie przeczę jednocześnie, że jestem dość niechętnie nastawiony do języka C. I to nie dlatego, żebym miał o nim złe zdanie; przeciwnie, uważam go za jedno z najlepszych osiągnięć informatyki. Uważam też jednocześnie, że czasy świetności ma on już dawno za sobą, a mnie irytuje głównie sposób, w jaki C++ jest traktowany przez środowiska długi czas ściśle związane z C (przede wszystkim użytkowników uniksów). Jak na razie zresztą język C nie wykazał żadnej przewagi nad C++ poza brakiem istnienia kompilatora C++ na konkretną platformę. Zaś co do przewagi C++ nad C to na wyjaśnienie tego i tej strony mało.