LINUXSOFT.cz Přeskoč levou lištu

ARCHIV



   

> C/C++ (31) - Jazyk C++, historie, charakteristika, vztah k C

Ve druhé části našeho seriálu se budeme věnovat C++. Dnes se stručně podíváme na vývoj jazyka, základní vlastrnosti a především jeho vztah k jazyku C. Napíšeme a přeložíme první program.

9.1.2006 06:00 | Jan Němec | Články autora | přečteno 28844×

Historie C++

C++ navrhl Bjarne Stroustrup. Příčinou byla jeho negativní zkušenost z disertační práce, jež obsahovala program v jazyce Simula. Tento (na svou dobu velmi moderní) objektově orientovaný jazyk mu umožnil efektivní analýzu problému a vývoj programu, ale pro použití na reálných datech byl příliš pomalý. Alternativu poskytovaly nižší jazyky, zejména BCPL - prapředek dnešního C. Ty byly dostatečně rychlé, ale neumožnily dostatečně přirozený návrh a tím i efektivní vývoj programu.

Později v Bellových laboratořích řešil Stroustrup podobný problém jako ve své disertační práci. Navrhl a implementoval proto jazyk, který měl být stejně efektivní a přenositelný jako C, umožnil vytváření knihoven, kombinování s jinými jazyky (C, Fortran, ...), ale zároveň měl obsahovat podporu pro objektově orientované programování. Tento jazyk se jmenoval C with Classes, umožnil do C přidat simulovské třídy a překládal se pomocí speciálního preprocesoru Cpre do čistého C. Důvodem byla především dostupnost a efektivita jazyka C, navíc nebylo nutné psát pro každou platformu zvlášť generátor kódu. V dalších verzích se nový jazyk přejmenoval na C++ a překladač na Cfront. Překladač byl postupně uvolněn pro školy, později vyšla i komerční verze. Zároveň s překladačem se podstatným způsobem vyvíjel i samotný jazyk, úpravami prošel návrh objektově orientovaného programování, přidaly se výjimky, šablony a prostory jmen. Neoficiální normou se stala kniha The C++ Annotated Reference Manual z roku 1990. Organizace ANSI a ISO začaly postupně vyvíjet standard. Jednotlivé verze návrhu standardu uvolňovaly, aby mohli výrobci překladačů implementovat změny. Standard byl schválen v roce 1998.

Dnes existuje celá řada překladačů, pro nás bude nejzajímavější podpora C++ v gcc, na Windows se nejčastěji setkáme s překladačem firmy Microsoft, případně Borland.

Co je v C++ nové

Kromě několika drobných omezení a poměrně málo významných rozšíření najdeme v C++ navíc především podporu objektově orientovaného programování (OOP), možnost psát šablony s nimiž můžeme nějakou funkci nebo třídu parametrizovat typem a zpracování chybových stavů pomocí výjimek. Za zmínku stojí také prostory jmen a přetěžování funkcí a operátorů. Nejdůležitější novou vlastností je určitě podpora OOP. Při správném návrhu vyvíjeného programu podle ideologie OOP je v C++ určitě menší riziko konfliktu identifikátorů, menší množství paměťových chyb typu n + 1 (vyvážené spoustou nových a stejně nebezpečných chyb spojených s OOP). Je-li vyvíjen program, který řeší problém, jež je už "od přírody" a nikoli násilným návrhem objektově orientovaný, pomůže v C++ OOP na úrovni syntaxe jazyka k čistšímu kódu méně náchylnému na chyby. Někteří lidí soudí, že používání výjimek v C++ zjednoduší (zlepší) oproti C zpracování chybových stavů.

Co je v C++ při starém

C++ se snaží být s C v maximální rozumné míře zpětně kompatibilní, takže většina dobrých vlastností a problémů C se přenáší i do C++. Záleží ovšem na stylu práce programátora. I C++ umožňuje víceméně přímý přístup do paměti bez omezení, ale správně použité OOP poskytuje oproti C vyšší formu abstrakce nad pamětí jako polem bytů, takže riziko paměťových chyb je přeci jen trochu menší.

C++ sice má i vlastní standardní knihovnu (a rovněž celá řada jiných, především GUI knihoven je určena výhradně pro C++), ale běžně se používá také standardní knihovna jazyka C a podobná sada ostatních knihoven. I zde tedy znalosti C využijeme.

Vztah mezi C a C++

Jazyk C++ vznikl především převzetím jazyka C, z o něco menší části přidáním nových možností, a úplně nejméně omezeními a změnami jiného druhu. V případě omezení se vždy jedná o nějakou vlastnost jazyka C, jejíž využívání je považované za špatný programátorský návyk.

Ohledně přenositelnosti na úrovni zdrojového kódu z toho vyplývá následující:

  • Rozumně napsaný program v C půjde přeložit i překladačem C++.
  • Je možné napsat program v C, který překladačem C++ přeložit nepůjde.
  • "Správně" napsaný program v C++ nepůjde přeložit překladačem C.
  • Je možné napsat program v C++, který překladačem C přeložit půjde.

Je také možné v jednom projektu oba jazyky na binární úrovni kombinovat a spojovat přeložený kód, kde na některé zdrojové soubory použijeme překladač C a na jiné C++. To je běžné především, pokud v projektu napsaném v C++ potřebujeme nějakou knihovnu v C. Máme-li celý kód pod kontrolou a pouze v části chceme použít možnosti C++, je obvykle (tj. zejména pokud nechceme C část použít i v nějakém jiném projektu) lepší použít překladač C++ i na zbytek projektu, i kdyby šel přeložit jako C. V jednom ze závěrečných dílů si ukážeme, jak se kód spojuje. Jednodušší je z C++ volat C, ale jde to i naopak.

Někteří lidé se vyjadřují dosti nepřesně, takže pokud uslyšíte, že je program napsaný v céčku a máte pochybnosti, je vždy lepší se zeptat, zda je míněno čisté C nebo C++. Setkáme se s tím zejména u lidí neznalých (podobně, jako se záměnou Javy a JavaScriptu), ale bohužel běžně i u zkušených C++ programátorů, které často ani nenapadne, že by někdo mohl psát v C.

Kdy použít C a kdy C++

C použijeme zpravidla, pokud

  • Vlastnosti C++ nepotřebujeme.
  • Jde nám o přenositelnost a na jedné z cílových platforem není C++.
  • Chceme mít program víc pod kontrolou.
  • Je pro nás kriticky důležitá rychlost a nenáročnost programu.
  • Píšeme ovladač, operační systém a podobně.
  • Píšeme knihovnu k použití z C i C++.

První bod je zřejmý. Pokud v obou jazycích napíšeme program se stejnou námahou, zpravidla sáhneme po čistém C, neboť má s přenositelností ještě menší problémy než C++ a ještě lepší dostupnost překladačů. S tím souvisí i druhý bod. Jazyk C má tu výhodu, že jeho kód je poměrně jasný, je zřejmé, co jaký příkaz nebo řídící struktura provádějí na úrovni asembleru (když nepočítám optimalizace překladače). Runtime podpora je jednoduchá, nehrozí například alokace paměti v místech, kde to programátor neočekává a podobně. Každého céčkaře pobaví historky z Javy, kdy "došla paměť kvůli garbage collectoru". Program napsaný v C je tak dobrý, jak dobrý je jeho programátor, zatímco C++ má přeci jenom o krok blíž vyšším jazykům. Díky tomu je C stále hlavní (a v některých případech i jediný možný) jazyk pro ovladače, operační systémy a podobně. C rozhraní je široce podporováno nejrůznějšími jazyky, operačními systémy, databázemi a podobně, navíc C se z C++ volá snadněji než naopak. Proto nejrůznější knihovny určené k co nejširšímu použití (s výjimkou GUI, kde je objektově orientovaní programování velmi přirozené) bývají obvykle napsané v C nebo alespoň mají C rozhraní.

C++ použijeme zpravidla, pokud

  • Potřebujeme (nebo chceme) objektově orientované programování, například GUI, simulace, datové struktury...
  • Chceme využívat další vlastnosti jazyka C++, hlavně šablony, výjimky, prostory jmen...
  • Chceme využívat C++ knihovnu, hlavně hotové datové struktury.
  • Jsme k C++ přinuceni knihovnou 3. strany, například Qt.

První program

Vytvořte soubor program.cpp a zapište do něj

#include <stdio.h>

int main(void) {  
  puts("Ahoj světe");
  return 0;
}

nebo, pokud je pro vás čistota návrhu v duchu C++ OOP důležitější než okamžité vysvětlení, raději

#include <iostream>

int main(void) {  
  std::cout << "Ahoj světe" << std::endl;
  return 0;
}

Zdrojový kód přeložte

$ g++ program.cpp -o program

a spusťte

$ ./program

Pokud vám to přijde moc jednoduché, můžete si zkusit přeložit libovolný z příkladů předchozích dílů jako C++, aspoň si ověříte, že slušně napsaný kód v C jde přeložit i pomocí překladače C++. Důležité je volat g++ místo gcc a také přípona souboru. Zde bohužel není jednotná konvence, běžně se používá cpp (hlavně ve světě KDE, Qt, DOSu a Windows), setkáme se však také s cc, cxx nebo C. Ta poslední je tak trochu na truc uživatelům nejmenovaných operačních systémů, které nerozlišují velikost písmen v názvech souboru.

Pokračování příště

Příště si ukážeme drobná omezení C++ oproti C a některá méně významná vylepšení.

Verze pro tisk

pridej.cz

 

DISKUZE

typová kontrola 9.1.2006 10:55 camlost
|- Re: typová kontrola 9.1.2006 11:12 Jan Němec
L Re: typová kontrola 18.1.2006 11:46 elviin
GUI a OOP 9.1.2006 12:19 Johann von Nepomuk
|- Re: GUI a OOP 9.1.2006 15:37 Jan Němec
L Re: GUI a OOP 18.1.2006 11:48 elviin
Vyhody a nevyhody 9.1.2006 13:10 Aleš Hakl
L Re: Vyhody a nevyhody 10.1.2006 07:49 MaReK Olšavský
  |- Re: Vyhody a nevyhody 10.1.2006 08:04 Jan Němec
  | L Re: Vyhody a nevyhody 10.1.2006 10:02 MaReK Olšavský
  L Re: Vyhody a nevyhody 10.1.2006 15:37 Aleš Hakl
Re: Píšeme knihovnu k použití z C i C++. 15.1.2006 20:06 Ondřej Surý
Pekny clanek! 18.1.2006 12:02 elviin
c versus c++ 28.1.2006 12:32 KinDo




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

28.11.2018 23:56 /František Kučera
Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1

12.11.2018 21:28 /Redakce Linuxsoft.cz
22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář

6.11.2018 2:04 /František Kučera
Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář

4.10.2018 21:30 /Ondřej Čečák
LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář

18.9.2018 23:30 /František Kučera
Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář

9.9.2018 14:15 /Redakce Linuxsoft.cz
20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business. Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář

12.8.2018 16:58 /František Kučera
Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář

16.7.2018 1:05 /František Kučera
Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

31.7.2023 14:13 / Linda Graham
iPhone Services

30.11.2022 9:32 / Kyle McDermott
Hosting download unavailable

13.12.2018 10:57 / Jan Mareš
Re: zavináč

2.12.2018 23:56 / František Kučera
Sraz

5.10.2018 17:12 / Jakub Kuljovsky
Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2024) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze