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.
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 |
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 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] .
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] .
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:
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.
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++.
V C++ jsou k dispozici následující vestavěné typy. Typy C++ jsou téměř totožné s datovými typy C :
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 &&).
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.
C++ podporuje dynamický polymorfismus a parametrický polymorfismus .
Parametrický polymorfismus je reprezentován:
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í 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:
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."
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 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 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.
Standardní knihovna obsahuje následující sekce:
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:
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.
Volba C jako základu pro vytvoření nového programovacího jazyka je vysvětlena skutečností, že jazyk C:
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ů:
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.
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 ; }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++:
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 .
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í:
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 ; }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().
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:
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:
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.
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:
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%.
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:
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.
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:
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 ".
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ů.
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 makerZaří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ímPrincipy 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
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 optimalizaceKvů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ětiOdpově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 .
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.
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.
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())V jazycích s prokázanou správností , dokonce i s pokročilými funkcemi maker, není možné takto poškodit.
Nespolehlivý výrobekNepř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ý managementVýš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.
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] .
Slovníky a encyklopedie | ||||
---|---|---|---|---|
|
Programovací jazyky | |
---|---|
|
ISO | normy|
---|---|
| |
1 až 9999 |
|
10 000 až 19999 |
|
20 000+ | |
Viz také: Seznam článků, jejichž názvy začínají na „ISO“ |
C++ | |
---|---|
Zvláštnosti | |
Některé knihovny | |
Kompilátory | |
ovlivnil | |
|