Jste zde

Méně známé skutečnosti o C a C++: C není jen ANSI C a C++ není jen C++98

Tímto zahajuji další "seriál" týkající se jazyků C a C++. Chtěl bych v něm upozornit na některé skutečnosti, které si ne každý uvědomuje a také některé vlastnosti těchto jazyků, které nejsou příliš známé a nebo se jejich důležitost podceňuje, což mnohdy může vést k nečekaným problémům. Objeví se zde určitě i zajímavé vlastnosti či konstrukce a využití těchto jazyků, o kterých se obecně neví, že něco takového je v těchto jazycích možné. Dneska bych se chtěl podívat na standardy (a "standardy") těchto jazyků a jejich použití při zadávání projektů či zakázek, takže si trochu povrtáme v historii.

Co mě k tomuto tématu vedlo aneb "Projekt vypracujte v ANSI C"

Poměrně často (více než by si přál) se setkávám s tím, že lidé nerozlišují jednotlivé jazykové standardy. Např. v prezentacích či v zadávaných projektech se standardy velice často zmiňují, ale ne vždy správně - nedávno nám byl ve škole zadán projekt z oblasti počítačových sítí a v zadání bylo zmíněno: "implementační jazyk ANSI C nebo C++". V jedné diskusi ovšem zadavatel napsal, že "jazyk C můžete použít obecně, nemusíte se omezovat na ANSI C". Tak proč tedy v zadání bylo požadováno vypracování projektu podle ANSI C?

Jiná situace nastává, pokud dotyčný některý ze standardů zmíní, např. v souvislosti s tím, že určitý překladač pro určitý mikrokontrolér podporuje určitý standard. Problémem zde ovšem je, že málokdy se stane, že by daný překladač podporoval kompletně celý standard. Ani mnohé překladače pro masové architektury, jako např. x86 bezesporu je, mnohdy neimplementují celý standard (např. ani gcc neimplementuje celý C99 standard). Co by se tedy podle mě slušelo zmínit, je to, že daný překladač nepodporuje daný standard zcela a (v případě překladačů pro mikrokontroléry) že i některé normálně běžné konstrukce se nemusí podařit přeložit.

Ok, tak jak to teda je?

Je třeba si uvědomit, že existují určité standardy (a "standardy") daných jazyků. Zabrousíme nyní do historie jednotlivých jazyků a začneme jazykem C:

  • Období před standardizací jazyka (< 1989, K&R C) - před tím, než byl jazyk C vůbec standardizován, tak bylo za "standard" považováno tzv. "C podle Kernighana a Ritchieho", které bylo popsáno v prvním vydání knihy The C Programming Language. I v dnešní době můžete nalézt kód psaný podle tohoto "standardu".
  • 1989, C89 - tento standard je běžně označován jako ANSI C a jednalo se o první standard pro jazyk C. Tento standard byl o rok později adoptován organizací ISO a vznikl standard ISO/IEC 9899:1990, označovaný jako C90, který je ale (kromě menších modifikací) stejný jako C89 a tudíž lze C89 a C90 volně zaměňovat.
  • 1999, C99 - zatím poslední standard jazyka C, který byl standardizován organizací ISO v roce 1999 jako ISO/IEC 9899:1999, který byl následně adoptován organizací ANSI (i přesto se pod "ANSI C" obecně míní standard C89, nikoliv C99). Občas se o tomto standardu mluví jako o ISO C.
  • ?, C1x - od roku 2007 probíhají přípravy na další standard jazyka C, pracovně označovaný jako C1x.

Kromě těchto standardů existuje plno dialektů a rozšíření, většinou jako rozšíření překladačů, např. gnu89 a gnu99, která ovšem (jelikož tato rozšiření nebyla standardizována) nemusí být přenositelná.

U C++ to vypadá následovně:

  • Období před první standardizací (< 1998) - podobně jako u jazyka C, tak před první standardizací byla "standardem" kniha The C++ Programming Language napsaná autorem jazyka C++, Bjarnem Stroustrupem.
  • 1998, C++98 - zatím jediný (a poslední) standard jazyka C++, který byl standardizován v roce 1998 ANSI–ISO (ISO/IEC 14882:1998). V roce 2003 proběhla oprava (na základě tzv. "defect reportů") tohoto standardu, ovšem tato oprava se nijak nerozlišuje od vlastního standardu C++98 a bere se jako c++98 standard. Dále v roce 2005 vznikl Technical Report 1 (TR1), což jsou rozšíření standardu C++98 o vlastnosti připravované pro nový standard C++0x či o vlastnosti přejaté z C99 (jen poznamenám, že C99 obsahuje vlastnosti, které v C++98 vůbec nejsou). Tyto vlastnosti sice nejsou součástí žádného standardu, ale mnoho překladačů je (ve větší či menší míře) implementuje.
  • ?, C++0x - v současné době probíhá dokončování vytvoření nového standardu, pracovně ozačovaného jako C++0x (očekává se, že by tento standard měl "vyjít" v roce 2009 a tudíž se bude jmenovat C++09). Některé překladače již něco z tohoto standardu podporují (např. GCC).

Podobně jako v případě C, opět existují různá rozšíření dodávaná výrobci překladačů, např. gnu++98. Někdy se ještě lze setkat s verzováním C++ podle verze překladače C Front, což byl první překladač pro jazyk C++, který fungoval tak, že překládal kód z jazyka C++ do jazyka C a ten byl následně kompilován klasickým céčkovým překladačem.

Závěr aneb jak by to podle mě mělo vypadat

Jak vidíme, tak pro tyto jazyky existuje celá řada standardů a jejich označení. Pokud tedy někdo chce hovořit o jazyku obecně (bez vázání na určitý standard), tak by měl mluvit o "jazyce C" a "jazyce C++", což může ve výsledku znamenat třeba i "jazyk C podle C99 včetně GNU a POSIXových rozšíření". Pokud už někde zmíní určitý standard (např. vyžaduje vypracování projektu podle určitého standardu), tak by to tak vážně měl myslet. Vcelku veselou historku zmiňuje M. Virius v závěru poslední kapitoly své knihy Pasti a propasti C++ :).

Co říkáte na toto téma vy? Vadí vám podobné "úlety", způsobené neznalostí existence jednotlivých jazykových standardů, nebo je vám to jedno? :) Podělte se o svůj názor v diskusi.

Přidat komentář