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.
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.
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:
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á.
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.
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ář