C++ bez cholesterolu: Przedmowa
Krótka historia C++
Pomysłodawcą i pierwszym implementorem 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'] 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ą uszczesliwiać 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
<stringstream>, 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. Za kilka lat na
pewno oczywiście będzie on lepszy, ale na razie nawet najnowsze dystrybucje
linuksa są wyposażone w obie wersje gcc.
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.
Wyszukiwarka
Podobne podstrony:
GRADIENT INTROIntrointroIntro (40)Appendices01 Introtcpip introintro1 Intro4 Intro to lg morph LECTURE2014intro 2social?onomy introMR 362 ESPACE INTRO33 ENVI Zoom IntroINTRO00 INTROmacierze introwięcej podobnych podstron