C++

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 31. července 2022; kontroly vyžadují 14 úprav .
C++
Sémantika multiparadigma : objektově orientované , generické , procedurální , metaprogramování
Jazyková třída objektově orientovaný programovací jazyk , multiparadigmatický programovací jazyk , procedurální programovací jazyk , funkcionální programovací jazyk , generický programovací jazyk , programovací jazyk , volně tvarovaný jazyk [d] a kompilovaný programovací jazyk
Typ provedení sestaven
Objevil se v 1983
Autor Stroustrupe, Bjorne
Přípona souboru .cc, .cpp, .cxx, .c, .c++, .h, .hpp, nebo .hh_.hxx.h++
Uvolnění
Typový systém statický
Hlavní implementace GNU C++ , Microsoft Visual C++ , Intel C++ kompilátor , Open64 C++ Compiler , Clang , Comeau C/C++ , Embarcadero C++ Builder , Watcom C++ kompilátor , Digital Mars C++, Oracle Solaris Studio C++ kompilátor, Turbo C++
Dialekty ISO/IEC 14882 C++
Byl ovlivněn C , Simula , Algol 68 , Clu , ML a Ada
webová stránka isocpp.org
 Mediální soubory na Wikimedia Commons

C ++ (vyslovováno c-plus-plus [2] [3] ) je kompilovaný , staticky typovaný , univerzální programovací jazyk .

Podporuje taková programovací paradigmata jako procedurální programování , objektově orientované programování , generické programování . Jazyk má bohatou standardní knihovnu, která zahrnuje běžné kontejnery a algoritmy , I/O, regulární výrazy, podporu více vláken a další. C++ kombinuje funkce jazyků vysoké i nízké úrovně [4] [5] . Ve srovnání s jeho předchůdcem - jazykem C  - je největší pozornost věnována podpoře objektově orientovaného a generického programování [5] .

C++ je široce používán pro vývoj softwaru a je jedním z nejpopulárnějších programovacích jazyků [názory 1] [názory 2] . Jeho rozsah zahrnuje tvorbu operačních systémů , různých aplikačních programů, ovladačů zařízení , aplikací pro vestavěné systémy, vysoce výkonné servery a počítačové hry. Existuje mnoho implementací jazyka C++, bezplatných i komerčních a pro různé platformy. Například na platformě x86 jsou to GCC , Visual C++ , Intel C++ Compiler , Embarcadero (Borland) C++ Builder a další. C++ mělo obrovský dopad na další programovací jazyky, zejména Java a C# .

Syntaxe C++ je zděděna z jazyka C. Jedním z původních principů návrhu bylo zachování kompatibility s C. C++ však není striktně nadmnožinou C; Sada programů, které lze stejně dobře přeložit jak kompilátory C, tak C++, je poměrně velká, ale nezahrnuje všechny možné programy C.

Historie

Historická etapa vývoje [6] Rok
jazyk BCPL 1966
Jazyk B (původní vývoj od Thompsona pod UNIXem ) 1969
jazyk C 1972
C s třídami 1980
C84 1984
Cfront (vydání E) 1984
cfront (vydání 1.0) 1985
Vícenásobná/virtuální dědičnost 1988
Obecné programování ( šablony ) 1991
ANSI C++ / ISO-C++ 1996
ISO/IEC 14882:1998 1998
ISO/IEC 14882:2003 2003
C++/CLI 2005
TR1 2005
C++11 2011
C++14 2014
C++17 2017
C++20 2020

Tvorba

Jazyk vznikl na počátku 80. let 20. století , kdy zaměstnanec Bell Labs Björn Stroustrup přišel s řadou vylepšení jazyka C pro vlastní potřeby [7] . Když Stroustrup začal koncem 70. let pracovat v Bellových laboratořích na problémech v teorii front (aplikované na modelování telefonních hovorů), zjistil, že pokusy o použití existujících modelovacích jazyků v té době byly neúčinné a použití vysoce účinných strojových jazyků bylo příliš obtížné, protože pro jejich omezenou expresivitu. Například jazyk Simula má 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 příliš blízký jazykům nízké úrovně a není vhodný pro vývoj velkého softwaru.

Stroustrup si připomněl zkušenosti ze své dizertační práce a rozhodl se doplnit jazyk C (nástupce BCPL) o možnosti dostupné v jazyce Simula. Jazyk C, který je základním jazykem systému UNIX , na kterém počítače Bell běžely, je rychlý, bohatý na funkce a přenosný. Stroustrup k tomu přidal možnost práce s třídami a objekty. V důsledku toho se ukázalo, že praktické problémy modelování jsou dostupné jak z hlediska doby vývoje (díky použití tříd typu Simula), tak z hlediska doby výpočtu (kvůli rychlosti C). Prvními přírůstky do C byly třídy (se zapouzdřením ), dědičnost tříd, přísná kontrola typu, vložené funkce a výchozí argumenty . Rané verze jazyka, původně nazývané „C with class“, byly dostupné od 80. let 20. století .

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

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ž není 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 konalo v říjnu 1985 .

Před zahájením oficiální standardizace jazyk vyvíjel především Stroustrup v reakci na požadavky programátorské komunity. Funkci standardních jazykových popisů plnily Stroustrupovy tištěné práce na C++ (popis jazyka, referenční příručka atd.). Teprve v roce 1998 byla ratifikována mezinárodní norma pro jazyk C++: ISO/IEC 14882:1998 „Standard pro programovací jazyk C++“; po přijetí technických oprav normy v roce 2003 je  další verzí této normy ISO/IEC 14882:2003 [8] .

Vývoj a standardizace jazyka

V roce 1985 vyšlo první vydání The C++ Programming Language , poskytující první popis jazyka, který byl extrémně důležitý kvůli nedostatku oficiálního 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 „Commented Reference Guide to C++“, která se později stala základem standardu. Nedávné aktualizace zahrnovaly šablony, výjimky, jmenné prostory, nová přetypování a booleovský typ. Standard Template Library (STL) vyvinutá Alexandrem Stepanovem a Meng Li byla vybrána jako základ pro ukládání a přístup k generickým algoritmům .

Spolu s tí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 C printfa scanf. Později nejvýznamnějším rozvojem standardní knihovny bylo zahrnutí knihovny standardních šablon .

C++ se neustále vyvíjí, aby splňovalo moderní požadavky. Jednou ze skupin, které vyvíjejí jazyk C++ a zasílají návrhy na jeho vylepšení normalizační komisi pro C++, je Boost , která se mimo jiné zabývá zlepšováním schopností jazyka přidáváním funkcí metaprogramování do něj .

Nikdo nevlastní práva na jazyk C++, je zdarma. Samotný jazykový standardní dokument (s výjimkou konceptů) však není volně dostupný [10] . V rámci procesu standardizace ISO produkuje několik typů publikací. Zejména technické zprávy a technické specifikace jsou zveřejňovány, když „budoucnost je v nedohlednu, ale neexistuje bezprostřední možnost dohody o zveřejnění mezinárodní normy“. Do roku 2011 byly publikovány tři technické zprávy o C++: TR 19768: 2007 (také známá jako C++ Technical Report 1) pro rozšíření knihoven převážně integrovaných do C++11, TR 29124: 2010 pro speciální matematické funkce a TR 24733: 2011 pro desetinná aritmetika s plovoucí desetinnou čárkou. Technická specifikace DTS 18822:. 2014 (podle systému souborů) byl schválen na začátku roku 2015 a zbytek specifikací je ve vývoji a čeká na schválení [11] .

V březnu 2016 byla v Rusku vytvořena pracovní skupina WG21 C++ . Skupina byla zorganizována s cílem shromáždit návrhy standardu C++, předložit je výboru a obhájit je na valných hromadách Mezinárodní organizace pro standardizaci (ISO) [12] .

Historie jména

Výsledný název jazyka pochází z C unárního postfixového inkrementačního++ operátoru (zvyšuje hodnotu proměnné o jednu). Název C+ nebyl použit, protože se jedná o syntaktickou chybu v C a navíc název převzal jiný jazyk. Jazyk také nebyl pojmenován D, protože „ je rozšířením C a nepokouší se opravit problémy odstraněním prvků C “ [7] .

Filosofie C++

V The Design and Evolution of C++ [13] popisuje Bjorn Stroustrup principy, kterými se řídil při navrhování C++. Tyto principy vysvětlují, proč je C++ takové, jaké je. Někteří z nich:

Přehled jazyků

Standard C++ se skládá ze dvou hlavních částí: popisu základního jazyka a popisu standardní knihovny.

Nejprve se jazyk vyvíjel mimo formální rámec, spontánně, podle úkolů, které před ním stály. Vývoj jazyka byl doprovázen vývojem kompilátoru cfront cross . Inovace v jazyce se projevily ve změně čísla verze křížového kompilátoru. Tato čísla verzí mezi kompilátory se rozšířila na samotný jazyk, ale o verzích C++ se v současné době nemluví. Až v roce 1998 se jazyk standardizoval.

jmenný prostor Foo { const int x = 5 ; } const int y = Foo :: x ;

Speciálním případem je nepojmenovaný jmenný prostor. Všechny názvy v něm popsané jsou dostupné pouze v aktuální překladové jednotce a mají lokální vazbu. Jmenný prostor stdobsahuje standardní knihovny C++.

  • newOperátory , new[], deletea jsou uvedeny do práce s pamětí delete[]. Na rozdíl od knihovny malloc a free, která pochází z C, tyto operátory inicializují objekt. U tříd se jedná o volání konstruktoru, u typů POD lze inicializaci buď vynechat ( new Pod;), nebo inicializovat s nulovými hodnotami ( new Pod(); new Pod {};).

Typy

V C++ jsou k dispozici následující vestavěné typy. Typy C++ jsou téměř totožné s datovými typy C :

  • znak: char, wchar_t( char16_ta char32_t, ve standardu C++11 );
  • celá čísla se znaménkem: signed char, short int, int, long int(a long long, ve standardu C++11 );
  • celá čísla bez znaménka: unsigned char, unsigned short int, unsigned int, unsigned long int(a unsigned long long, ve standardu C++11 );
  • plovoucí desetinná čárka : float, double, long double;
  • boolean: boolmající hodnoty buď true, nebo false.

Porovnávací operátory vrátí typ bool. Výrazy v závorkách za if, while jsou převedeny na typ bool[14] .

Jazyk zavedl koncept referencí a ze standardu C++11 rvalues ​​​​- reference a forwarding references .  (viz odkaz (C++) )

C++ přidává do C objektově orientované funkce. Představuje třídy, které poskytují tři nejdůležitější vlastnosti OOP : zapouzdření , dědičnost a polymorfismus .

Ve standardu C++ je třída uživatelem definovaný typ deklarovaný pomocí jednoho z klíčových slov , nebo klíčových slov class, structstruktura unionje třída definovaná pomocí structa union je třída definovaná pomocí union. V závislosti na použitém klíčovém slově se mění i některé vlastnosti samotné třídy. Například ve třídě deklarované pomocí struct, členové bez ručně přiřazeného modifikátoru přístupu budou ve výchozím nastavení veřejné spíše než soukromé.

V těle definice třídy můžete zadat deklarace funkcí i jejich definici. V druhém případě je funkce inline ( inline). Nestatické členské funkce mohou mít kvalifikátory consta volatile, stejně jako referenční kvalifikátor ( &nebo &&).

Dědičnost

C++ podporuje vícenásobnou dědičnost . Základní třídy (třídy předků) jsou uvedeny v záhlaví deklarace třídy, případně se specifikátory přístupu. Dědičnost z každé třídy může být veřejná, chráněná nebo soukromá:

Režim přístupu/dědění členů základní třídy soukromý člen chráněný člen veřejný člen
soukromé dědictví není dostupný soukromé soukromé
chráněné dědictví není dostupný chráněný chráněný
veřejné dědictví není dostupný chráněný veřejnost

Ve výchozím nastavení se základní třída dědí jako soukromá.

V důsledku dědění obdrží podřízená třída všechna pole tříd předků a všechny jejich metody; můžeme říci, že každá instance třídy potomka obsahuje dílčí instanci každé z tříd předků. Pokud je jedna třída předka zděděna vícekrát (to je možné, pokud je předkem několika základních tříd vytvářené třídy), pak instance třídy potomka budou zahrnovat tolik podinstancí této třídy předka. Aby se tomuto efektu zabránilo, pokud to není žádoucí, podporuje C++ koncept virtuální dědičnosti . Při dědění lze základní třídu prohlásit za virtuální; pro všechny virtuální výskyty třídy předka ve stromu dědičnosti třídy potomka se v potomkovi vytvoří pouze jedna podinstance.

Polymorfismus

C++ podporuje dynamický polymorfismus a parametrický polymorfismus .

Parametrický polymorfismus je reprezentován:

  • Výchozí argumenty pro funkce. Například pro funkci void f(int x, int y=5, int z=10)jsou volání f(1), f(1,5)a f(1,5,10)ekvivalentní.
  • Přetížení funkcí : Funkce se stejným názvem může mít různý počet a typ argumentů. Například :voidPrint ( int x ) ; voidPrint ( dvojité x ) ; void Tisk ( int x , int y );
Zvláštním případem přetížení funkcí je přetížení operátora .
  • šablonový engine

Dynamický polymorfismus je implementován pomocí virtuálních metod a hierarchie dědičnosti. V C++ je typ polymorfní, pokud má alespoň jednu virtuální metodu. Příklad hierarchie:

třída Obrázek { veřejnost : virtuální void Kreslit () = 0 ; // čistá virtuální metoda virtual ~ Obrázek (); // pokud existuje alespoň jedna virtuální metoda, destruktor by měl být virtuální }; třída Čtverec : veřejný Fig { veřejnost : void Draw () override ; }; třída Kruh : veřejný obrázek { veřejnost : void Draw () override ; };

Zde je třída Figure abstraktní (a dokonce i třída rozhraní ), protože metoda Draw není definována. Objekty této třídy nelze vytvořit, ale lze použít odkazy nebo ukazatele typu Obrázek. Volba implementace metody Draw bude provedena za běhu na základě skutečného typu objektu.

Zapouzdření

Zapouzdření v C++ je implementováno specifikací úrovně přístupu k členům třídy: jsou veřejné (public, public), chráněné ( protected) a soukromé (private, private). V C++ se struktury formálně liší od tříd pouze tím, že standardně je úroveň přístupu ke členům třídy a typ dědičnosti pro strukturu veřejné, zatímco pro třídu jsou soukromé.

Přístup soukromé chráněný veřejnost
Sama třída Ano Ano Ano
Přátelé Ano Ano Ano
Dědicové Ne Ano Ano
Zvenku Ne Ne Ano

Kontrola přístupu probíhá v době kompilace, pokus o přístup k nepřístupnému členu třídy způsobí chybu kompilace.

Přátelé

Funkce přátel  jsou funkce, které nejsou členskými funkcemi, a přesto mají přístup k chráněným a soukromým členům třídy. Musí být deklarovány v těle třídy jako friend. Například:

třída Matice { přítel Matrix Multiply ( Matrix m1 , Matrix m2 ); };

Zde má funkce Multiplypřístup k libovolným polím a členským funkcím Matrix.

Jak celá třída, tak členská funkce třídy mohou být prohlášeny za přátele. Čtyři důležitá omezení vztahů s přáteli v C++ jsou:

  • Přátelství není přechodné. Pokud A prohlásí přítele B a B zase přítele C, pak se C automaticky nestane přítelem A. K tomu musí A výslovně prohlásit C za přítele.
  • Přátelství není vzájemné. Pokud třída A prohlásí přítele třídy B, nestává se automaticky přítelem třídy B. K tomu musí existovat výslovné prohlášení o přátelskosti třídy A ve třídě B.
  • Vstřícnost se nedědí. Pokud A deklaruje třídu B jako přítele, pak se děti B nestanou automaticky přáteli A. K tomu musí být každé z nich výslovně prohlášeno za přítele A.
  • Přátelství se nevztahuje na potomky. Pokud třída A prohlásí B za přítele, pak se B automaticky nestává přítelem tříd potomků A. Každý potomek, je-li to nutné, musí prohlásit B za svého vlastního přítele.

Obecně lze toto pravidlo formulovat takto: "Vztah přívětivosti existuje pouze mezi těmi třídami (třídou a funkcí), pro které je v kódu výslovně deklarován, a působí pouze ve směru, ve kterém je deklarován."

Speciální funkce

Výchozí třída může mít šest speciálních funkcí: výchozí konstruktor, konstruktor kopírování, konstruktor přesunu, destruktor, operátor přiřazení kopírování, operátor přiřazení přesunu. Je také možné explicitně definovat všechny (viz Pravidlo tří ).

class Array { veřejnost : Pole ( ) = výchozí // kompilátor vytvoří výchozí konstruktor samotného Array ( size_t _len ) : len ( _len ) { val = new double [ _len ]; } Array ( const Array & a ) = delete ; // kopírování konstruktoru explicitně odstraněno Array ( Array && a ); // přesunutí konstruktoru ~ Array () { smazat [] val ; } Pole & operátor = ( const Pole & rhs ); // kopírování operátoru přiřazení Array & operator = ( Array && rhs ); // přesunutí operátor přiřazení double & operátor []( size_t i ) { návratová hodnota [ i ]; } const double & operátor []( size_t i ) const { návratová hodnota [ i ]; } chráněno : std :: size_t len ​​​​= 0 ; // inicializace pole double * val { nullptr }; };

Konstruktor je volán, aby inicializoval objekt (příslušného typu), když je vytvořen, a destruktor je volán, aby objekt zničil. Třída může mít více konstruktorů, ale destruktor může mít pouze jeden. Konstruktory v C++ nelze deklarovat jako virtuální, ale destruktory mohou, a obvykle jsou deklarovány pro všechny polymorfní typy, aby zajistily, že odkazovaný objekt nebo objekt přístupný ukazatelem bude správně zničen, bez ohledu na typ odkazu nebo ukazatele. Pokud má alespoň jedna ze základních tříd virtuální destruktor, destruktor podřízené třídy se automaticky stane virtuálním.

Šablony

Šablony umožňují generovat funkce a třídy, které jsou parametrizovány konkrétním typem nebo hodnotou. Například předchozí třída mohla implementovat pole pro jakýkoli typ dat:

šablona < typenameT > _ class Array { ... T & operátor []( size_t i ) { návratová hodnota [ i ]; } chráněno : std :: size_t len ​​​​{ 0 }; // inicializace pole T * val { nullptr }; };

Standardní knihovna

Obecná struktura

Standardní knihovna C++ obsahuje sadu nástrojů, které by měly být dostupné pro jakoukoli implementaci jazyka, aby poskytly programátorům pohodlné používání jazykových funkcí a poskytly základ pro vývoj široké škály aplikačních aplikací a specializovaných knihoven. Standardní knihovna C++ zahrnuje část standardní knihovny C. Standard C++ obsahuje normativní odkaz na standard C z roku 1990 a nedefinuje nezávisle ty standardní knihovní funkce, které jsou vypůjčeny ze standardní knihovny C.

#includePřístup ke schopnostem standardní knihovny C++ je zajištěn zahrnutím příslušných standardních hlavičkových souborů do programu (prostřednictvím směrnice ). Celkem je ve standardu C++11 definováno 79 takových souborů. Standardní knihovní zařízení jsou deklarována jako součást jmenného prostoru std. Soubory záhlaví, jejichž názvy odpovídají vzoru "cX", kde X je název souboru záhlaví standardní knihovny C bez přípony (cstdlib, cstring, cstdio atd.), obsahují deklarace odpovídající této části standardní knihovny C. C standardní knihovní funkce se také nacházejí v jmenném prostoru std.

Složení

Standardní knihovna obsahuje následující sekce:

  • Jazyková podpora . Zahrnuje nástroje, které jsou nezbytné pro fungování programů, a také informace o implementačních funkcích. Alokace paměti, RTTI , základní výjimky, limity hodnot pro numerické datové typy, základní interakce s prostředím, jako jsou systémové hodiny, obsluha UNIXových signálů, ukončení programu.
  • standardní nádoby . Standardní knihovna obsahuje šablony pro následující kontejnery: dynamické pole (vektor), statické pole (pole), jednosměrné a obousměrné seznamy (forward_list, list), zásobník (stack), deque (deque), asociativní pole (map, multimap), sady (set, multiset), prioritní fronta (priority_queue).
  • Základní nástroje . Tato část obsahuje popis hlavních základních prvků používaných ve standardní knihovně, alokátorů paměti a podpory času a data ve stylu C.
  • Iterátory . Poskytněte šablony iterátorů , které poskytují standardní mechanismus ve standardní knihovně pro aplikaci algoritmů zpracování dat v dávkách na prvky kontejneru.
  • Algoritmy . Šablony pro popis operací zpracování, které lze pomocí mechanismů standardní knihovny aplikovat na libovolnou sekvenci prvků, včetně prvků v kontejnerech. V této části jsou také zahrnuty popisy funkcí bsearch() a qsort() ze standardní knihovny C.
  • Struny . Šablony řetězců ve stylu C++. Tato část také obsahuje některé knihovny pro práci s řetězci a symboly ve stylu C.
  • Vstup-výstup . Šablony a pomocné třídy pro obecné I/O proudy, řetězcové I/O, manipulátory (ovládací prvky formátu I/O proudu ve stylu C++).
  • Lokalizace . Definice používané pro podporu národností a prezentačních formátů ve stylu C++ a C (data, měny atd.).
  • Diagnostika . Definice řady výjimek a mechanismů kontroly tvrzení za běhu (asset). Podpora zpracování chyb ve stylu C.
  • Čísla . Definice pro práci s komplexními čísly, matematické vektory, podpora obecných matematických funkcí, generátor náhodných čísel.

Kontejnery, řetězce, algoritmy, iterátory a základní nástroje, s výjimkou výpůjček z knihovny C, se souhrnně nazývají STL (Standard Template Library - standardní knihovna šablon). Zpočátku byla tato knihovna samostatným produktem a její zkratka byla dešifrována jinak, ale poté vstoupila do standardní knihovny C++ jako integrální prvek. Název odráží skutečnost, že zobecněné programovací mechanismy (C++ šablony - šablona) se používají k implementaci univerzálních nástrojů (kontejnery, řetězce, algoritmy). Stroustrupovy spisy podrobně popisují důvody, proč byla tato volba učiněna. Mezi hlavní patří větší univerzálnost zvoleného řešení (kontejnery šablon lze na rozdíl od objektových kontejnerů snadno použít pro neobjektové typy a nevyžadují společného předka pro typy prvků) a jeho technická efektivita (zpravidla kontejner šablon operace nevyžadují volání virtuálních funkcí a lze je snadno vložit (inline), což v konečném důsledku přináší zvýšení výkonu).

Počínaje standardem C++11 byly přidány následující funkce:

  • Byla přidána knihovna <regex>, která implementuje běžné vyhledávací a substituční mechanismy pomocí regulárních výrazů.
  • Přidána podpora pro multithreading.
  • Atomové operace
  • neuspořádané varianty asociativních polí a množin.
  • Inteligentní ukazatele, které automaticky uvolňují přidělenou paměť.

Implementace

STL, než byl zahrnut do standardu C++, byl vývoj třetí strany, nejprve od HP a poté od SGI . Jazykový standard to nenazývá „STL“, protože tato knihovna se stala nedílnou součástí jazyka, nicméně mnoho lidí stále používá tento název, aby jej odlišili od zbytku standardní knihovny (I/O streamy ( iostream ), podsekce C a další).

Projekt nazvaný STLport [15] založený na SGI STL udržuje třídy STL, IOstream a string aktuální. Několik dalších projektů také rozvíjí soukromé využití standardní knihovny.

Rozdíly od jazyka C

Kompatibilita s jazykem C

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 většinu systémových úloh;
  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 [16]

Navzdory řadě dobře známých nedostatků jazyka C se Stroustrup rozhodl jej použít jako základ, protože "C má své problémy, ale jazyk navržený od nuly by je měl a my známe problémy C." Navíc nám to umožnilo rychle získat prototyp kompilátoru ( 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é potlačily schopnosti konstrukcí C, a opakovaně byla 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 portované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, když se používají společně („pokud se dva jazyky používají společně, jejich rozdíly by měly být buď minimální, nebo tak velké, aby se jazyky nedaly zaměnit“).

Nové funkce

Mezi nové funkce C++ patří deklarace výrazů, převody typů funkcí, operátory newa delete, type bool, odkazy, rozšířená stálost, vložené funkce, výchozí argumenty, přepisy, jmenné prostory, třídy (včetně všech funkcí souvisejících s třídou, jako je dědění, členské funkce, virtuální funkce, abstraktní třídy a konstruktory ), přepisy operátorů, šablony, operátor ::, zpracování výjimek, dynamická identifikace a další. Jazyk C++ je také v mnoha případech přísnější ohledně kontroly typu než C.

C++ zavedlo komentáře s dvojitým lomítkem ( //), které byly v předchůdci jazyka C, BCPL .

constNěkteré funkce C++ byly později přeneseny do C, jako jsou klíčová slova a , inlinedeklarace smyček fora komentáře ve stylu C++ ( //). Pozdější implementace C také zavedly funkce, které v C++ nenajdete, jako jsou makra va_arga vylepšené zpracování parametrů pole.

C++ neobsahuje C

Zatímco většina kódu C bude platná i pro C++, C++ není nadmnožinou C a neobsahuje ji. Existuje také nějaký kód, který platí pro C, ale neplatí pro C++. To jej odlišuje od Objective C , dalšího vylepšení C pro OOP , které je jen nadmnožinou C.

Existují i ​​další rozdíly. Například C++ neumožňuje volání funkce main()uvnitř programu, zatímco v C je to legální. Také C++ je v některých ohledech přísnější; například neumožňuje implicitní přetypování mezi nesouvisejícími typy ukazatelů a nepovoluje funkce, které ještě nejsou deklarovány.

Navíc kód, který je platný pro oba jazyky, může produkovat různé výsledky v závislosti na kompilátoru jazyka, do kterého je přeložen. Například na většině platforem následující program vytiskne "C", pokud je kompilován kompilátorem C a "C++", pokud je kompilován kompilátorem C++. Je to proto, že znakové konstanty v C (například 'a') jsou typu int, ale v C++ jsou typu chara velikosti těchto typů se obvykle liší.

#include <stdio.h> int main () { printf ( "%s \n " , ( sizeof ( 'a' ) == sizeof ( char )) ? "C++" : "C" ); návrat 0 ; }

C Prostředky, kterým se vyhnout

Jak poznamenává Stroustrup: "Čím lépe znáte C, tím obtížnější pro vás bude vyhnout se programování C++ ve stylu C a zároveň ztratit potenciální výhody C++." Za tímto účelem předkládá následující sadu doporučení pro programátory C, aby plně využili C++:

  • Nepoužívejte makra #define. Pro deklaraci konstant použijte const, skupiny konstant (výčty) - enum, pro přímé zahrnutí funkcí - inline, pro definování rodin funkcí nebo typů - template.
  • Nepoužívejte dopředné deklarace proměnných. Deklarujte proměnné v bloku, kde se skutečně používají, vždy kombinujte deklaraci s inicializací.
  • Upustit od používání malloc()[17] ve prospěch operátora new, od realloc()[18]  ve prospěch typu vector. Bezpečnější bude používat chytré ukazatele, jako jsou shared_ptra unique_ptr, dostupné od jedenácté verze standardu.
  • Vyhněte se netypovaným ukazatelům, aritmetice ukazatelů, implicitnímu přetypování, sjednocení, s výjimkou nízkoúrovňového kódu. Používejte převody „nových“ typů, protože přesněji vyjadřují skutečné záměry programátora a jsou bezpečnější.
  • Minimalizujte použití znakových polí a řetězců ve stylu C jejich nahrazením typy STL stringa z nich. vectorObecně se nesnažte vytvářet vlastní implementace toho, co je již ve standardní knihovně.

Další vývoj

Aktuální jazyková norma ISO/IEC 14882:2017 byla zveřejněna v prosinci 2017 . Neoficiálně se označuje jako C++17 . Další verze standardu plánovaná na rok 2020 má neoficiální označení C++20 .

Obecné směry vývoje C++

Podle autora jazyka Björna Stroustrupa [19] [20] [21] , hovořícího o dalším vývoji a perspektivách jazyka, lze rozlišit následující:

  • Další vývoj jazyka bude v zásadě sledovat cestu přidávání do standardní knihovny. Jedním z hlavních zdrojů těchto doplňků je slavná knihovna Boost .
  • Změny jádra jazyka by neměly snížit efektivitu C++, které již bylo dosaženo. Z pohledu Stroustrupa je lepší provést několik velkých zásadních změn v jádru než mnoho malých změn.
  • Základními směry vývoje C++ v blízké budoucnosti jsou rozšiřování schopností a zdokonalování generických programovacích nástrojů, standardizace mechanismů paralelního zpracování a také zdokonalování bezpečných programovacích nástrojů, jako jsou různé kontroly a bezpečné převody typů, kontrola stavu a tak dále.
  • Obecně je C++ navržen a vyvinut jako multiparadigmatický jazyk, který absorbuje různé programovací metody a technologie, ale implementuje je na platformě, která poskytuje vysokou technickou efektivitu. V budoucnu je proto možné, že do jazyka přibudou funkční programovací nástroje, automatický garbage collection a další mechanismy, které v něm zatím chybí. Ale v každém případě to bude provedeno na stávající platformě vysoce efektivního kompilovaného jazyka.
  • Ačkoli formálně jedním z principů C++ zůstává zachování kompatibility s jazykem C, ve skutečnosti normalizační skupiny těchto jazyků neinteragují a změny, které provádějí, nejen nekorelují, ale často si zásadně odporují. navzájem ideologicky. Takže prvky, které nové standardy C přidávají do jádra, jsou prvky standardní knihovny ve standardu C++ a obecně v jádře chybí, například dynamická pole, pole s pevnými hranicemi, zařízení pro paralelní zpracování. Stroustrup věří, že spojení vývoje těchto dvou jazyků by bylo velkým přínosem, ale z politických důvodů je to stěží možné. Takže praktická kompatibilita mezi C a C++ se postupně ztratí.

Standard C++11: doplňky k jádru jazyka

  • Explicitně definované konstantní funkce a výrazy constexpr.
  • Obecná inicializace.
  • Konstruktory a operátory přiřazení se sémantikou přenosu.
  • Typový závěr.
Pro použití v šablonách, kde je obtížné specifikovat konkrétní typ proměnné, byly zavedeny dva nové mechanismy: typové proměnné autoa deklarace decltype.
  • Procházejte sbírku na kole.
Po mnoha moderních jazycích C++ zavedl konstrukci formuláře "loop through collection" for (type &x: array) {...}. Zde se tělo smyčky provede pro každý prvek kolekce arraya xv každé iteraci bude odkazovat na další prvek kolekce. Kolekce může být C-pole nebo jakýkoli standardní kontejner knihovny, který definuje iterátory begina end.
  • Lambda výrazy.
Přidána možnost deklarovat výrazy lambda (bezejmenné funkce definované v místě aplikace), včetně těch, které závisí na externích proměnných (uzavření). Lambda výrazy mohou být přiřazeny proměnným a použity všude tam, kde je vyžadována funkce odpovídajícího typu, jako například ve standardních knihovních algoritmech.
  • Změny v popisu virtuálních metod.
Byl přidán volitelný modifikátor override, který se používá v deklaraci metody, která nahrazuje virtuální metodu nadřazené třídy. Popis substituce overridezpůsobí kontrolu přítomnosti nahrazované metody v nadřazené třídě a shodu v signaturách metody. Byl také přidán modifikátor final, jako v Javě, který zakazuje další nahrazování jím označené metody. Třídu lze také finaldeklarovat – v tomto případě je zakázáno z ní dědit nové třídy. Klíčové slovo je definováno pro konstantu - nulový ukazatel: nullptr. Změny byly provedeny v sémantice a částečně i v syntaxi výčtů a sjednocení. Byla přidána možnost vytvářet typově bezpečné výčty, z odborů byla odstraněna řada omezení struktury. Kompilátor musí správně analyzovat text programu s několika uzavíracími lomenými závorkami za sebou (dříve byla sekvence „ >>“ jednoznačně vnímána jako bitová operace posunu doprava, proto bylo v zápisu vnořených konstrukcí šablon vyžadováno k oddělení znaků „větší než“ mezerami nebo zalomením řádků).

Příklady programů

Příklad č. 1

Toto je ukázkový program Hello, world! , která vytiskne zprávu do konzole pomocí standardní knihovny a ukončí se.

#include <iostream> pomocí jmenného prostoru std ; int main () { cout << "Ahoj světe!" << endl ; návrat 0 ; }

Příklad č. 2

Moderní C++ umožňuje jednoduchým způsobem řešit složitější problémy. Tento příklad demonstruje mimo jiné použití kontejnerů Standard Template Library ( STL ).

#include <iostream> // pro použití std::cout #include <vector> // obsahuje dynamické pole #include <mapa> // obsahuje datový typ slovníku #include <řetězec> int main () { // Import všech deklarací ze jmenného prostoru "std" do globálního jmenného prostoru. pomocí jmenného prostoru std ; // Asociativní kontejner s řetězcovými klíči a daty deklarujeme jako řetězcové vektory. map < string , vector < string > > položky ; // Přidejte pár lidí do tohoto asociativního kontejneru a dejte jim nějaké položky. položky [ "Anya" ]. push_back ( "šátek" ); položky [ "Dmitry" ]. push_back ( "vstupenky" ); položky [ "Anya" ]. push_back ( "štěně" ); // Procházet všechny objekty v kontejneru pro ( const auto & person : items ) { // osoba je dvojice dvou objektů: osoba.první je její jméno, // osoba.druhá je seznam jejích položek (vektor řetězců) cout << osoba . první << " nese " << osobu . druhý . size () << "položky" << endl ; } }

Tento příklad pro zjednodušení importuje všechna jména ze jmenného prostoru std. Ve skutečném programu se to nedoporučuje, protože se můžete setkat s kolizemi jmen. Jazyk umožňuje importovat jednotlivé objekty:

#include <vektor> int main () { pomocí std :: vector ; vektor < int > muj_vektor ; }

V C++ (stejně jako v C), pokud provádění programu dosáhne konce funkce main(), pak je to ekvivalentní return 0;. To neplatí pro žádnou jinou funkci než main().

Srovnání s alternativními jazyky

Je známo několik studií, ve kterých byl učiněn pokus více či méně objektivně porovnat několik programovacích jazyků, z nichž jedním je C++. Zejména:

  • Ve vědeckém článku „Haskell vs. Ada vs. C++ vs. Awk vs. …“ Paul Hudak a Mark Jones [22] referují o studiu řady imperativních a funkcionálních jazyků na řešení modelového problému rychlého prototypování vojenského GIS systému.
  • Ve vědeckém článku čtyř autorů „Implementace DSL v metaocaml, template haskell a C++“ [23] je metodická studie využití C++ a dvou funkcionálních jazyků jako základních nástrojů pro jazykově orientované programování metodou generativního programování . se provádí .
  • Lutz Prehelt [24] uvažoval o sedmi jazycích (C, C++, Java, Perl, Python, Rexx a Tcl) za úkol napsat jednoduchý program pro převod telefonních čísel na slova podle určitých pravidel.
  • V článku Davida Whelera „Ada, C, C++ a Java vs. Steelman [25] porovnává jazyky Ada, C++, C, Java s dokumentem " Steelman " - seznam jazykových požadavků pro vojenský vývoj vestavěných systémů, který byl vyvinut High-Level Language Committee of Ministerstvo obrany USA v roce 1978. Přestože je tento dokument velmi zastaralý a nebere v úvahu mnoho podstatných vlastností moderních jazyků, srovnání ukazuje, že C++ se z hlediska souboru funkcí požadovaných v tomto odvětví příliš neliší od jazyků, které mohou být považovány za své skutečné konkurenty.
  • Článek Matthewa Formenta a Michaela Gillingse [26] popisuje studii [27] implementace v šesti jazycích — C++, C, C#, Java, Perl, Python — tří specifických algoritmů používaných v bioinformatice: metoda nejbližšího souseda , globální sekvenční zarovnání ( Needleman Algorithm - Wunsha ) a analýza výsledků BLAST .

C++ a Ada

Jazyk Ada je blízký C++, pokud jde o jeho sadu funkcí a oblastí použití: je to kompilovaný strukturální jazyk s objektově orientovaným doplňkem podobným Simule (stejný model „Algol s třídami“ jako v C++), statické typování , generické programovací nástroje, určené pro vývoj rozsáhlých a komplexních softwarových systémů. Zároveň je zásadně odlišná v ideologii: na rozdíl od C++ byla Ada postavena na základě dříve pečlivě propracovaných podmínek od komplexních výrobců softwaru se zvýšenými požadavky na spolehlivost, což zanechalo otisk v syntaxi a sémantice Jazyk.

Existuje jen málo přímých srovnání účinnosti kódování Ada a C++. Ve výše uvedeném článku [22] řešení modelového problému v Ada vedlo ke kódu přibližně o 30 % menší velikosti (v řádcích) než v C++. Srovnání vlastností samotných jazyků je uvedeno v mnoha zdrojích, například článek Jima Rogerse na AdaHome [28] uvádí více než 50 bodů rozdílů ve vlastnostech těchto jazyků, z nichž většina je ve prospěch Ady. (více funkcí, flexibilnější chování, menší pravděpodobnost chyb). Ačkoli jsou mnohé výroky příznivců Ady kontroverzní a některé z nich jsou zjevně zastaralé, lze obecně učinit závěr:

  • Syntaxe Ada je mnohem přísnější než C++. Jazyk vyžaduje dodržování disciplíny programování, nenabádá k „programátorským trikům“, vybízí k psaní jednoduchého, logického a snadno srozumitelného kódu, který se snadno udržuje.
  • Na rozdíl od C++ je Ada extrémně typově bezpečný. Vyvinutý systém typů umožňuje při dodržení disciplíny jejich deklarace a používání co nejúplněji staticky kontrolovat správnost použití dat a chrání před náhodnými chybami. Automatické převody typů jsou omezeny na minimum.
  • Ukazatele v Ada jsou mnohem přísněji kontrolovány než v C++ a aritmetika adres je dostupná pouze prostřednictvím samostatné systémové knihovny.
  • Vlastní moduly Ada jsou svou funkčností podobné šablonám C++, ale poskytují lepší kontrolu.
  • Ada má vestavěnou modularitu a standardizovaný samostatný systém kompilace, zatímco C++ používá zahrnutí textových souborů a externí kompilaci a ovládací prvky sestavení.
  • Vestavěný multitasking Ady zahrnuje paralelní úlohy a jejich komunikační mechanismus (vstupy, setkání, operátor select). V C++ je toto vše implementováno pouze na úrovni knihovny.
  • Ada je přísně standardizována, díky čemuž poskytuje lepší přenositelnost.

V článku Stephena Zeigera z Rational Software Corporation [29] se tvrdí, že vývoj v Ada je obecně o 60 % levnější a výsledkem je kód s 9krát méně vadami než v C. Ačkoli tyto výsledky nelze přímo přenést do C++, jsou stále zajímavé vzhledem k tomu, že mnoho nedostatků C++ je zděděno z C.

C++ a Java

Java nelze považovat za plnohodnotnou náhradu C++, je navržena jako bezpečný jazyk s nízkým vstupním prahem pro vývoj vlastních aplikací s vysokou přenositelností [30] a je zásadně nevhodná pro některé typy aplikací, které jsou vyvíjeny v C++. Java je však ve svém rozsahu velmi reálnou konkurencí C++. Výhody Java jsou běžně uváděny jako:

  • Zabezpečení: žádná podpora ukazatelů a aritmetiky adres, automatická správa paměti s garbage collection, vestavěná ochrana proti běžným chybám programů C++, jako je přetečení vyrovnávací paměti nebo přetečení pole.
  • Přítomnost vyvinutého systému modulů a samostatné kompilace, mnohem rychlejší a méně náchylná k chybám než preprocesor a ruční sestavení C++.
  • Plná standardizace a provádění na virtuálním stroji, vyvinuté prostředí včetně knihoven pro grafiku, uživatelské rozhraní, přístup k databázím a další typické úkoly ve výsledku - skutečná multiplatformnost.
  • Vestavěný multithreading.
  • Objektový subsystém Java v mnohem vyšší míře než C++ odpovídá základnímu principu OOP „ vše je objekt “. Rozhraní vám umožňují poskytovat většinu výhod vícenásobné dědičnosti, aniž by to mělo negativní dopady.
  • Reflexe je mnohem pokročilejší než v C++ a umožňuje skutečně definovat a měnit strukturu objektů za běhu programu.

Zároveň použití garbage collectoru a virtuálního stroje vytváří omezení, která je obtížné překonat. Java programy bývají pomalejší, vyžadují výrazně více paměti a virtuální stroj izoluje program od operačního systému, což znemožňuje nízkoúrovňové programování.

Empirická studie [24] nezjistila žádný významný rozdíl v rychlosti vývoje v C++ a Javě. Studie [26] také ukázala, že představa o výrazném rozdílu v rychlosti programů v těchto jazycích není vždy správná: ve dvou ze tří testů se rychlost aplikací v Javě a C++ ukázala jako srovnatelný. Java je přitom stručnější – rozdíl v množství kódu byl cca 10-15%.

C++ a C

Původní C se dále vyvíjí, vyvíjí se v něm mnoho rozsáhlých projektů: je hlavním jazykem pro vývoj operačních systémů, jsou v něm napsány herní enginy mnoha dynamických her a velké množství aplikačních aplikací. Řada odborníků tvrdí, že nahrazení C za C++ nezvýší efektivitu vývoje, ale vede ke zbytečné komplikaci projektu, snížení spolehlivosti a zvýšení nákladů na údržbu. Zejména:

  • Podle Linuse Torvaldse „C++ provokuje k psaní... značného množství kódu, který nemá zásadní význam z hlediska funkčnosti programu“ [názory 3] .
  • Podpora OOP, šablony a STL nejsou rozhodující výhodou C++, protože vše, k čemu se používají, je také implementováno pomocí nástrojů C. Zároveň odpadá nadýmání kódu a některé komplikace, které navíc zdaleka nejsou nutné, jsou kompenzovány větší flexibilitou, jednodušším testováním a lepšími ukazateli výkonu.
  • Automatizace přístupu k paměti v C++ zvyšuje náklady na paměť a zpomaluje programy.
  • Použití výjimek C++ vás nutí sledovat RAII , vede k růstu spustitelných souborů a zpomaluje programy. Další potíže vznikají u paralelních a distribuovaných programů. Je příznačné, že standard kódování C++ společnosti Google výslovně zakazuje používání výjimek [31] .
  • Kód C++ je obtížnější porozumět a testovat a ladění je ztíženo použitím složitých hierarchií tříd s dědičností chování a šablon. Kromě toho je v programovacích prostředích C++ více chyb, a to jak v kompilátorech, tak v knihovnách.
  • Mnoho detailů chování kódu není specifikováno standardem C++, což zhoršuje přenositelnost a může způsobit těžko dohledatelné chyby.
  • V C je podstatně více šikovných programátorů než v C++.

Neexistují žádné přesvědčivé důkazy o tom, že C++ je lepší než C, ať už z hlediska produktivity programátorů nebo vlastností programu. Přestože existují studie [32] uvádějící, že programátoři v jazyce C stráví asi 30–40 % z celkového času vývoje (bez ladění) správou paměti, při srovnání celkové produktivity vývojářů [22] jsou C a C++ blízko.

V nízkoúrovňovém programování se mnoho nových funkcí C++ stává nepoužitelnými kvůli zvýšené režii: virtuální funkce vyžadují dynamický výpočet reálné adresy (RVA), šablony vedou k nadýmání kódu a špatným možnostem optimalizace, run-time knihovna (RTL) je velmi velký a jeho odmítnutí připravuje o většinu funkcí C++ (i když jen kvůli nedostupnosti new/ operací delete). V důsledku toho se programátor bude muset omezit na funkce zděděné z C, takže je zbytečné používat C ++:

… jediný způsob, jak mít dobrý, efektivní, nízkoúrovňový, přenosný C++, je omezit se na všechny věci, které jsou v C triviálně dostupné. A omezení projektu na C bude znamenat, že ho lidé nezahodí a že bude k dispozici spousta programátorů, kteří opravdu dobře rozumí nízkoúrovňovým funkcím a neopouštějí je kvůli idiotskému „objektovému modelu“ nesmysl.
… když je prvořadá efektivita, budou „výhody“ C++ velkou chybou.

Linus Torvalds , [33]

C++ a funkční a skriptovací jazyky

V jednom experimentu [22] skriptovací a funkcionální jazyky, zejména Haskell , vykázaly 2-3násobný zisk v programovacím čase a velikosti kódu ve srovnání s programy v C++. Na druhou stranu, programy v C++ se ukázaly být stejně rychlejší. Autoři uznávají, že jejich data nepředstavují reprezentativní vzorek a zdržují se kategorických závěrů.

V jiném experimentu [34] vykázaly striktní funkcionální jazyky ( Standard ML , OCaml ) obecné zrychlení vývoje faktorem 10 (hlavně díky včasnému odhalení chyb) s přibližně stejnými ukazateli výkonu (mnoho kompilátorů v několika režimech bylo použitý).

Ve studii Lutze Prehelta [24] byly na základě výsledků zpracování cca 80 řešení sepsaných dobrovolníky získány zejména následující závěry:

  • Perl, Python, Rexx, Tcl poskytovaly dvojnásobnou rychlost vývoje než C, C++ a Java a výsledný kód byl také o polovinu kratší.
  • Programy ve skriptovacích jazycích spotřebovaly asi dvakrát více paměti než C/C++

Kritika

Ke kritice C++ obecně

Kritici se nejčastěji nestaví proti C++ žádnému jinému konkrétnímu jazyku, ale tvrdí, že odmítnutí použití jediného jazyka, který má četné nedostatky, ve prospěch rozložení projektu na dílčí úkoly, které lze vyřešit v různých jazycích, které jsou pro ně nejvhodnější. díky nim je vývoj výrazně méně časově náročný a zároveň zlepšují indikátory kvality programování [35] [36] . Ze stejného důvodu je kritizováno zachování kompatibility s C: pokud část úlohy vyžaduje nízkoúrovňové funkce, je rozumnější tuto část oddělit do samostatného subsystému a napsat ji v C.

Zastánci C++ zase tvrdí, že odstranění technických a organizačních problémů mezijazykové interakce prostřednictvím použití jednoho univerzálního jazyka namísto několika specializovaných je důležitější než ztráty z nedokonalosti tohoto univerzálního jazyka, tj. velmi široká sada funkcí C++ je omluvou pro nedostatky každé jednotlivé funkce; včetně nevýhod zděděných z C jsou odůvodněny výhodami kompatibility (viz výše ).

Stejné vlastnosti C++ - objem, složitost, eklekticismus a nedostatek specifického cílového výklenku aplikace - jsou tedy příznivci považovány za " hlavní výhodu " a kritiky za " hlavní nevýhodu ".

Kritika jednotlivých prvků a konceptů

Řízení chování

Ideologie jazyka zaměňuje „ kontrolu chování “ s „ kontrolou efektivity “: zásada „ neplatíte za to, co nepoužíváte “ naznačuje, že poskytnout programátorovi úplnou kontrolu nad všemi aspekty provádění programu na poměrně nízká úroveň je nezbytnou a postačující podmínkou pro dosažení vysoké účinnosti kódu. Ve skutečnosti to neplatí pro žádné velké programy: vnucování nízkoúrovňové optimalizace programátorovi, kterou je vysoce kvalitní kompilátor jazyka specifického pro doménu zjevně schopen provádět efektivněji, vede pouze ke zvýšení množství kódu, zvýšení náročnosti programování a snížení srozumitelnosti a testovatelnosti kódu. Zásada „neplaťte za nevyužité“ tedy ve skutečnosti neposkytuje požadované výhody v efektivitě, ale negativně ovlivňuje kvalitu.

Komponentové a objektově orientované programování

Podle Alana Kay je objektový model „ Algol s třídami“ používaný v C++ horší než model „všechno je objekt“ [37] používaný v Objective-C , pokud jde o celkový rozsah, opětovné použití kódu , srozumitelnost, modifikovatelnost a testovatelnost. .

Model dědičnosti C++ je složitý, obtížně implementovatelný a zároveň provokuje k vytváření složitých hierarchií s nepřirozenými vztahy mezi třídami (například dědičnost místo vnořování). Výsledkem je vytvoření těsně propojených tříd s nejasně oddělenými funkcemi. Například v [38] je uveden vzdělávací a doporučující příklad implementace třídy „list“ jako podtřídy třídy „prvek seznamu“, která naopak obsahuje přístupové funkce pro další prvky seznamu. Tento typový vztah je matematicky absurdní a nereprodukovatelný v přísnějších jazycích. Ideologie některých knihoven vyžaduje ruční přetypování typu nahoru a dolů v hierarchii tříd ( static_casta dynamic_cast), což porušuje typovou bezpečnost jazyka. Vysoká viskozita C++ řešení může vyžadovat, aby byly velké části projektu znovu vyvinuty s minimálními změnami později ve vývojovém procesu. Živý příklad takových problémů lze nalézt v [35]

Jak zdůrazňuje Ian Joyner [39] , C++ mylně staví rovnítko mezi zapouzdření (to znamená vkládání dat do objektů a oddělení implementace od rozhraní) a skrývání implementace. To komplikuje přístup k datům třídy a vyžaduje, aby její rozhraní bylo implementováno téměř výhradně prostřednictvím funkcí přístupového objektu (což naopak zvyšuje množství kódu a komplikuje jej).

Shoda typů v C++ je definována na úrovni identifikátorů, nikoli podpisů. To znemožňuje výměnu komponent na základě párování rozhraní, a proto zahrnutí nové funkcionality implementované na úrovni knihovny do systému vyžaduje ruční úpravu stávajícího kódu [40] . Jak podotýká Linus Torvalds [33] , v C++ se „kód jeví jako abstraktní, pouze pokud ho není třeba měnit.“

Kritika C++ z hlediska OOP je uvedena v [39] .

Metaprogramování

Generativní metaprogramování C++ je založeno na šablonách a preprocesorech , je náročné na práci a má omezený rozsah. Šablonový systém C++ je ve skutečnosti variantou primitivního funkcionálního programovacího jazyka v době kompilace . Tento jazyk se téměř nijak nepřekrývá se samotným C++, a proto je potenciál pro růst komplexnosti abstrakcí omezený. Programy, které používají šablony C++, jsou extrémně špatně srozumitelné a testovatelné a samotné rozbalování šablon generuje neefektivní kód, protože jazyk šablon neposkytuje žádné prostředky pro optimalizaci (viz také sekci #Výpočetní efektivita ). Takto implementované jazyky specifické pro vestavěné domény stále vyžadují znalost samotného C++, což neposkytuje plnohodnotnou dělbu práce. Schopnost C++ rozšiřovat schopnosti samotného C++ je tedy značně omezená [41] [42] .

Multiplatformní

Psaní přenosného C++ kódu vyžaduje velké množství dovedností a zkušeností a „nedbalý“ kód C++ je vysoce pravděpodobně nepřenosný [43] . Podle Linuse Torvaldse , aby dosáhl C++ přenositelnosti podobné C, musí se programátor omezit na vlastnosti C++ zděděné z C [33] . Standard obsahuje mnoho prvků definovaných jako „implementation-defined“ (například velikost ukazatelů na metody tříd v různých kompilátorech se pohybuje od 4 do 20 bajtů [44] ), což zhoršuje přenositelnost programů, které je používají.

Direktivní povaha jazykové standardizace , neúplná zpětná kompatibilita a nekonzistence požadavků různých verzí standardu vedou k problémům při portování programů mezi různými kompilátory a dokonce i verzemi stejných kompilátorů.

Nedostatek příležitostí

Reflexní metaprogramování Introspekce v C++ je implementována odděleně od hlavního typového systému, takže je téměř zbytečná. To největší, co lze získat, je parametrizace chování na dříve známé sadě možností. To brání použití C++ ve většině přístupů k implementaci umělé inteligence . Funkcionální programování Explicitní podpora funkcionálního programování je přítomna pouze ve standardu C++0x , dříve mezeru zaplňovaly knihovny ( Loki , Boost ), které používají jazyk šablon, ale jejich kvalita je výrazně nižší než u řešení zabudovaných do funkcionálních jazyků [vysvětlivky 1] , stejně jako kvalitu implementací funkcí C++ (jako je OOP) prostřednictvím funkcionálních jazyků. Možnosti FP implementované v C++ neumožňují použití optimalizačních technik vlastní funkcionálnímu programování , ale jsou omezeny na volání funkčních knihoven a implementaci jednotlivých metod. To má malou nebo žádnou výhodu v návrhu programu (viz korespondence Curry-Howard ).

Nadbytečné a nebezpečné příležitosti

Vestavěné bypassy

Jazyk obsahuje nástroje, které umožňují programátorovi porušit disciplínu programování danou v konkrétním případě. Modifikátor například constnastavuje vlastnost neměnnosti stavu pro objekt, ale modifikátor mutableje navržen speciálně tak, aby vynutil povolení ke změně stavu uvnitř objektu const, to znamená, že porušuje omezení constness. Navíc je povoleno dynamicky odstraňovat atribut constz konstantního objektu a přeměňovat jej na L-hodnotu. Přítomnost takových funkcí v jazyce činí pokusy o formální ověření kódu nesmyslnými a použití omezení pro optimalizaci je nemožné.

Neřízená substituce maker

Zařízení C makro substituce ( #define) jsou stejně výkonné jako nebezpečné. V C++ jsou zachovány i přesto, že pro všechny úlohy, pro které byly v C poskytnuty, C++ poskytovalo přísnější a specializovanější možnosti – šablony, přetěžování funkcí, inline funkce, jmenné prostory, pokročilejší psaní, rozšíření aplikace modifikátor const , atd. Ve standardních knihovnách zděděných z C [45] je mnoho potenciálně nebezpečných maker . Metaprogramování šablon je také někdy kombinováno s použitím makro substituce k zajištění tzv. „ syntaktický cukr “.

Problémy s přetížením

Principy C++ funkce a přetěžování operátorů vedou k výraznému zdvojování kódu. Původně zamýšlel zavést takzvaný " syntaktický cukr ", přetěžování operátorů v C++ podporuje nekontrolované chování elementárních operátorů pro různé typy. To dramaticky zvyšuje riziko chyb, zejména proto, že není možné zavést novou syntaxi a změnit stávající (například vytvořit nové operátory nebo změnit priority nebo asociativitu), přestože syntaxe standardních operátorů C++ je adekvátní sémantika zdaleka ne všech typů, které může být nutné zavést do programu. Některé problémy vytváří možnost snadného přetížení operátorů / , které může generovat extrémně záludné a těžko dohledatelné chyby. Některé intuitivně očekávané operace (čištění dynamických objektů v případě házení výjimek) se přitom v C++ neprovádějí a značná část přetížených funkcí a operátorů se volá implicitně (typování, vytváření dočasných instancí tříd atd.). .). V důsledku toho se nástroje původně určené k zpřehlednění programů a zlepšení vývoje a udržovatelnosti stávají dalším zdrojem zbytečně komplikovaného a nespolehlivého kódu. newdelete

Výpočetní účinnost

Výsledné množství spustitelného kódu

Použití šablon C++ je parametrický polymorfismus na úrovni zdrojového kódu, ale při překladu se změní na ad hoc polymorfismus (tj. přetížení funkcí), což vede k výraznému nárůstu množství strojového kódu ve srovnání s jazyky, které mají skutečný polymorfní typový systém (potomci ML ). Pro zmenšení velikosti strojového kódu se snaží automaticky zpracovat zdrojový kód ještě před fází odvíjení šablon [46] [47] . Dalším řešením by mohla být možnost exportu šablon, která byla standardizována již v roce 1998, ale není dostupná ve všech kompilátorech, protože je obtížné ji implementovat [48] [49] [názory 4] a importovat knihovny šablon C++ do jazyků s výrazně odlišnou sémantikou C++ by to bylo stejně k ničemu. Zastánci C++ zpochybňují rozsah nadýmání kódu jako přehnaného [50] , dokonce ignorují skutečnost, že v C je parametrický polymorfismus překládán přímo, to znamená, že se vůbec neduplikují těla funkcí. Příznivci C++ se přitom domnívají, že parametrický polymorfismus v C je nebezpečný – tedy nebezpečnější než přechod z C do C++ (odpůrci C++ tvrdí opak – viz výše).

Potenciál optimalizace

Kvůli slabému typovému systému a množství vedlejších efektů je extrémně obtížné ekvivalentně převádět programy, a proto do kompilátoru vložit mnoho optimalizačních algoritmů, jako je automatická paralelizace programů , odstranění běžných podvýrazů , λ-lifting, volání na procedury s pokračováním předávání , superkompilace atd. V důsledku toho je skutečná efektivita programů C++ omezena dovednostmi programátorů a úsilím vloženým do konkrétního projektu a „nedbalá“ implementace může být v efektivitě výrazně nižší než „nedbalá“ ” implementace v jazycích vyšší úrovně, což potvrzují srovnávací testy jazyků [34] . To je významná bariéra proti použití C++ v průmyslu dolování dat .

Efektivní správa paměti

Odpovědnost za efektivní správu paměti leží na bedrech vývojáře a závisí na dovednostech vývojáře. Pro automatickou správu paměti v C++, tzv. "chytré ukazatele", ruční správa paměti snižuje efektivitu samotných programátorů (viz sekce Efektivita ) . Četné implementace garbage collection , jako je statická inference regionů , nejsou použitelné pro C++ programy (přesněji to vyžaduje implementaci nového jazykového interpreteru nad jazykem C++, který se od C++ velmi liší ve většině objektivních vlastností. a obecně ideologie) kvůli potřebě přímého přístupu k AST .

Účinnost

Korelace výkonnostních faktorů s náklady na vývoj, stejně jako obecná disciplína a kultura programování pěstovaná v programátorské komunitě, jsou důležité pro zákazníky, kteří si pro implementaci svých projektů zvolí jazyk (a podle toho preferují tento jazyk vývojářů). stejně jako pro lidi, kteří se začínají učit programování, zejména se záměrem programovat pro své vlastní potřeby.

Kvalita a kultura programování

Zásada C++ " nevnucovat" dobrý "styl programování " je v rozporu s průmyslovým přístupem k programování, v němž hlavní roli hraje kvalita softwaru a možnost údržby kódu nejen ze strany autora a u kterých jazyků, které minimalizují vliv lidského faktoru , jsou preferovány , tedy jen „ vnucování ‚dobrého‘ stylu programování “, i když takové jazyky mohou mít vyšší vstupní práh.

Panuje názor, že preference používání C++ (s možností volby alternativních jazyků) negativně charakterizuje profesionální kvality programátora. Konkrétně Linus Torvalds říká, že používá kladné názory kandidátů na C++ jako kritérium opuštění [názory 3] :

C++ je hrozný jazyk. Co to dělá ještě děsivějším, je fakt, že to používá spousta podgramotných programátorů... Upřímně řečeno, i když není důvod si vybrat C jiný, než nechat programátory C++ pryč, to samo o sobě by byl dost dobrý důvod, proč používat C.
…Došel jsem k závěru, že bych opravdu nejraději vykopl každého, kdo by raději vyvíjel projekt v C++ než v C, aby tento člověk nezruinoval projekt, na kterém se podílím.

Linus Torvalds , [33] Oprava defektu

Neustálý vývoj jazyka povzbuzuje (a někdy i nutí) programátory, aby znovu a znovu měnili již odladěný kód – to nejen zvyšuje náklady na vývoj, ale také přináší riziko vnesení nových chyb do odladěného kódu. Konkrétně, ačkoliv byla zpětná kompatibilita s C původně jedním ze základních principů C++, od roku 1999 C přestalo být podmnožinou C++, takže odladěný kód C již nelze bez úprav použít v projektu C++.

Složitost sama o sobě

C++ je svými obhájci definováno jako „nejmocnější“ právě proto , že je plné nebezpečných, vzájemně si odporujících funkcí. Podle Erica Raymonda to dělá ze samotného jazyka základ pro osobní sebepotvrzení programátorů, čímž se proces vývoje stává cílem sám o sobě:

Programátoři jsou často okázalí jedinci, kteří se pyšní... svou schopností zvládat složitost a obratně zvládat abstrakce. Často spolu soutěží a snaží se přijít na to, kdo dokáže vytvořit „nejsložitější a nejkrásnější složitosti“. ... soupeři se domnívají, že musí konkurovat cizím „ozdobám“ přidáním svých vlastních. Docela brzy se „masivní nádor“ stane průmyslovým standardem a každý provozuje velké, zabugované programy, které ani jejich tvůrci nemohou uspokojit.

… tento přístup se může dostat do problémů, pokud programátoři dělají jednoduché věci složitým způsobem, jednoduše proto, že tyto způsoby znají a vědí, jak je používat.

Eric Raymond v [51] Sabotáž

Byly zaznamenány případy, kdy neopatrní programátoři, využívající silnou kontextovou závislost C++ a nedostatek schopnosti sledovat definice maker kompilátorem, zpomalili vývoj projektu tím, že napsali jednu nebo dvě navíc, správně z pohledu kompilátoru. pohledu, řádky kódu, ale zavádění těžko odhalitelné spontánně se projevující chyby na jejich úkor. Například:

#define if(a) if(rand())


#definuj ji

V jazycích s prokázanou správností , dokonce i s pokročilými funkcemi maker, není možné takto poškodit.

Nespolehlivý výrobek

Nepřiměřené množství vedlejších efektů v kombinaci s nedostatkem kontroly z běhového systému jazyka a slabým typem systému činí programy C++ náchylnými k nepředvídatelným fatálním pádům (známé pády se zprávami jako „Porušení přístupu“, „Čistá virtuální funkce“ call" nebo "Program provedl neplatnou operaci a bude ukončen"), což vylučuje použití C++ s vysokými požadavky na odolnost proti chybám. Navíc prodlužuje trvání samotného vývojového procesu [34] .

Projektový management

Výše uvedené faktory dělají ze složitosti projektového řízení v C++ jednu z nejvyšších v odvětví vývoje softwaru.

James Coggins, čtyřletý komentátor The C++ Report , vysvětluje:
 Problém je v tom, že OOP programátoři experimentují s incestními aplikacemi a snaží se o nízkou úroveň abstrakce. Například vytvořili třídy jako „propojený seznam“ namísto „uživatelské rozhraní“ nebo „paprskový paprsek“ nebo „model konečných prvků“. Bohužel, silná kontrola typu, která pomáhá programátorům C++ vyhnout se chybám, také ztěžuje vytváření velkých objektů z malých.

F. Brooks , Měsíc mýtického člověka

Vliv a alternativy

Jediným přímým potomkem C++ je jazyk D , který má být přepracováním C++, aby se vyřešil jeho nejzjevnější problémy. Autoři opustili kompatibilitu s C, zachovali syntaxi a mnoho základních principů C++ a zavedli do jazyka vlastnosti, které jsou charakteristické pro nové jazyky. D nemá žádný preprocesor, žádné hlavičkové soubory, žádnou vícenásobnou dědičnost, ale systém modulů, rozhraní, asociativní pole, podporu unicode v řetězcích, garbage collection (při zachování možnosti ruční správy paměti), vestavěný multithreading, typ inference , explicitní deklarace čistých funkcí a neměnných hodnot. Použití D je velmi omezené, nelze jej považovat za skutečnou konkurenci C++.

Nejstarším konkurentem C++ v nízkoúrovňových úlohách je Objective-C , rovněž postavený na principu kombinace C s objektovým modelem, pouze objektový model je zděděn ze Smalltalku . Objective-C, stejně jako jeho potomek Swift , je široce používán pro vývoj softwaru pro macOS a iOS.

Jednou z prvních alternativ k C++ v programování aplikací byl jazyk Java . Často je mylně považován za přímého potomka C++; ve skutečnosti je sémantika Javy zděděna z jazyka Modula-2 a základní sémantika C++ není v Javě dohledatelná. Vzhledem k tomu a ke genealogii jazyků (Modula-2 je potomkem Simula , jako C++, ale není to C), je Java správněji nazývána „ druhým bratrancem “ C++, spíše než „ dědicem “. Totéž lze říci o jazyce C# , i když procento afinity s C++ je o něco vyšší než u Javy.

Pokusem spojit bezpečnost a rychlost vývoje Javy a C# s možnostmi C++ byl dialekt Managed C++ (později C++/CLI ). Byl vyvinut společností Microsoft především pro portování stávajících projektů C++ na platformu Microsoft .NET. Programy běží pod CLR a mohou využívat celé pole .NET knihoven, ale existuje řada omezení pro použití funkcí C++, což efektivně redukuje C++ na C#. Tento dialekt nezískal široké uznání a používá se hlavně k propojení knihoven napsaných v čistém C++ s aplikacemi C#.

Alternativním způsobem vývoje jazyka C je kombinovat jej nikoli s objektově orientovaným programováním, ale s aplikačním programováním , tedy zlepšením abstrakce, přísnosti a modularity nízkoúrovňových programů poskytováním předvídatelného chování a referenční transparentnosti . Příklady práce v tomto duchu jsou jazyky BitC , Cyclone a Limbo . I když existují i ​​úspěšné pokusy využít FP v problémech v reálném čase bez integrace s nástroji C [52] [53] [54] , stále v tuto chvíli (2013) v nízkoúrovňovém vývoji je používání nástrojů C do určité míry má lepší poměr pracovní náročnosti a efektivity. Vývojáři Pythonu a Lua vynaložili velké úsilí na Python a Lua , aby zajistili, že tyto jazyky budou používány programátory C++, takže ze všech jazyků, které úzce souvisejí s FP, jsou to ty nejčastěji poznamenalo se, že se používá ve spojení s C++ ve stejném projektu. Nejvýznamnějšími styčnými body mezi C++ a FP jsou vazby wxWidgets a knihoven Qt vyvinutých v C++ s ideologií specifickou pro C++ na Lisp , Haskell a Python (ve většině případů jsou vazby na funkční jazyky vytvořeny pro knihovny napsané v C nebo jiné funkční jazyky).

Dalším jazykem považovaným za konkurenta C++ je Nemerle , který je výsledkem pokusu zkombinovat typovací model Hindley-Milner a makro podmnožinu Common Lisp s C# [55] . Ve stejném duchu je F# od Microsoftu  , dialekt ML přizpůsobený pro prostředí .NET.

Pokusem o vytvoření průmyslové náhrady za C/C++ byl programovací jazyk Go vyvinutý společností Google v roce 2009 . Autoři jazyka přímo upozorňují, že motivem jeho vzniku byly nedostatky vývojového procesu způsobené zvláštnostmi jazyků C a C++ [56] . Go je kompaktní, nekomplikovaný imperativní jazyk se syntaxí podobnou C, žádný preprocesor, statické psaní, silné psaní, balicí systém, automatická správa paměti, některé funkční vlastnosti, ekonomicky vybudovaný OOP subsystém bez podpory dědičnosti implementace, ale s rozhraními a kachním psaním , vestavěný multithreading založený na coroutines a rourách (a-la Occam ). Jazyk je umístěn jako alternativa k C++, tedy především prostředek pro skupinový vývoj vysoce komplexních vysoce komplexních výpočetních systémů, včetně distribuovaných, umožňujících v případě potřeby nízkoúrovňové programování.

Ve stejném ekologickém výklenku s C/C++ je Rust, vyvinutý v roce 2010 a spravovaný Mozilla Corporation , zaměřený na bezpečnou správu paměti bez použití garbage collectoru . Konkrétně plány na částečné nahrazení C/C++ Rustem byly oznámeny v roce 2019 společností Microsoft [57] .

Viz také

Poznámky

  1. ISO/IEC 14882:2020 Programovací jazyky ​​- C++ - 2020.
  2. Gubina G. G. Počítačová angličtina. Část I. Počítačová angličtina. Část I. Tutoriál . — S. 385. Archivováno 3. prosince 2017 na Wayback Machine
  3. Nejčastější dotazy Bjarna Stroustrupa  . Bjarne Stroustrup (1. října 2017). - "Název C++ (vyslovuje se "viz plus plus")". Datum přístupu: 4. prosince 2017. Archivováno z originálu 6. února 2016.
  4. Schildt, 1998 .
  5. 1 2 Stroustrup, 1999 , 2.1. Co je C++?, str. 57.
  6. Stanley Lippman, Pure C++: Dobrý den, C++/CLI Archivováno 6. června 2011 na Wayback Machine 
  7. 1 2 Stroustrup, 1999 , 1.4. Historické poznámky, str. 46.
  8. C++-Standardy . Získáno 14. listopadu 2010. Archivováno z originálu 20. listopadu 2010.
  9. Bjarne Stroustrup. C++ Glosář (nedostupný odkaz) . Získáno 8. června 2007. Archivováno z originálu 1. května 2011. 
  10. Kde najdu aktuální standardní dokumenty C nebo C++? http://stackoverflow.com/questions/81656/where-do-i-find-the-current-c-or-c-standard-documents Archivováno 29. listopadu 2015 na Wayback Machine
  11. Viz seznam na http://en.cppreference.com/w/cpp/experimental Archivováno 18. listopadu 2015 na Wayback Machine Navštíveno 5. ledna 2015.
  12. Yandex organizuje pracovní skupinu pro standardizaci jazyka C++ . ICS Media. Získáno 29. srpna 2018. Archivováno z originálu dne 29. srpna 2018.
  13. Stroustrup, The Design and Evolution of C++, 2007 .
  14. ISO/IEC 14882:1998, oddíl 6.4, klauzule 4: „Hodnota podmínky , která je inicializovanou deklarací v jiném příkazu než switchpříkaz, je hodnota deklarované proměnné implicitně převedená na bool... Hodnota podmínky to je výraz je hodnota výrazu, implicitně převedená na boolpro jiné příkazy než switch; pokud je tato konverze špatně vytvořená, program je špatně vytvořený“.
  15. STLport: Vítejte! . Získáno 26. července 2007. Archivováno z originálu dne 7. června 2018.
  16. Stroustrup, 1999 , 1.6.
  17. std::vector - cppreference.com . Datum přístupu: 28. listopadu 2015. Archivováno z originálu 27. listopadu 2015.
  18. std::realloc - cppreference.com . Datum přístupu: 28. listopadu 2015. Archivováno z originálu 4. prosince 2015.
  19. B. Stroustrup rozhovor s LinuxWorld.com . Získáno 4. ledna 2013. Archivováno z originálu 27. ledna 2013.
  20. Rozhovor B. Stroustrupa pro časopis System Administrator . Datum přístupu: 4. ledna 2013. Archivováno z originálu 9. února 2013.
  21. CNews: Exkluzivní rozhovor s tvůrcem programovacího jazyka C++ (odkaz není k dispozici) . Staženo 1. listopadu 2019. Archivováno z originálu 17. března 2015. 
  22. 1 2 3 4 Experiment s produktivitou softwarového prototypování. Paul Hudák, Mark P. Jones. Yale University, Department of Computer Science, New Haven, CT 06518. 4. července 1994.
  23. K. Czarnecki, J. O'Donnell, J. Striegnitz, W. Taha. Implementace DSL v metaocaml, šabloně haskell a C++ . — University of Waterloo, University of Glasgow, Research Center Julich, Rice University, 2004. Archivováno z originálu 7. dubna 2022. .
    Citace: C++ Template Metaprogramming trpí řadou omezení, včetně problémů s přenositelností způsobených omezeními kompilátoru (ačkoli se to v posledních několika letech výrazně zlepšilo), nedostatkem podpory ladění nebo IO během vytváření šablony, dlouhými časy kompilace, dlouhými a nepochopitelnými chybami. , špatná čitelnost kódu a špatné hlášení chyb.
  24. 1 2 3 Lutz Prechelt ( Universität Karlsruhe ). Empirické srovnání jazyků C, C++, Java, Perl, Python, Rexx a Tcl pro program pro vyhledávání/zpracování řetězců  ( pdf) Freie Universität Berlin (14. března 2000). Získáno 20. listopadu 2019. Archivováno z originálu 3. ledna 2020.
  25. Ada, C, C++ a Java vs. The Steelman" David A. Wheeler červenec/srpen 1997 (odkaz není k dispozici) . Získáno 23. března 2019. Archivováno z originálu dne 23. března 2019. 
  26. 1 2 "Porovnání běžných programovacích jazyků používaných v bioinformatice" . Získáno 2. září 2021. Archivováno z originálu dne 2. září 2021.
  27. Porovnání programovacích jazyků při implementaci bioinformatických algoritmů - popis experimentu. . Získáno 2. září 2021. Archivováno z originálu dne 2. září 2021.
  28. Porovnání funkcí Ada a C++ (cs) . Získáno 23. března 2019. Archivováno z originálu dne 23. března 2019.
  29. Stephen Zeigler, Porovnání vývojových nákladů C a Ada. Archivováno z originálu 4. dubna 2007.
  30. 1.2 Cíle návrhu programovacího jazyka Java™ .  Jazykové prostředí Java . Oracle (1. ledna 1999) . Získáno 14. ledna 2013. Archivováno z originálu 23. ledna 2013.
  31. Průvodce styly Google C++. Výjimky. . Získáno 31. března 2019. Archivováno z originálu dne 16. března 2019.
  32. Boehm H. Výhody a nevýhody konzervativního sběru odpadu . Archivováno z originálu 24. července 2013.
    (odkaz od Raymond, Eric . The Art of Unix Programming. - 2005. - s. 357. - 544 s. - ISBN 5-8459-0791-8 . )
  33. 1 2 3 4 Otevřená korespondence gmane.comp.version-control.git ze dne 09.06.2007 (nepřístupný odkaz) . Získáno 5. srpna 2013. Archivováno z originálu 9. prosince 2013. 
  34. 1 2 3 Porovnání jazyků Ray Tracer (benchmark programovacích jazyků - ffconsultancy.com/languages/ray_tracer/)
  35. 12 Martin Ward . Jazykově orientované programování . - Computer Science Department, Science Labs, 1994. Archivováno z originálu 4. března 2016.
  36. Pavel Hudák. Modulární jazyky a nástroje specifické pro doménu. — Katedra počítačových věd, Yale University.
  37. Definice objektově orientovaného programování Alana Kaye (odkaz není dostupný) . Datum přístupu: 5. srpna 2013. Archivováno z originálu 24. srpna 2013. 
  38. Schildt, C++ Theory and Practice, 1996 , s. 64-67.
  39. 12 Ian Joyner . Kritika C++ a programování a jazykové trendy 90. let – 3. vydání . - autorská práva a seznam publikací . Archivováno z originálu 25. listopadu 2013.
  40. Paulson, Lawrence C. ML pro pracujícího programátora, 2. vydání. - University of Cambridge: Cambridge University Press, 1996. - ISBN 0-521-57050-6 (pevná vazba), 0-521-56543-X (brožovaná). , c.271-285
  41. Walid Taha. Jazyky specifické pro doménu . — Katedra informatiky, Rice University. Archivováno z originálu 24. října 2013.
  42. Lugovsky VS Použití hierarchie doménově specifických jazyků při návrhu komplexních softwarových systémů . - 2008. Archivováno 10. srpna 2016.
  43. Andrej Karpov. 20 Úskalí portování kódu C++ na 64bitovou platformu . - RSDN Magazine #1-2007, 2007. Archivováno z originálu 2. dubna 2015.
  44. Don Clugston, CSG Solar Pty Ltd (přeložil Denis Bulichenko). Ukazatele na členské funkce a nejrychlejší implementace delegátů v C++ . — Časopis RSDN č. 6-2004. Archivováno z originálu 19. října 2013.
  45. Stroustrup, Programming: C++ Principles and Practice, 2001
  46. Dave Gottner. Šablony bez nadýmání kódu . — Dr. Dobb's Journal , leden 1995. Archivováno z originálu 7. června 2008.
  47. Adrian Stone. Minimalizace nadýmání kódu: Redundantní vytvoření instance šablony (downlink) . Game Angst (22. září 2009). Datum přístupu: 19. ledna 2010. Archivováno z originálu 8. prosince 2011. 
  48. Herb Sutter . Souhrn shody C++ . — Dr. Dobb's Journal , leden 2001. Archivováno z originálu 15. ledna 2009.
  49. Existují nějaké kompilátory, které toto vše implementují? (nedostupný odkaz) . comp.std.c++ často kladené otázky / Jazyk C++ . Comeau Computing (10. prosince 2008). Datum přístupu: 19. ledna 2010. Archivováno z originálu 30. dubna 2009. 
  50. Scott Meyers . Kód nafouklý kvůli šablonám . comp.lang.c++.moderováno . Usenet (16. května 2002). Staženo: 19. ledna 2010.
  51. Eric Raymond . Umění programování pro Unix = The Art of Unix. - Williams, 2005. - ISBN 5-8459-0791-8 .
  52. Zhanyong Wan a Paul Hudak. Event-Driven FRP  // Katedra informatiky, Yale University. Archivováno z originálu 16. srpna 2011.
  53. Walid Taha  (anglicky)  (odkaz není k dispozici) . School of Engineering Rice University . Získáno 20. listopadu 2019. Archivováno z originálu 13. srpna 2013.
  54. MLKit (downlink) . Získáno 30. července 2013. Archivováno z originálu 17. září 2013. 
  55. Chistyakov Vlad aka VladD2. Syntaktický cukr nebo C++ vs. Nemerle :)  // RSDN Magazine #1-2006. - 24.05.2006. Archivováno z originálu 13. prosince 2013.
  56. Přejděte na Google: Jazykový design ve službách softwarového inženýrství . talks.golang.org. Získáno 19. září 2017. Archivováno z originálu 25. ledna 2021.
  57. Catalin Cimpanu. Microsoft prozkoumat pomocí Rust  . ZDNet (17. června 2019). Získáno 26. září 2019. Archivováno z originálu 15. října 2019.
Názory
  1. Popularita programovacího jazyka (nepřístupný odkaz) (2009). Datum přístupu: 16. ledna 2009. Archivováno z originálu 16. ledna 2009. 
  2. TIOBE Programming Community Index (odkaz není k dispozici) (2009). Získáno 6. května 2009. Archivováno z originálu 4. května 2009. 
  3. 1 2 Otevřená korespondence gmane.comp.version-control.git ze dne 09.06.2007 (nepřístupný odkaz) . Získáno 5. srpna 2013. Archivováno z originálu 9. prosince 2013. 
  4. vanDooren. Klíčové slovo dne v C++: export (nedostupný odkaz) . Blogs@MSMVPs (24. září 2008). „Klíčové slovo export je trochu jako Higgsův boson v C++. Teoreticky existuje, je popsán standardem a nikdo ho ve volné přírodě neviděl. … Na světě existuje 1 front-end kompilátoru C++, který to skutečně podporuje.“ Datum přístupu: 19. ledna 2010. Archivováno z originálu 6. května 2009. 
Vysvětlivky
  1. Například, Boost.Lambdaprodáváno jako lambda funkce, ale C++ neimplementuje Churchův lambda kalkul v jeho celistvosti; imitace kombinátorů prostřednictvím šablonovacího jazyka je příliš obtížné očekávat jejich použití v praxi; pokračování zděděná z C jsou považována za neideomatická a nebezpečná a jejich implementace prostřednictvím jazyka šablon je nemožná; navíc použití λ-lifting k optimalizaci C++ není možné – takže je to vlastně Boost.Lambda jen anonymní funkce, nikoli objekt lambda kalkulu.

Literatura

  • Bjorn Stroustrup . Programovací jazyk C++ = Programovací jazyk C++ / Per. z angličtiny. - 3. vyd. - Petrohrad. ; M. : Něvský dialekt - Binom , 1999. - 991 s. - 3000 výtisků.  — ISBN 5-7940-0031-7 (Něvský dialekt), ISBN 5-7989-0127-0 (Binom), ISBN 0-201-88954-4 (anglicky).
  • Bjorn Stroustrup . C++ programovací jazyk. Special Edition = Programovací jazyk C++. speciální edice. - M. : Binom-Press, 2007. - 1104 s. — ISBN 5-7989-0223-4 .
  • Bjorn Stroustrup . Programming: Principles and Practice Using C++, Revised Edition = Programming: Principles and Practice Using C++. — M .: Williams , 2011. — S. 1248. — ISBN 978-5-8459-1705-8 .
  • Bjorn Stroustrup . Design and Evolution of C++ = The Design and Evolution of C++. - Petrohrad. : Peter, 2007. - 445 s. — ISBN 5-469-01217-4 .
  • Bjorn Stroustrup . C++ programovací jazyk. Krátký kurz. - 2019. - 320 s. - ISBN 978-5-907144-12-5 .
  • Bjorn Stroustrup . Programování: principy a praxe v C++. - 2016. - 1328 s. - ISBN 978-5-8459-1949-6 .
  • Siddhártha Rao. Naučte se C++ za jednu hodinu denně, 7. vydání (C++11) = Sams Naučte se C++ za hodinu denně, 7. vydání. - M. : "Williams" , 2013. - 688 s. — ISBN 978-5-8459-1825-3 .
  • Stephens D. R. C++. Sbírka receptů. - KUDITS-PRESS, 2007. - 624 s. - ISBN 5-91136-030-6 .
  • Štěpán Prata. Programovací jazyk C++ (C++11). Přednášky a cvičení = C++ Primer Plus, 6. vydání (Knihovna pro vývojáře). - 6. vyd. — M. : Williams , 2012. — 1248 s. - ISBN 978-5-8459-1778-2 .
  • Štěpán Prata. Programovací jazyk C. Přednášky a cvičení. — M. : Williams , 2015. — 928 s. - ISBN 978-5-8459-1950-2 .
  • Ivor Horton. Visual C ++ 2010: celý kurz = Ivor Horton's Beginning Visual C ++ 2010. - M . : Dialectics , 2010. - S. 1216. - ISBN 978-5-8459-1698-3 .
  • Herbert Schildt . Úplný odkaz na C++ = C++: Úplný odkaz. - 4. vyd. - M .: Williams , 2011. - S. 800. - ISBN 978-5-8459-0489-8 .
  • Herbert Schildt . Teorie a praxe C++ = Schildt's Expert C++. - Petrohrad. : BHV - Petrohrad, 1996. - ISBN 0-07-882209-2 , 5-7791-0029-2.
  • PJ Plauger. Programovací jazyk Guessing Games - Pokud je C++ odpovědí, jaká je otázka? // Dr. Dobbův deník . -říjen 1993.
  • The Unix-Haters Handbook  (neurčité) . - International Data Group , 1994.
  • Ian Joyner. Kritika C++ a programování a jazykové trendy 90. let - 3. vydání  // copyright a seznam publikací . — 1996.
  • Scott Meyers. Efektivní moderní C++: 42 doporučení pro používání C++11 a C++14 = Efektivní moderní C++: 42 konkrétních způsobů, jak zlepšit používání C++11 a C++14 / Per. z angličtiny. - Williams, 2016. - 304 s. - ISBN 978-5-8459-2000-3 .
  • Herbert Schildt . C++ The Complete Reference Třetí vydání. - Osborne McGraw-Hill, 1998. - ISBN 978-0-07-882476-0 .
  • Jeremy A. Hansen The Rook's Guide to C++ (A Creative Commons-Licensed Učebnice) .

Odkazy

  • isocpp.org ​(  angličtina) - oficiální stránky C++