Štítky: Historie normalizace C, ANSI C, ISO C, C99, C11, ISO/IEC C, C.

Origins

C a je „spin-off product“ odvozeným od vytvoření operačního systému UNIX, který byl vyvinut v Bell Laboratories Kenem Thompsonem, Denisem Ritchiem a spol. Thompson sám napsal původní verzi UNIXu, který běžel na DEC PDP-7, jednom z prvních minipočítačů s pouze 8000 slovy hlavní paměti (koneckonců byl rok 1969).

Stejně jako ostatní operační systémy té doby byl UNIX napsán v jazyce symbolických instrukcí. Ladění programů v assembleru je skutečná bolest a je těžké ho zlepšit a UNIX nebyl výjimkou. Thompson se rozhodl, že k dalšímu vývoji operačního systému je zapotřebí jazyk vysoká úroveň a přišel s malým jazykem B. Thompson jej založil na jazyku BCPL, jazyku pro programování systému, vyvinuté v polovině 60. let. BCPL zase pochází z ALGOL 60, jednoho z nejstarších (a nejvlivnějších) jazyků.

Ritchie se brzy připojil k projektu UNIX a začal psát v B. V roce 1970 zakoupily Bell Labs pro projekt PDP-11. Protože B bylo připraveno běžet na PDP-11, Thompson přepsal část UNIXu na B. V roce 1971 se ukázalo, že B není tak docela vhodný pro PDP-11, takže Ritchie začal vytvářet rozšířenou verzi B. nazval to NB (New B), ale když se jazyk velmi lišil od jazyka B, název byl změněn na C. V roce 1973 se jazyk stal dostatečně stabilním, aby do něj mohl být přepsán UNIX. Přechod na C poskytl důležitou výhodu: přenositelnost. Napsáním kompilátoru C pro každý ze strojů v Bell Labs by na ně vývojový tým mohl portovat UNIX.

Standardizace

C se dále vyvíjelo v 70. letech, zejména mezi lety 1977 a 1979, kdy byla vydána první kniha o C. Programovací jazyk C, který napsali Brian Kernighan a Denis Ritchie a který byl vydán v roce 1978, se stal biblí programátorů v jazyce C. Vzhledem k absenci oficiálního standardu se tato kniha – známá také jako K&R nebo „Bílá kniha“, jak ji fanoušci C rádi nazývají – stala de facto standardem. V 70. letech bylo málo programátorů C a většina z nich byli uživatelé UNIXu. V 80. letech však C expandovalo za úzké hranice světa UNIXu. Kompilátory jazyka C se staly dostupnými na různých počítačích s různými operačními systémy. Zejména C se začalo šířit na rychle se rozvíjející platformě IBM PC.

Spolu s nárůstem popularity přišly problémy. Programátoři, kteří napsali nové kompilátory, vzali za základ jazyk popsaný v K&R. Bohužel v K&R byly některé rysy jazyka popsány vágně, takže je kompilátoři často interpretovali podle vlastního uvážení. Kniha navíc jasně nerozlišovala mezi tím, co je vlastnost jazyka a co je vlastnost operačního systému UNIX. Situaci ještě zhoršilo, že po zveřejnění K&R se C dále vyvíjelo: byly do něj přidány nové funkce a staré byly z něj vyříznuty. Brzy byla zjevná potřeba komplexního, přesného a moderního popisu jazyka. Bez takové normy se začaly objevovat dialekty jazyka, které narušovaly přenositelnost – největší sílu jazyka.

Vývoj amerického standardu C začal v roce 1983 pod záštitou American National Standards Institute (ANSI). Po mnoha revizích byla norma dokončena v roce 1988 a formálně přijata v prosinci 1989 jako ANSI X3.159-1989. V roce 1990 byl schválen Mezinárodní organizací pro normalizaci (ISO) jako mezinárodní norma ISO/IEC 9899:1990. Tato verze jazyka se obvykle nazývá C89 nebo C90, aby nedošlo k záměně s původní verzí C, která se obvykle nazývá K&R C.

Jazyk prošel drobnými změnami v roce 1995 (změny jsou popsány v dokumentu běžně nazývaném dodatek 1). K významnějším změnám došlo v roce 1999, kdy byla vydána norma ISO/IEC 9899:1999. Jazyk popsaný v této normě se obvykle nazývá C99. Termíny "ANSI C", "ANSI/ISO C" a "ISO C", kdysi používané k popisu C99, mají dva významy kvůli existenci dvou norem.

V roce 2011 byl spolu s revizí jazyka C++ vydán standard C11. Navzdory existenci standardu '11 mnoho kompilátorů stále plně nepodporuje ani verze C99, takže použití standardu C11 bude výslovně uvedeno.

Když vaše pověst pracuje pro váš zisk

Řízení komunity

Vytvoření tónu hlasu. Rychlé zpracování negativních i pozitivních komentářů jménem značky. Řízení komunikace podle zadaných scénářů. Překlad problematické problematiky zákazníkovi.

Agenti vlivu

Vytváření a implementace „virtuálů“ na fórech a v v sociálních sítích. Existuje databáze upgradovaných a živých účtů na více než 300 stránkách.

Práce s recenzemi

Psaní, koordinace a zveřejňování recenzí o značce na nejlepších platformách a webech s recenzemi. Zpracování a překrytí negativních komentářů pozitivními. Jako výsledek Výsledky vyhledávání negativita je postupně nahrazována.

Monitorování sociálních sítí

Práce se systémy Youscan, IQbuzz, Brand Analytics. Kontrola zmínek o značce. Identifikovat klíčové poznatky a rychle reagovat na negativitu. Nepostradatelný nástroj pro ovládání zpětná vazba od klientů.

Analytika a výzkum

Analýza informační pole, průzkum kategorie produktů a hlavních konkurentů značky. Tento nástroj pokrývá úkoly od sledování reputace a marketingu v reálném čase až po hloubkový průzkum.

SERM

Podrobná analýza výsledky vyhledávání pro vybraná klíčová slova. Sbírání referencí o klientovi na sociálních sítích, fórech a zpravodajských webech. Vypracování strategie pro nakládání s negativními informacemi. Klient obdrží plně kontrolované doručení v TOP10.

Jaký je důvod tohoto stavu jazyka C? Historicky je tento jazyk neoddělitelný od operačního systému Unix, který nyní zažívá své znovuzrození. 60. léta byla érou formování operačních systémů a programovacích jazyků na vysoké úrovni. V té době byly OS a kompilátory vyvíjeny samostatně pro každý typ počítače a často i vlastní programovací jazyky (vzpomeňme například PL/I). Současně se již stala zřejmou shodnost problémů, které v tomto případě vznikají. Reakcí na povědomí o této podobnosti byl pokus vytvořit univerzální mobil operační systém, a k tomu jsme potřebovali stejně univerzální a mobilní jazyk programování. Takovým jazykem se stal jazyk C a Unix se stal prvním operačním systémem napsaným téměř výhradně v jazyce vysoké úrovně.

Úzké spojení s Unixem dalo jazyku C testovací půdu, kterou v té době žádný jiný jazyk neměl. Problémy s programováním systémů byly právem považovány za nejobtížnější v tehdejším průmyslu. Většinou byly natolik strojově závislé, že mnohé ani nenapadlo je řešit jinak než v assembleru. Jazyky na vysoké úrovni byly určeny pro programování aplikací a implementovaly pouze velmi omezené funkce nutné pro systémová práce a často jen pro určitý typ stroje.

Jazyk C byl od počátku vytvořen tak, aby se v něm daly psát systémové úlohy. Tvůrci jazyka C nevyvinuli abstraktní model jazykového exekutoru, ale jednoduše do něj implementovali ty schopnosti, které byly nejvíce potřeba v praxi programování systému. Jednalo se především o prostředky přímé práce s pamětí, strukturní řídicí struktury a modulární organizaci programu. A v podstatě nic jiného do jazyka zahrnuto nebylo. Vše ostatní bylo uloženo do runtime knihovny. Proto kritici někdy označují jazyk C jako strukturální assembler. Ale bez ohledu na to, co řekli, přístup se ukázal jako velmi úspěšný. Díky němu bylo dosaženo nové úrovně v jednoduchosti a jazykových možnostech.

Je tu však ještě jeden faktor, který určoval úspěch jazyka. Tvůrci v něm velmi umně oddělili strojově závislé a nezávislé vlastnosti. Díky tomu lze většinu programů psát univerzálně – jejich výkon nezávisí na architektuře procesoru a paměti. Několik hardwarově závislých částí kódu lze lokalizovat jednotlivé moduly. A pomocí preprocesoru můžete vytvářet moduly, které po zkompilování různé platformy vygeneruje odpovídající strojově závislý kód.

Mnoho kontroverzí vyvolala syntaxe jazyka C. Techniky zkracování, které se v něm používají, mohou způsobit, že program bude zcela nečitelný. Ale jak řekl Dijkstra, prostředky nenesou vinu za to, že jsou používány negramotně. Ve skutečnosti syntaktické zkratky navržené v C odpovídají nejčastějším stereotypním situacím v praxi. Pokud zkratky považujeme za idiomy pro expresivní a kompaktní podání takových situací, pak se jejich přínos stává bezpodmínečným a zřejmým.

C se tedy objevilo jako univerzální systémový programovací jazyk. V těchto mezích ale nezůstal. Koncem 80. let si jazyk C, který vytlačil Fortran z jeho vedoucí pozice, získal masivní oblibu mezi programátory po celém světě a začal být používán v široké škále aplikovaných úloh. Významnou roli zde sehrálo rozšíření Unixu (a potažmo C) v univerzitním prostředí, kde se školila nová generace programátorů.

Jako všechny jazyky, i C byl postupně vylepšován, ale většina vylepšení nebyla radikální. Za nejvýznamnější z nich je snad třeba považovat zavedení přísné specifikace typů funkcí, která výrazně zvýšila spolehlivost mezimodulové komunikace v C. Všechna taková vylepšení byla v roce 1989 zakotvena ve standardu ANSI, který dodnes definuje jazyk C.

Ale když je všechno tak růžové, proč se tedy všechny ostatní jazyky nadále používají, což podporuje jejich existenci? Achillovou patou jazyka C bylo, že se ukázal být příliš nízkoúrovňový pro úkoly, které byly na pořad dne v 90. letech. Navíc tento problém má dva aspekty. Na jedné straně byly do jazyka zabudovány příliš nízkoúrovňové nástroje – především správa paměti a aritmetika adres. Ne nadarmo má změna bitové kapacity procesorů velmi bolestivý vliv na mnoho programů C. Na druhou stranu C postrádá funkce na vysoké úrovni – abstraktní datové typy a objekty, polymorfismus, zpracování výjimek. Výsledkem je, že v programech C často dominuje technika implementace úlohy v jejím obsahu.

První pokusy o nápravu těchto nedostatků se začaly objevovat na počátku 80. let. Už tehdy Bjarne Stroustrup z AT&T Bell Labs začal vyvíjet rozšíření jazyka C pod kódovým označením. Styl vývoje byl zcela v souladu s duchem, ve kterém byl vytvořen samotný jazyk C - byly do něj zavedeny určité funkce, aby bylo pohodlná práce konkrétní lidi a skupiny. První komerční překladač nového jazyka s názvem C++ se objevil v roce 1983. Byl to preprocesor, který přeložil program do kódu C. Za skutečný zrod jazyka však lze považovat vydání Stroustrupovy knihy v roce 1985. Od tohoto okamžiku si C++ začalo získávat celosvětovou popularitu.

Hlavní inovací C++ je mechanismus tříd, který umožňuje definovat a používat nové datové typy. Programátor popisuje vnitřní reprezentaci objektu třídy a sadu funkčních metod pro přístup k této reprezentaci. Jedním z oblíbených cílů při vytváření C++ byla touha zvýšit procento opětovného použití již napsaného kódu. Koncept tříd k tomu nabízel mechanismus dědičnosti. Dědičnost umožňuje vytvářet nové (odvozené) třídy s rozšířenou reprezentací a upravenými metodami, aniž by to ovlivnilo zkompilovaný kód původních (základních) tříd. Dědičnost zároveň poskytuje jeden z mechanismů pro implementaci polymorfismu - základního konceptu objektově orientovaného programování, podle kterého provádět stejný typ zpracování odlišné typy dat lze použít stejný kód. Polymorfismus je ve skutečnosti také jednou z metod pro zajištění opětovného použití kódu.

Zavedením tříd nejsou vyčerpány všechny inovace jazyka C++. Implementuje plnohodnotný strukturovaný mechanismus zpracování výjimek, jehož absence v C značně ztížila psaní spolehlivých programů, mechanismus šablon – sofistikovaný mechanismus generování maker hluboce zabudovaný do jazyka, otevírající další cestu k opětovnému použití kódu, a mnohem víc.

Obecná linie vývoje jazyka tedy směřovala k rozšiřování jeho schopností zaváděním nových konstrukcí na vysoké úrovni při zachování co nejúplnější kompatibility s ANSI C. Samozřejmě pokračoval i boj o zvýšení úrovně jazyka druhá fronta - stejné třídy umožňují kompetentním přístupem skrýt nízkoúrovňové operace, takže programátor vlastně přestane pracovat přímo s pamětí a entitami závislými na systému. Jazyk však neobsahuje mechanismy, které nutí vývojáře program správně strukturovat, a autoři nevydali žádná systematická doporučení pro použití jeho dosti sofistikovaných konstrukcí. Také se včas nepostarali o vytvoření standardní knihovny tříd, která implementuje nejčastěji se vyskytující datové struktury.

To vše vedlo k tomu, že mnoho vývojářů bylo nuceno prozkoumat labyrinty lingvistické sémantiky sami a samostatně najít úspěšně fungující idiomy. Například v první fázi vývoje jazyka se mnoho tvůrců knihoven tříd snažilo vybudovat jedinou hierarchii tříd se společnou základní třídou Object. Tato myšlenka byla vypůjčena ze Smalltalku, jednoho z nejznámějších objektově orientovaných jazyků. Ukázalo se však, že v C++ je to zcela neživotaschopné – pečlivě navržené hierarchie knihoven tříd se ukázaly jako nepružné a práce tříd nebyla zřejmá. Aby byly knihovny tříd použitelné, musely být dodány ve zdrojovém kódu.

Vznik šablonových tříd tento směr vývoje zcela vyvrátil. Dědičnost se začala používat pouze v případech, kdy bylo nutné vygenerovat specializovanou verzi existující třídy. Knihovny se začaly skládat ze samostatných tříd a malých nesouvisejících hierarchií. Na této cestě však opětovné použití kódu začalo klesat, protože v C++ je polymorfní použití tříd z nezávislých hierarchií nemožné. Široké používání šablon vede k nepřijatelnému nárůstu objemu kompilovaného kódu – nezapomínejme, že šablony jsou implementovány pomocí makrogeneračních metod.

Jedním z nejzávažnějších nedostatků C++, který zdědil ze syntaxe C, je schopnost kompilátoru popsat vnitřní strukturu všech použitých tříd. V důsledku toho změna vnitřní struktury reprezentace třídy knihovny vede k nutnosti překompilovat všechny programy, kde se tato knihovna používá. To značně omezuje vývojáře knihoven z hlediska jejich modernizace, protože při vydání nová verze, musí zůstat binárně kompatibilní s předchozím. Právě tento problém vede mnoho odborníků k domněnce, že C++ není vhodné pro provozování velkých a velmi velkých projektů.

A přesto i přes vyjmenované nedostatky a dokonce i nedostupnost jazykového standardu (to je po více než patnácti letech používání!) zůstává C++ jedním z nejoblíbenějších programovacích jazyků. Jeho síla spočívá především v téměř úplné kompatibilitě s jazykem C. Díky tomu mají programátoři v C++ přístup ke všemu vývoji v C. Přitom C++ i bez použití tříd přináší řadu takto důležitých věci pro C další funkce a vymoženosti, které mnozí používají jednoduše jako vylepšené S.

Pokud jde o objektový model C++, pak pokud se váš program nestane příliš velkým (stovky tisíc řádků), je docela možné jej používat. Nedávný trend přechodu na komponentové software jen posiluje pozici C++. Při vývoji jednotlivých komponent se ještě neprojevují nedostatky C++ a propojování komponent do fungujícího systému se již nedělá na jazykové úrovni, ale na úrovni operačního systému.

Ve světle všeho, co bylo řečeno, vyhlídky pro C++ nevypadají chmurně. I když nebude mít monopol na trhu programovacích jazyků. Snad jediné, co můžeme s jistotou říci, je, že další modernizaci-rozšíření tento jazyk nepřežije. Ne nadarmo, když se objevila Java, získala tak velkou pozornost. Jazyk, který je syntaxí blízký C++, a proto se mnohým programátorům zdá známý, byl ušetřen nejkřiklavějších nedostatků C++, zděděných ze 70. let. Zdá se však, že Java nesplňuje roli, kterou jí někteří lidé přiřadili.

Díky speciální roli jazyků C/C++ v moderním programování je prakticky bezvýznamné uvádět konkrétní adresy na internetu, kde k nim můžete najít materiály. Takových míst je prostě příliš mnoho. Pokud se však chcete dozvědět více o vývoji C++, začněte tímto krátkým článkem http://citforum.syzran.ru/programming/prg96/76.shtml.

Alexandr Sergejev, [e-mail chráněný]
Článek z časopisu BYTE/Russia, březen 2000

Abychom názorně demonstrovali použití popsaných jazyků v praxi, zvolili jsme úlohu, ve které bylo nutné zadat řadu celých čísel ze standardního vstupu nebo ze souboru a poté vypsat pouze ta lichá v opačném pořadí. . Toto je jeden z nejjednodušších problémů, který k vyřešení v podstatě vyžaduje práci s poli, smyčkami, větvením a I/O, a také umožňuje demonstrovat volání podprogramů. Zároveň je viditelný a snadno vnímatelný.

Výpis 1. C

1 #zahrnout /* Připojení I/O funkcí */ 2 3 void main(void) 4 ( 5 int M; /* Pole 10 celých čísel, počítáno od 0 */ 6 int N; 7 pro (N=0; N<10; ++N) /* Вводим не более 10 чисел */ 8 if (EOF == scanf ("%d, M+N)) 9 break; /* Если конец файла, прерываем цикл */ 10 11 for (-N; N>=0; --N) /* Pole procházíme obráceně */ 12 if (M[N]%2) /* pořadí a tiskneme liché */ 13 printf("%d\n", M[N]); 14)

  • Řádek 3 V C/C++ spuštění programu vždy začíná hlavní funkcí.
  • Linky 7 a 11. V záhlaví smyčky je uvedeno počáteční nastavení, podmínka pokračování a pravidlo pro přepočet parametru smyčky oddělené středníky. Operace ++ A -/- - nejznámější zkratky jazyka C znamenající přírůstek a úbytek proměnné, tedy zvýšení a snížení její hodnoty o jedničku.
  • Řádek 8. Funkce scanf zadává podle formátu určeného prvním parametrem hodnoty proměnných, jejichž adresy jsou určeny zbývajícími parametry. Zde se adresa, do které se zadává hodnota, vypočítá pomocí aritmetiky adresy na adresu umístění pole M posun je přidán o N Prvky. Stejného efektu lze dosáhnout i psaním &M[N].
  • Řádek 12.Úkon % vypočítá zbytek dělení. Stav operátora -li se považuje za provedené, pokud je číselná hodnota výrazu jiná než nula.
  • Řádek 13. Funkce printf- tisk podle formátu funguje stejným způsobem scanf, ale místo adres jsou předány hodnoty, které mají být vydány.
1 #zahrnout 2 3 šablona class Array 4 ( 5 public: Array (T Size=1) : M (new T), N (Size), n(0) () 6 Array (void) ( delete M;) 7 T Count (void) const ( return n; ) 8 T operátor (int i) const ( return M[i]; ) 9 void Add (T Data); 10 private: 11 T* M; // Adresa distribuované paměti 12 int N, n; // N - distribuované, n - použité 13); 14 15 šablona void Array ::Add(T Data) 16 ( if (N-n) // Pokud je použito všech alokovaných 17 ( int* P = nové T; // mezera, distribuovat více 18 pro (int i=0; i A; // Pole celých čísel s proměnnou velikostí 28 while (1) // Nekonečná smyčka 29 ( int N; 30 cin >> N; // cin - standardní vstupní proud 31 if (cin.eof()) break; // Ukončení smyčky by end of file 32 A.Add(N); // Přidejte zadané číslo do pole 33 ) 34 for (int N=A.Count()-1; N>=0; --N) // Projděte pole 35 if ( A[N]%2) 36 cout<a uvolněte paměť
  • Řádky 3-13. Třída šablony je deklarována Pole s parametrem T. Je to pole objektů typu s proměnnou velikostí T. Samozřejmě v našem úkolu není potřeba používat šablonu třídy. Chtěli jsme však demonstrovat, jak C++ dokáže vytvořit polymorfní datovou strukturu, která dokáže pracovat s libovolným typem prvku.
  • Řádek 5. Konstruktor třídy. Inicializuje reprezentaci objektu. Například v terénu M zadá se adresa paměťového bloku seřazeného operací nový T.
  • Řádek 8. Příklad přetížení provozu. Funkce operátor bude voláno, když se napravo od objektu třídy objeví hranaté závorky Pole.
  • Řádek 9. Tato funkce je hlavní v implementaci. Přidává prvky do pole a rozšiřuje je podle potřeby. Protože je složitější než ostatní, jeho definice je převzata z popisu třídy. Funkce popsané v těle třídy jsou v C++ implementovány nikoli voláním, ale inline substitucí. To zrychlí program, i když zvětší jeho velikost.
  • Řádky 15-24. Definice funkce Pole::Add(T)(to je mimochodem její celé jméno).
  • Řádek 27. Vytvořte objekt typu Pole. Šablona Aggau parametrizované podle typu int.

Proč C++

C++ je v současnosti považován za dominantní jazyk používaný pro vývoj komerčních softwarových produktů. V posledních letech tato dominance mírně zakolísala kvůli podobným tvrzením z programovacího jazyka, jako je Java, ale kyvadlo veřejného mínění se obrátilo opačným směrem a mnoho programátorů, kteří opustili C++ pro Javu, se nedávno vrátilo k jeho dřívější náklonnosti. V každém případě jsou si oba jazyky natolik podobné, že jakmile se naučíte jeden, automaticky ovládáte 90 % druhého.

C# je nový jazyk vyvinutý společností Microsoft pro síťovou platformu. C# je v podstatě variací C++ a navzdory řadě zásadních rozdílů jsou jazyky C# a C++ přibližně z 90 % stejné. Pravděpodobně bude trvat dlouho, než C# bude vážně konkurovat C++; ale i kdyby k tomu došlo, znalost jazyka C++ bude významnou výhodou.

C++ je univerzální programovací jazyk. Jeho přirozenou oblastí použití je systémové programování, chápané v širokém slova smyslu. Kromě toho byl C++ úspěšně použit v mnoha aplikačních oblastech, které dalece přesahují tento rozsah. Implementace C++ jsou nyní dostupné na všech strojích, od nejskromnějších mikropočítačů po největší superpočítače a prakticky na všech operačních systémech.

Vznik a vývoj jazyka C++

Bjarne Stroustrup je vývojář jazyka C++ a tvůrce prvního překladače. Je zaměstnancem AT&T Bell Laboratories Research Computing Center v Murray Hill (New Jersey, USA). Získal magisterský titul z matematiky a informatiky na University of Aarus (Dánsko) a doktorát z informatiky na University of Cambridge (Anglie). Specializuje se na distribuované systémy, operační systémy, modelování a programování. Spolu s M. A. Ellisem je autorem definitivního průvodce jazykem C++ The Annotated C++ Manual.

C++ samozřejmě hodně vděčí jazyku C, který zůstává jako jeho podmnožina. Zachovány byly i všechny nízkoúrovňové C nástroje určené k řešení nejpalčivějších problémů systémového programování. C zase hodně vděčí svému předchůdci, jazyku BCPL. Komentář jazyka BCPL byl obnoven v C++. Dalším zdrojem inspirace byl jazyk SIMULA-67; právě z něj byl koncept tříd (spolu s odvozenými třídami a virtuálními funkcemi) vypůjčen. Schopnost C++ přetěžovat operátory a svoboda umísťovat deklarace všude tam, kde se operátor může vyskytnout, připomíná jazyk ALGOL-68.

Dřívější verze jazyka, nazývané "C with class", byly používány od roku 1980. Tento jazyk vznikl, protože autor potřeboval napsat přerušení-řízené simulační programy. Jazyk SIMULA-67 je pro to ideální, nehledě na efektivitu. Pro velké modelovací problémy byl použit jazyk C s třídami. Přísnému testování tehdy podléhaly možnosti psát na něm programy, pro které byly kritické časové a paměťové zdroje. Tento jazyk postrádal přetěžování operátorů, reference, virtuální funkce a mnoho dalších funkcí. C++ byl poprvé vydán mimo výzkumnou skupinu autora v červenci 1983, ale mnoho funkcí C++ ještě nebylo vyvinuto.

Název C++ (C plus plus) vymyslel Rick Mascitti v létě 1983. Název odráží evoluční povahu změn v jazyce C. Zápis ++ odkazuje na provoz rostoucího C. O něco kratší název C+ je syntaktická chyba. Navíc se již používal jako název zcela jiného jazyka. Odborníci na sémantiku C považují C++ za horší než ++C. Jazyk se nejmenuje D, protože je rozšířením jazyka C a nesnaží se řešit žádné problémy odstraněním vlastností jazyka C. Další zajímavou interpretaci názvu C++ lze nalézt v příloze k .

C++ byl původně koncipován tak, aby autor a jeho přátelé nemuseli programovat v assembleru, C nebo jiných moderních vysokoúrovňových jazycích. Jeho hlavním účelem je zjednodušit a zpříjemnit proces programování jednotlivému programátorovi. Až donedávna neexistoval žádný plán na vývoj C++ na papíře. Paralelně probíhaly návrhy, realizace a dokumentace. Nikdy neexistoval „Projekt C++“ ani „Výbor pro vývoj C++“. Jazyk se proto vyvíjel a dále vyvíjí takovým způsobem, aby překonal všechny problémy, kterým uživatelé čelí. Jako impuls k rozvoji slouží také autorovy diskuse o všech problémech s jeho přáteli a kolegy.

Od vydání prvního vydání této knihy prošel jazyk C++ významnými změnami a vylepšeními. Týká se to především řešení nejednoznačnosti při přetěžování, vázání a správě paměti. Byly však provedeny drobné změny pro zvýšení kompatibility s jazykem C. Byla také zavedena některá zobecnění a významná rozšíření, jako je vícenásobná dědičnost, členské funkce se statickými a const specifikacemi, chráněné členy, šablony typů a řešení speciálních situací. Všechna tato rozšíření a vylepšení měla za cíl udělat z C++ jazyk, ve kterém lze vytvářet a používat knihovny. Všechny změny jsou popsány v .

Další rozšíření zavedená v letech 1985 až 1991 (jako je vícenásobná dědičnost, statické členské funkce a čistě virtuální funkce) vznikly spíše zobecněním zkušeností s programováním v C++ než z jiných jazyků.

Jazyková rozšíření uskutečněná během těchto šesti let byla primárně zaměřena na zvýšení expresivity C++ jako jazyka abstrakce dat a objektově orientovaného programování obecně a jako prostředku pro vytváření vysoce kvalitních knihoven zejména s uživatelsky definovanými datovými typy.

Kolem roku 1987 se ukázalo, že práce na standardizaci C++ se blíží a že práce na nich by měly začít okamžitě.

Hlavním přispěvatelem k této práci byla společnost AT&T Bell Laboratories. Asi sto zástupců z asi 20 organizací zkontrolovalo a okomentovalo to, co se stalo moderní verzí referenční příručky a zdrojovým materiálem pro standardizaci ANSI. C++. Nakonec z iniciativy společnosti Hewlett-Packard byl v prosinci 1989 v rámci ANSI vytvořen výbor X3J16. Očekává se, že normalizační práce ANSI (American Standard) pro C++ se stanou součástí normalizační práce ISO (International Organization for Standardization).

C++ se vyvíjelo současně s vývojem některých základních tříd.

Historie stvoření

Jazyk vznikl na počátku 80. let, kdy zaměstnanec Bell Labs Björn Stroustrup přišel s řadou vylepšení jazyka C pro vlastní potřeby. Když Stroustrup začal koncem 70. let pracovat v Bellových laboratořích na problémech v teorii front (jak je aplikováno na modelování telefonních hovorů), zjistil, že pokusy o použití tehdy existujících modelovacích jazyků byly neúčinné a použití vysoce účinných strojových jazyků bylo příliš obtížné pro jejich omezenou expresivitu. Jazyk Simula má tedy funkce, které by byly velmi užitečné pro vývoj velkého softwaru, ale je příliš pomalý a jazyk BCPL je dostatečně rychlý, ale je příliš blízko jazykům nízké úrovně a není vhodný pro vývoj velkého softwaru.

Stroustrup si připomněl zkušenosti ze své disertační práce a rozhodl se doplnit jazyk C (nástupce BCPL) o možnosti dostupné v jazyce Simula. C, což je základní jazyk systému UNIX, na kterém počítače Bell běžely, je rychlý, bohatý na funkce a přenosný. Stroustrup přidal možnost pracovat s třídami a objekty. Ve výsledku se ukázalo, že praktické problémy modelování jsou snadno řešitelné jak z hlediska doby vývoje (díky použití tříd podobných Simula), tak z hlediska doby výpočtu (díky rychlosti C). Nejprve byly do C přidány třídy (se zapouzdřením), dědičnost tříd, silná kontrola typu, inline funkce a výchozí argumenty. Rané verze jazyka, původně nazývané „C s třídami“, byly k dispozici v roce 1980.

Při vývoji jazyka C s třídami Stroustrup napsal program nazvaný cfront, překladač, který převádí zdrojový kód jazyka C s třídami na zdrojový kód prostého jazyka C. To umožnilo pracovat na novém jazyce a používat jej v praxi s využitím infrastruktury dostupné již v UNIX pro vývoj v C. Nový jazyk si pro autora nečekaně získal velkou oblibu mezi svými kolegy a Stroustrup ho již brzy nemohl osobně podporovat a odpovídat na tisíce otázek.

Při vytváření C++ chtěl Björn Stroustrup
  • Získejte univerzální jazyk se statickými datovými typy, efektivitou a přenositelností jazyka C.
  • Přímo a komplexně podporuje různé styly programování, včetně procedurálního programování, abstrakce dat, objektově orientovaného programování a generického programování.
  • Dejte programátorovi svobodu volby, i když mu to dává možnost vybrat si špatně.
  • Zachovejte maximální kompatibilitu s C, čímž umožníte snadný přechod z programování v C.
  • Vyhněte se nesrovnalostem mezi C a C++: jakákoli konstrukce, která je platná v obou jazycích, musí v každém z nich znamenat totéž a vést ke stejnému chování programu.
  • Vyhněte se funkcím, které jsou závislé na platformě nebo nejsou univerzální.
  • „Neplaťte za to, co nepoužíváte“ – žádná jazyková funkce by neměla způsobit snížení výkonu programů, které ji nepoužívají.
  • Nevyžadují příliš složité programovací prostředí.

Volba C jako základu pro vytvoření nového programovacího jazyka je vysvětlena skutečností, že jazyk C:

1. je víceúčelový, stručný a relativně nízkoúrovňový jazyk;
2. vhodné pro řešení většiny systémových problémů;
3. vystupoval všude a na všem;
4. rozhraní s programovacím prostředím UNIX.

— B. Stroustrup. C++ programovací jazyk. Oddíl 1.6

Navzdory řadě známých nedostatků jazyka C se Stroustrup rozhodl použít jej jako základ, protože „C má své problémy, ale jazyk vyvinutý od nuly by je měl a my známe problémy jazyka C“. Navíc to umožnilo rychle získat prototypový kompilátor (cfront), který pouze přeložil přidané syntaktické prvky do původního jazyka C.

Jak se C++ vyvíjelo, byly zahrnuty další funkce, které pokryly možnosti konstrukcí C, a proto byla opakovaně vznesena otázka opuštění jazykové kompatibility odstraněním zastaralých konstrukcí. Kompatibilita však byla zachována z následujících důvodů:

  • zachování aktuálního kódu, původně napsaného v C a přímo přeneseného do C++;
  • eliminace potřeby rekvalifikace programátorů, kteří dříve studovali C (potřebují se pouze naučit nové nástroje C++);
  • odstranění záměny mezi jazyky při společném použití („pokud se dva jazyky používají společně, jejich rozdíly by měly být buď minimální, nebo tak velké, aby nebylo možné jazyky zaměnit“).

Do roku 1983 byly do jazyka přidány nové funkce, jako jsou virtuální funkce, přetěžování funkcí a operátorů, odkazy, konstanty, uživatelská kontrola nad správou volné paměti, vylepšená kontrola typu a nový styl komentářů (//). Výsledný jazyk již nebyl jen rozšířenou verzí klasického C a byl přejmenován z C s třídami na „C++“. Jeho první komerční vydání se uskutečnilo v říjnu 1985.

Výsledný název jazyka pochází z unárního postfixového inkrementačního operátoru C++ (zvyšuje hodnotu proměnné o jednu).

Než začala oficiální standardizace, jazyk vyvíjel hlavně Stroustrup v reakci na požadavky programátorské komunity. Funkci standardních popisů jazyka plnily tištěné práce napsané Stroustrupem na C++ (popis jazyka, referenční příručka atd.).

Historie norem

V roce 1985 bylo publikováno první vydání The C++ Programming Language, poskytující první popis jazyka, což bylo extrémně důležité kvůli chybějícímu oficiálnímu standardu.


V roce 1989 byla vydána verze C++ 2.0. Jeho nové funkce zahrnovaly vícenásobnou dědičnost, abstraktní třídy, statické členské funkce, konstantní funkce a chráněné členy. V roce 1990 byla vydána „Anotovaná referenční příručka k C++“, která se později stala základem standardu. Nedávné aktualizace zahrnovaly šablony, výjimky, jmenné prostory, nové typy přetypování a booleovský typ.

Spolu s ním se vyvíjela i standardní knihovna C++. Prvním přírůstkem do standardní knihovny C++ byly I/O proudy, které poskytují prostředky k nahrazení tradičních funkcí C printf a scanf. Později nejvýznamnějším rozvojem standardní knihovny bylo zahrnutí knihovny standardních šablon.

V roce 1998 byla vydána jazyková norma ISO/IEC 14882:1998 (známá jako C++98), vyvinutá Výborem pro standardy C++ (pracovní skupina ISO/IEC JTC1/SC22/WG21). Standard C++ nepopisuje, jak jsou objekty pojmenovány, některé podrobnosti o zpracování výjimek a další implementační podrobné funkce, takže objektový kód vytvořený různými kompilátory není kompatibilní. Mnoho standardů však bylo vytvořeno třetími stranami pro konkrétní architektury a operační systémy.

V roce 2005 byla vydána Technická zpráva knihovny 1 (zkráceně TR1). Ačkoli to není oficiálně součástí standardu, zpráva popisuje rozšíření standardní knihovny, u kterých autoři očekávali, že budou zahrnuta do příští verze jazyka C++. Podpora TR1 se zlepšuje téměř ve všech podporovaných kompilátorech C++.

Od roku 2009 se pracovalo na aktualizaci předchozího standardu, předběžná verze nového standardu byla nejprve C++09 a o rok později C++0x, dnes C++11, která zahrnovala doplnění jádra jazyk a rozšíření standardní knihovny, včetně většiny TR1.

C++ se neustále vyvíjí, aby vyhovoval dnešním požadavkům. Jednou ze skupin vyvíjejících jazyk C++ a předkládajících normalizační komisi C++ návrhy na jeho vylepšení je Boost, která se mimo jiné zabývá zlepšováním schopností jazyka přidáváním funkcí metaprogramování.

Nikdo nevlastní práva na jazyk C++, je zdarma. Samotný jazykový standardní dokument (kromě konceptů) však není k dispozici zdarma.