C++ | |
---|---|
Semantik | multiparadigm : objektorienterad , generisk , procedurell , metaprogrammering |
Språkklass | objektorienterat programmeringsspråk , programmeringsspråk med flera paradigm , procedurspråk , funktionellt programmeringsspråk , generiskt programmeringsspråk , programmeringsspråk , språk i fritt format [d] och kompilerat programmeringsspråk |
Utförandetyp | sammanställt |
Framträdde i | 1983 |
Författare | Stroustrup, Björn |
Filtillägg _ | .cc, .cpp, .cxx, .c, .c++, .h, .hpp, eller .hh_.hxx.h++ |
Släpp | |
Typ system | statisk |
Stora implementeringar | GNU C++ , Microsoft Visual C++ , Intel C++ kompilator , Open64 C++ kompilator , Clang , Comeau C/C++ , Embarcadero C++ Builder , Watcom C++ kompilator , Digital Mars C++, Oracle Solaris Studio C++ kompilator, Turbo C++ |
Dialekter | ISO/IEC 14882 C++ |
Blivit påverkad | C , Simula , Algol 68 , Clu , ML och Ada |
Hemsida | isocpp.org _ |
Mediafiler på Wikimedia Commons |
C ++ (uttalas c-plus-plus [2] [3] ) är ett kompilerat , statiskt skrivet , allmänt programmeringsspråk .
Stöder sådana programmeringsparadigm som procedurprogrammering , objektorienterad programmering , generisk programmering . Språket har ett rikt standardbibliotek som inkluderar vanliga behållare och algoritmer , I/O, reguljära uttryck, stöd för flera trådar och mer. C++ kombinerar funktioner från både högnivå- och lågnivåspråk [4] [5] . I jämförelse med sin föregångare - C -språket - ägnas den största uppmärksamheten åt stöd för objektorienterad och generisk programmering [5] .
C++ används ofta för mjukvaruutveckling och är ett av de mest populära programmeringsspråken [opinions 1] [opinions 2] . Dess omfattning inkluderar skapandet av operativsystem , en mängd olika applikationsprogram, drivrutiner , applikationer för inbäddade system, högpresterande servrar och datorspel. Det finns många implementeringar av C++-språket, både gratis och kommersiellt, och för olika plattformar. Till exempel på x86- plattformen är dessa GCC , Visual C++ , Intel C++ Compiler , Embarcadero (Borland) C++ Builder och andra. C++ har haft en enorm inverkan på andra programmeringsspråk, framför allt Java och C# .
C++-syntaxen ärvs från C- språket . En av de ursprungliga designprinciperna var att bibehålla kompatibilitet med C. Men C++ är inte strikt en superset av C; Uppsättningen av program som kan översättas lika bra av både C- och C++-kompilatorer är ganska stor, men inkluderar inte alla möjliga C-program .
Historiskt utvecklingsstadium [6] | År |
---|---|
BCPL- språk | 1966 |
B - språket (ursprunglig utveckling av Thompson under UNIX ) | 1969 |
C språk | 1972 |
C med klasser | 1980 |
C84 | 1984 |
Cfront (Edition E) | 1984 |
cfront (version 1.0) | 1985 |
Multipelt/virtuellt arv | 1988 |
Generisk programmering ( mallar ) | 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 |
Språket uppstod i början av 1980 -talet , när Bell Labs medarbetare Björn Stroustrup kom med ett antal förbättringar av C -språket för sina egna behov [7] . När Stroustrup började arbeta på Bell Labs i slutet av 1970 -talet med problem i köteori (som tillämpat på modellering av telefonsamtal), fann han att försök att använda befintliga modelleringsspråk vid den tiden var ineffektiva, och användningen av högeffektiva maskinspråk var för svårt på grund av deras begränsade uttrycksfullhet. Simula- språket har till exempel funktioner som skulle vara mycket användbara för att utveckla stora program, men som är för långsamt, och BCPL -språket är tillräckligt snabbt, men för nära lågnivåspråk, och är inte lämpligt för att utveckla stora program.
Med tanke på upplevelsen av sin avhandling beslutade Stroustrup att komplettera C-språket (efterföljaren till BCPL) med de möjligheter som finns tillgängliga i Simula-språket. C-språket, som är basspråket i UNIX -systemet som Bell-datorerna körde på, är snabbt, funktionsrikt och bärbart. Stroustrup lade till det möjligheten att arbeta med klasser och objekt. Som ett resultat visade sig praktiska modelleringsproblem vara tillgängliga både när det gäller utvecklingstid (på grund av användningen av Simula-liknande klasser) och när det gäller beräkningstid (på grund av hastigheten på C). De första tilläggen till C var klasser (med inkapsling ), klassarv, strikt typkontroll, inline-funktioner och standardargument . Tidiga versioner av språket, som ursprungligen kallades "C med klasser", har varit tillgängliga sedan 1980- talet .
Under utvecklingen av C med klasser skrev Stroustrup programmet cfront , en kompilator som omarbetar C-källkod med klasser till vanlig C-källkod. Detta gjorde det möjligt för oss att arbeta med ett nytt språk och använda det i praktiken, med hjälp av den infrastruktur som redan finns tillgänglig i UNIX för utveckling i C. Ett nytt språk, oväntat för författaren, fick han stor popularitet bland kollegor och snart kunde Stroustrup inte längre personligen stödja honom, svarade på tusentals frågor.
År 1983 lades nya funktioner till i språket, såsom virtuella funktioner, funktions- och operatöröverbelastning, referenser, konstanter, användarkontroll över ledig minneshantering, förbättrad typkontroll och en ny kommentarstil ( //). Det resulterande språket är inte längre bara en utökad version av klassisk C och har bytt namn från C med klasser till "C++". Dess första kommersiella release ägde rum i oktober 1985 .
Innan den officiella standardiseringen började utvecklades språket huvudsakligen av Stroustrup som svar på förfrågningar från programmeringsgemenskapen. Funktionen av standardspråksbeskrivningar utfördes av Stroustrups tryckta verk på C ++ (en beskrivning av språket, en referensmanual, och så vidare). Det var först 1998 som den internationella standarden för C++-språket ratificerades: ISO/IEC 14882:1998 "Standard for the C++ Programming Language"; efter antagandet av tekniska korrigeringar av standarden 2003, är nästa version av denna standard ISO/IEC 14882:2003 [8] .
1985 kom den första utgåvan av The C++ Programming Language , som gav den första beskrivningen av språket, vilket var extremt viktigt på grund av avsaknaden av en officiell standard. 1989 släpptes C++ version 2.0. Dess nya funktioner inkluderade multipelt arv, abstrakta klasser, statiska medlemsfunktioner, konstanta funktioner och skyddade medlemmar. 1990 publicerades "Commented Reference Guide to C++", som senare blev grunden för standarden. De senaste uppdateringarna har inkluderat mallar, undantag, namnutrymmen, nya casts och den booleska typen. Standardmallbiblioteket (STL) utvecklat av Alexander Stepanov och Meng Li valdes som grund för lagring och åtkomst av generiska algoritmer .
C++ Standard Library har också utvecklats tillsammans med det. Det första tillägget till C++-standardbiblioteket var I/O-strömmar, vilket gav ett sätt att ersätta traditionella C printfoch scanf. Senare var den viktigaste utvecklingen av standardbiblioteket införandet av standardmallbiblioteket .
C++ fortsätter att utvecklas för att möta moderna krav. En av grupperna som utvecklar C++-språket och skickar förslag på förbättringar till C++-standardiseringskommittén är Boost , som bland annat sysslar med att förbättra språkets kapacitet genom att lägga till metaprogrammeringsfunktioner till det .
Ingen äger rättigheterna till C++-språket, det är gratis. Själva språkstandarddokumentet (med undantag för utkast) är dock inte fritt tillgängligt [10] . Som en del av standardiseringsprocessen producerar ISO flera typer av publikationer. Speciellt publiceras tekniska rapporter och tekniska specifikationer när "framtiden är i sikte, men det inte finns någon omedelbar möjlighet att komma överens om publicering av en internationell standard." Fram till 2011 publicerades tre tekniska rapporter om C++: TR 19768: 2007 (även känd som C++ Technical Report 1) för biblioteksutvidgningar huvudsakligen integrerade i C++11, TR 29124: 2010 för speciella matematiska funktioner och TR 24733: 20113: decimal flyttalsaritmetik. Teknisk specifikation DTS 18822:. 2014 (av filsystem) godkändes i början av 2015, och resten av specifikationerna är under utveckling och väntar på godkännande [11] .
I mars 2016 skapades arbetsgruppen WG21 C++ i Ryssland . Gruppen organiserades för att samla in förslag till C++-standarden, överlämna dem till kommittén och försvara dem vid allmänna möten i International Organization for Standardization (ISO) [12] .
Det resulterande språknamnet kommer från C unary postfix inkrementoperatorn++ (ökar värdet på en variabel med en). Namnet C+ användes inte eftersom det är ett syntaxfel i C och dessutom togs namnet av ett annat språk. Språket hette inte heller D eftersom "det är en förlängning av C och inte försöker fixa problem genom att ta bort C-element " [7] .
I The Design and Evolution of C++ [13] beskriver Björn Stroustrup de principer han följde när han designade C++. Dessa principer förklarar varför C++ är som det är. Några av dem:
C++-standarden består av två huvuddelar: en beskrivning av kärnspråket och en beskrivning av standardbiblioteket.
Till en början utvecklades språket utanför den formella ramen, spontant, i enlighet med de uppgifter som det stod inför. Utvecklingen av språket åtföljdes av utvecklingen av cfront cross-kompilatorn . Innovationer i språket återspeglades i ändringen av versionsnumret för korskompilatorn. Dessa korskompilatorversionsnummer utökades till själva språket, men C++-versioner diskuteras för närvarande inte. Det var inte förrän 1998 som språket blev standardiserat.
Ett namnutrymme utan namn är ett specialfall. Alla namn som beskrivs i den är endast tillgängliga i den aktuella översättningsenheten och har lokal bindning. Namnutrymmet stdinnehåller standard C++-bibliotek.
Följande inbyggda typer är tillgängliga i C++. C++-typer är nästan identiska med C-datatyper :
Jämförelseoperatörers returtyp bool. Uttryck inom parentes efter if, while omvandlas till typ bool[14] .
Språket introducerade begreppet referenser, och från C++11-standarden , rvalues- referenser och vidarebefordran av referenser . (se länk (C++) )
C++ lägger till objektorienterade funktioner i C. Den introducerar klasser som tillhandahåller de tre viktigaste egenskaperna hos OOP : inkapsling , nedärvning och polymorfism .
I C++-standarden är en klass en användardefinierad typ som deklareras med ett av nyckelorden , eller class, structen unionstruktur är en klass som definieras av struct, och en union är en klass som definieras av union. Beroende på vilket nyckelord som används ändras även vissa egenskaper för själva klassen. Till exempel, i en klass som deklareras med struct, kommer medlemmar utan en manuellt tilldelad åtkomstmodifierare som standard till offentlig snarare än privat.
I brödtexten i en klassdefinition kan du ange både funktionsdeklarationer och deras definition. I det senare fallet är funktionen inline ( inline). Icke-statiska medlemsfunktioner kan ha constoch qualifiers volatile, såväl som en referens qualifier ( &eller &&).
C++ stöder flera arv . Basklasser (förfäderklasser) anges i huvudet på klassdeklarationen, eventuellt med åtkomstspecifikatorer. Arv från varje klass kan vara offentligt, skyddat eller privat:
Basklassmedlemsåtkomst/arvningsläge | privat medlem | skyddad medlem | offentlig medlem |
---|---|---|---|
privat arv | inte tillgänglig | privat | privat |
skyddat arv | inte tillgänglig | skyddad | skyddad |
offentligt arv | inte tillgänglig | skyddad | offentlig |
Som standard ärvs basklassen som privat.
Som ett resultat av arv får barnklassen alla fält av förfäderklasserna och alla deras metoder; vi kan säga att varje instans av ättlingklassen innehåller en underinstans av var och en av förfaderklasserna. Om en förfaderklass ärvs flera gånger (detta är möjligt om det är förfadern till flera basklasser av klassen som skapas), kommer instanser av den efterkommande klassen att inkludera lika många underinstanser av denna förfaderklass. För att undvika denna effekt om det inte är önskvärt, stöder C++ konceptet virtuellt arv . Vid ärvning kan basklassen deklareras virtuell; för alla virtuella förekomster av förfaderklassen i arvsträdet för den efterkommande klassen skapas endast en underinstans i den efterkommande.
C++ stöder dynamisk polymorfism och parametrisk polymorfism .
Parametrisk polymorfism representeras av:
Dynamisk polymorfism implementeras med hjälp av virtuella metoder och en arvshierarki. I C++ är en typ polymorf om den har minst en virtuell metod. Hierarkiexempel:
klassfigur _ { offentliga : virtuell void Draw () = 0 ; // ren virtuell metod virtuell ~ Figur (); // om det finns minst en virtuell metod ska förstöraren göras virtuell }; klass Square : offentlig person { offentliga : void Rita () åsidosätta ; }; klass Cirkel : offentlig person { offentliga : void Rita () åsidosätta ; };Här är figurklassen abstrakt (och till och med gränssnittsklassen ), eftersom Draw-metoden inte är definierad. Objekt av denna klass kan inte skapas, men referenser eller pekare med typen Figur kan användas. Valet av implementering av Draw-metoden kommer att göras vid körning baserat på den faktiska typen av objekt.
Inkapsling i C++ implementeras genom att specificera nivån av åtkomst till klassmedlemmar: de är offentliga (offentliga, public), skyddade ( protected) och privata (privata, private). I C++ skiljer sig strukturer formellt endast från klasser genom att som standard är åtkomstnivån till klassmedlemmar och typen av arv för en struktur offentliga, medan de för en klass är privata.
Tillgång | privat | skyddad | offentlig |
---|---|---|---|
Själva klassen | Ja | Ja | Ja |
Vänner | Ja | Ja | Ja |
arvingar | Nej | Ja | Ja |
Från utsidan | Nej | Nej | Ja |
Åtkomstkontroll sker vid kompilering, försök att komma åt en otillgänglig klassmedlem kommer att orsaka ett kompileringsfel.
VännerVänfunktioner är funktioner som inte är medlemsfunktioner och som ändå har tillgång till skyddade och privata medlemmar i klassen. De måste deklareras i klassens brödtext som friend. Till exempel:
klass Matrix { vän Matrix Multiplicera ( Matrix m1 , Matrix m2 ); };Här kan funktionen Multiplykomma åt alla fält och medlemsfunktioner i Matrix.
Både hela klassen och en medlemsfunktion i klassen kan förklaras som vän. Fyra viktiga begränsningar för vänrelationer i C++ är:
Generellt kan denna regel formuleras på följande sätt: "Vänlighetsrelationen existerar endast mellan de klasser (klass och funktion) för vilka den uttryckligen deklareras i koden, och agerar endast i den riktning i vilken den deklareras."
En standardklass kan ha sex specialfunktioner: default constructor, copy constructor, move constructor, destructor, copy assignment operator, move assignment operator. Det är också möjligt att uttryckligen definiera dem alla (se treregeln ).
klass Array { offentliga : Array ( ) = standard // kompilatorn kommer att skapa en standardkonstruktor för Array själv ( size_t _len ) : len ( _len ) { val = ny dubbel [ _len ]; } Array ( const Array & a ) = radera ; // copy constructor har explicit tagit bort Array ( Array && a ); // flytta konstruktör ~ Array () { ta bort [] val ; } Array & operator = ( const Array & rhs ); // copy assignment operator Array & operator = ( Array && rhs ); // flytta tilldelningsoperator dubbel & operator []( size_t i ) { returvärde [ i ] ; } const double & operator []( size_t i ) const { returvärde [ i ] ; } skyddad : std :: size_t len = 0 ; // fältinitiering dubbel * val { nullptr }; };Konstruktorn anropas för att initiera objektet (av lämplig typ) när det skapas, och destruktorn anropas för att förstöra objektet. En klass kan ha flera konstruktörer, men en destruktor kan bara ha en. Konstruktörer i C++ kan inte deklareras som virtuella, men destruktorer kan, och deklareras vanligtvis för alla polymorfa typer, för att säkerställa att ett refererat eller pekartillgängligt objekt förstörs korrekt, oavsett vilken typ referensen eller pekaren är. Om minst en av basklasserna har en virtuell förstörare, blir destruktören för den underordnade klassen automatiskt virtuell.
Mallar låter dig generera funktioner och klasser som parametriseras med en specifik typ eller värde. Till exempel kunde den föregående klassen implementera en array för vilken datatyp som helst:
mall < typnamnT > _ klass Array { ... T & operator []( size_t i ) { returvärde [ i ] ; } skyddad : std :: size_t len { 0 }; // fältinitiering T * val { nullptr }; };C++ Standard Library innehåller en uppsättning verktyg som bör vara tillgängliga för alla implementeringar av språket för att ge programmerare en bekväm användning av språkfunktioner och ge en grund för att utveckla både ett brett utbud av applikationsapplikationer och specialiserade bibliotek. C++ Standard Library inkluderar en del av C Standard Library. C++ Standard innehåller en normativ referens till 1990 C Standard och definierar inte självständigt de standardbiblioteksfunktioner som är lånade från C Standard Library.
#includeÅtkomst till funktionerna i C++ standardbiblioteket tillhandahålls genom att inkludera lämpliga standardhuvudfiler i programmet (via direktivet ). Totalt är 79 sådana filer definierade i C++11-standarden. Standardbiblioteksfaciliteter deklareras som en del av standardnamnutrymmet. Header-filer vars namn matchar mönstret "cX", där X är header-filnamnet för C Standard Library utan tillägg (cstdlib, cstring, cstdio, etc.), innehåller deklarationer som motsvarar den del av C Standard Library. standardbiblioteksfunktioner finns också i namnrymden std.
Standardbiblioteket innehåller följande sektioner:
Behållare, strängar, algoritmer, iteratorer och grundläggande verktyg, med undantag för lån från C-biblioteket, kallas gemensamt för STL (Standard Template Library - standard template library). Ursprungligen var detta bibliotek en separat produkt och dess förkortning dechiffrerades annorlunda, men sedan gick det in i C ++ standardbiblioteket som ett integrerat element. Namnet återspeglar det faktum att generaliserade programmeringsmekanismer (C++-mallar - mall) används för att implementera generella verktyg (behållare, strängar, algoritmer). Stroustrups skrifter beskriver skälen till varför detta val gjordes. De viktigaste är den större universaliteten hos den valda lösningen (mallbehållare, till skillnad från objektbehållare, kan enkelt användas för icke-objekttyper och kräver inte en gemensam förfader för elementtyper) och dess tekniska effektivitet (som regel, mallbehållare operationer kräver inga virtuella funktionsanrop och kan enkelt bäddas in (inline), vilket i slutändan ger en prestandavinst.
Från och med C++11-standarden har följande funktioner lagts till:
STL, innan den ingick i C++-standarden, var en tredjepartsutveckling, först av HP och sedan av SGI . Språkstandarden kallar det inte "STL" eftersom detta bibliotek har blivit en integrerad del av språket, men många använder fortfarande detta namn för att skilja det från resten av standardbiblioteket (I/O-strömmar ( iostream ), undersektion C och andra).
Ett projekt kallat STLport [15] baserat på SGI STL håller STL-, IOstream- och strängklasserna uppdaterade. Flera andra projekt utvecklar också privat användning av standardbiblioteket.
Valet av C som grund för att skapa ett nytt programmeringsspråk förklaras av att C-språket:
Trots ett antal välkända brister i C-språket valde Stroustrup att använda det som bas eftersom "C har sina problem, men ett språk designat från grunden skulle ha dem, och vi känner till problemen med C." Dessutom tillät detta oss att snabbt få en kompilatorprototyp ( cfront ) som endast översatte de tillagda syntaxelementen till det ursprungliga C-språket.
När C++ utvecklades inkluderades andra funktioner som åsidosätter funktionerna hos C-konstruktioner, och frågan om att överge språkkompatibilitet genom att ta bort föråldrade konstruktioner togs upp upprepade gånger. Kompatibiliteten har dock bibehållits av följande skäl:
Nya C++-funktioner inkluderar uttrycksdeklarationer, funktionstypkonverteringar, operatorer newoch delete, typ bool, referenser, utökad beständighet, inline-funktioner, standardargument, åsidosättningar, namnrymder, klasser (inklusive alla klassrelaterade funktioner som arv, medlemsfunktioner, virtuella funktioner, abstrakt klasser och konstruktörer ), operatörsöverstyrningar, mallar, operatör ::, undantagshantering, dynamisk identifiering med mera. C++-språket är också, i många fall, mer strikt när det gäller typkontroll än C.
C++ introducerade kommentarer med dubbla snedstreck ( //) som fanns i C:s föregångare, BCPL .
constVissa funktioner i C++ portades senare till C, såsom nyckelorden och , loop- inlinedeklarationer foroch kommentarer i C++-stil ( //). Senare implementeringar av C introducerade också funktioner som inte finns i C++, såsom makron va_argoch förbättrad hantering av arrayparameter.
Medan de flesta C-koder också kommer att vara giltiga för C++, är C++ inte en superset av C och inkluderar den inte. Det finns också en del kod som är sant för C men inte sant för C++. Detta skiljer den från Objective C , en annan C-förbättring för OOP , som bara är en superset av C.
Det finns andra skillnader också. Till exempel tillåter inte C++ att anropa en funktion main()i ett program, medan det i C är lagligt. Dessutom är C++ mer strikt i vissa avseenden; till exempel tillåter den inte implicit casting mellan orelaterade pekartyper och tillåter inte funktioner som ännu inte har deklarerats.
Dessutom kan kod som är giltig för båda språken ge olika resultat beroende på vilket språks kompilator den är översatt till. Till exempel, på de flesta plattformar skriver följande program ut "C" om det kompileras av en C-kompilator och "C++" om det kompileras av en C++-kompilator. Detta beror på att teckenkonstanter i C (till exempel 'a') är av typen int, men i C++ är de av typen char, och storlekarna på dessa typer skiljer sig vanligtvis åt.
#include <stdio.h> int main () { printf ( "%s \n " , ( storlek på ( 'a' ) == storlek på ( char )) ? "C++" : "C" ); returnera 0 ; }Som Stroustrup noterar, "Ju bättre du känner till C, desto svårare blir det för dig att undvika C++-programmering i C-stil, samtidigt som du förlorar de potentiella fördelarna med C++." För det ändamålet ger han följande rekommendationer för C-programmerare för att dra full nytta av C++:
Den nuvarande språkstandarden ISO/IEC 14882:2017 publicerades i december 2017 . Det kallas inofficiellt C++17 . Nästa version av standarden, planerad till 2020, har den inofficiella beteckningen C++20 .
Enligt språkets författare, Björn Stroustrup [19] [20] [21] , talade om språkets vidare utveckling och framtidsutsikter, kan följande urskiljas:
Detta är ett exempelprogram Hej världen! , som skriver ut ett meddelande till konsolen med standardbiblioteket och avslutar.
#include <iostream> använder namnutrymme std ; int main () { cout << "Hej världen!" << endl ; returnera 0 ; }Modern C++ låter dig lösa mer komplexa problem på ett enkelt sätt. Det här exemplet visar bland annat användningen av STL- behållare (Standard Template Library).
#include <iostream> // för att använda std::cout #include <vektor> // innehåller en dynamisk array #include <map> // innehåller ordboksdatatyp #inkludera <sträng> int main () { // Importera alla deklarationer i "std"-namnområdet till det globala namnområdet. använder namnutrymme std ; // Vi deklarerar en associativ behållare med strängnycklar och data som strängvektorer. map < sträng , vektor < sträng > > objekt ; // Lägg till ett par personer i den här associativa behållaren och ge dem några föremål. objekt [ "Anya" ]. push_back ( "halsduk" ); objekt [ "Dmitry" ]. push_back ( "biljetter" ); objekt [ "Anya" ]. push_back ( "valp" ); // Gå igenom alla objekt i behållaren för ( const auto & person : items ) { // person är ett par av två objekt: person.first är dess namn, // person.second är en lista över dess objekt (vektor av strängar) cout << person . första << " bär " << person . andra . storlek () << "artiklar" << endl ; } }Det här exemplet importerar alla namn från std-namnområdet för enkelhets skull. I ett riktigt program rekommenderas inte detta, eftersom du kan stöta på namnkollisioner. Språket låter dig importera enskilda objekt:
#inkludera <vektor> int main () { använder std :: vektor ; vektor < int > min_vektor ; }I C++ (som i C), om programexekveringen når slutet av funktionen main(), så motsvarar detta return 0;. Detta gäller inte för någon annan funktion än main().
Flera studier är kända där man försökte mer eller mindre objektivt jämföra flera programmeringsspråk, varav ett är C++. Särskilt:
Ada-språket är nära C++ när det gäller dess uppsättning funktioner och användningsområden: det är ett kompilerat strukturspråk med en Simula-liknande objektorienterad tillägg (samma "Algol med klasser"-modell som i C++), statisk typning , generiska programmeringsverktyg, designade för utveckling av stora och komplexa mjukvarusystem. Samtidigt är det fundamentalt annorlunda i ideologi: till skillnad från C++ byggdes Ada utifrån tidigare noggrant utarbetade villkor från komplexa mjukvarutillverkare med ökade krav på tillförlitlighet, vilket satt avtryck på syntaxen och semantiken i språk.
Det finns få direkta jämförelser av Ada och C++ kodningseffektivitet. I artikeln [22] som nämns ovan resulterade lösningen av modellproblemet i Ada i en kod som var ungefär 30 % mindre i storlek (i rader) än i C++. Jämförelse av egenskaperna hos språken själva ges i många källor, till exempel listar Jim Rogers artikel om AdaHome [28] mer än 50 punkter av skillnader i egenskaperna hos dessa språk, varav de flesta är till förmån för Ada (fler funktioner, mer flexibelt beteende, mindre risk för fel). Även om många av uttalandena från Ada-anhängarna är kontroversiella, och några av dem är klart föråldrade, kan man generellt dra slutsatsen:
I en artikel av Stephen Zeiger från Rational Software Corporation [29] påstås det att utveckling i Ada generellt är 60 % billigare och resulterar i kod med 9 gånger färre defekter än i C. Även om dessa resultat inte kan överföras direkt till C++, är de fortfarande intressanta med tanke på att många av bristerna i C++ ärvs från C.
Java kan inte betraktas som en fullständig ersättning för C++, det är designat som ett säkert språk med en låg ingångströskel för att utveckla anpassade applikationer med hög portabilitet [30] och är i grunden olämplig för vissa typer av applikationer som är utvecklade i C++. Men inom dess omfattning är Java en mycket verklig konkurrent till C++. Fördelarna med Java nämns vanligtvis som:
Samtidigt skapar användningen av sopsamlaren och den virtuella maskinen begränsningar som är svåra att övervinna. Java-program tenderar att vara långsammare, kräver betydligt mer minne, och den virtuella maskinen isolerar programmet från operativsystemet, vilket gör programmering på låg nivå omöjlig.
En empirisk studie [24] fann ingen signifikant skillnad i utvecklingshastigheten i C++ och Java. Studien [26] visade också att idén om en signifikant skillnad i hastigheten för program på dessa språk inte alltid är korrekt: i två av tre tester visade sig hastigheten på applikationer i Java och C++ vara jämförbar. Samtidigt är Java mer kortfattat - skillnaden i mängden kod var cirka 10-15%.
Den ursprungliga C fortsätter att utvecklas, många storskaliga projekt utvecklas i den: det är huvudspråket för att utveckla operativsystem, spelmotorerna för många dynamiska spel och ett stort antal applikationsapplikationer skrivs i det. Ett antal experter hävdar att att ersätta C med C++ inte ökar utvecklingseffektiviteten, utan leder till onödig komplikation av projektet, minskad tillförlitlighet och ökade underhållskostnader. Särskilt:
Det finns inga övertygande bevis för att C++ är överlägset C vare sig när det gäller programmerares produktivitet eller programegenskaper. Även om det finns studier [32] som anger att C-programmerare spenderar cirka 30-40 % av den totala utvecklingstiden (exklusive felsökning) på minneshantering, när man jämför utvecklarnas totala produktivitet [22] , ligger C och C++ nära.
I lågnivåprogrammering görs många av de nya funktionerna i C++ otillämpliga på grund av ökad overhead: virtuella funktioner kräver dynamisk realadressberäkning (RVA), mallar leder till koduppsvällning och dåliga optimeringsmöjligheter, runtime-biblioteket (RTL) är mycket stor, och förkastandet av det berövar de flesta funktionerna i C ++ (om så bara på grund av att new/ operationer inte är tillgängliga delete). Som ett resultat måste programmeraren begränsa sig till den funktionalitet som ärvs från C, vilket gör det meningslöst att använda C ++:
… det enda sättet att ha bra, effektiv, lågnivå, bärbar C++ är att begränsa dig till alla de saker som är trivialt tillgängliga i C. Och att begränsa projektet till C kommer att innebära att folk inte kommer att kasta det, och att det kommer att finnas många programmerare tillgängliga som verkligen förstår lågnivåfunktionerna och inte överger dem på grund av den idiotiska "objektmodellen" dumheter.
… när effektivitet är av största vikt kommer "fördelarna" med C++ att vara ett stort misstag.
I ett experiment [22] visade skript och funktionella språk, i synnerhet Haskell , en 2-3-faldig vinst i programmeringstid och kodstorlek jämfört med C++-program. Å andra sidan visade sig C++-program vara lika mycket snabbare. Författarna erkänner att deras data inte utgör ett representativt urval och avstår från att dra kategoriska slutsatser.
I ett annat experiment [34] visade strikta funktionella språk ( Standard ML , OCaml ) en generell utvecklingsacceleration med en faktor 10 (främst på grund av tidig upptäckt av fel) med ungefär lika prestandaindikatorer (många kompilatorer i flera lägen var Begagnade).
I en studie av Lutz Prehelt [24] , baserad på resultaten från bearbetning av cirka 80 lösningar skrivna av frivilliga, erhölls följande slutsatser, särskilt:
Oftast motsätter sig kritiker inte C++ till något annat specifikt språk, utan hävdar att förkastandet av att använda ett enda språk som har många brister till förmån för att bryta ner ett projekt i deluppgifter som kan lösas på olika språk som är mest lämpade för de gör utvecklingen betydligt mindre tidskrävande samtidigt som de förbättrar programkvalitetsindikatorerna [35] [36] . Av samma anledning kritiseras att upprätthålla kompatibilitet med C: om en del av uppgiften kräver funktioner på låg nivå är det mer rimligt att separera denna del i ett separat delsystem och skriva det i C.
Anhängare av C++ hävdar i sin tur att elimineringen av tekniska och organisatoriska problem med interspråklig interaktion genom att använda ett universellt språk istället för flera specialiserade är viktigare än förlusterna från ofullkomligheten i detta universella språk, det vill säga mycket bredd av C++-funktionsuppsättningen är en ursäkt för bristerna i varje enskild funktion; inklusive de nackdelar som ärvts från C motiveras av fördelarna med kompatibilitet (se ovan ).
Således anses samma egenskaper hos C ++ - volym, komplexitet, eklekticism och avsaknad av en specifik målnisch för tillämpning - av anhängare som "den största fördelen " och av kritiker - som " den största nackdelen ".
Språkets ideologi förväxlar " beteendekontroll " med " effektivitetskontroll ": principen " du betalar inte för det du inte använder " föreslår att ge programmeraren fullständig kontroll över alla aspekter av programexekveringen på en ganska låg nivå är ett nödvändigt och tillräckligt villkor för att uppnå hög kodeffektivitet. Faktum är att detta inte är sant för några stora program: att påtvinga programmeraren optimering på låg nivå, vilket en högkvalitativ domänspecifik språkkompilator uppenbarligen kan utföra mer effektivt, leder bara till en ökning av mängden kod, en ökning i programmeringsarbetsintensitet och en minskning av kodförståelighet och testbarhet. Principen om "betala inte för det som inte används" ger alltså inte riktigt de önskade fördelarna i effektivitet, utan påverkar kvaliteten negativt.
Komponent- och objektorienterad programmeringEnligt Alan Kay är objektmodellen " Algol med klasser" som används i C++ sämre än modellen "allt är ett objekt" [37] som används i Objective-C när det gäller övergripande omfattning, återanvändning av kod , förståelighet, modifierbarhet och testbarhet. .
C++-arvsmodellen är komplex, svår att implementera och provocerar samtidigt skapandet av komplexa hierarkier med onaturliga relationer mellan klasser (till exempel arv istället för kapsling). Resultatet är skapandet av tätt kopplade klasser med vagt separerade funktionalitet. Till exempel, i [38] ges ett pedagogiskt och rekommendationsexempel på implementeringen av klassen "list" som en underklass till klassen "listelement", som i sin tur innehåller åtkomstfunktioner för andra listelement. Denna typrelation är matematiskt absurd och irreproducerbar i mer rigorösa språk. Ideologin för vissa bibliotek kräver manuell typkastning upp och ner i klasshierarkin ( static_castoch dynamic_cast), vilket bryter mot språkets typsäkerhet . Den höga viskositeten hos C++-lösningar kan kräva att stora delar av projektet återutvecklas med minimala förändringar senare i utvecklingsprocessen. Ett levande exempel på sådana problem finns i [35]
Som Ian Joyner [39] påpekar , sätter C++ felaktigt likhetstecken mellan inkapsling (det vill säga att placera data inuti objekt och separera implementering från gränssnitt) och implementeringsdöljning. Detta komplicerar åtkomsten till klassdata och kräver att dess gränssnitt implementeras nästan uteslutande genom accessorfunktioner (vilket i sin tur ökar mängden kod och komplicerar den).
Typmatchning i C++ definieras på nivån för identifierare, inte signaturer. Detta gör det omöjligt att ersätta komponenter baserade på gränssnittsmatchning, varför införandet av ny funktionalitet implementerad på biblioteksnivå i systemet kräver manuell modifiering av befintlig kod [40] . Som Linus Torvalds [33] påpekar , i C++, "Kod verkar abstrakt bara så länge den inte behöver ändras."
Kritik av C++ ur OOPs synvinkel ges i [39] .
MetaprogrammeringC++:s generativa metaprogrammering är mall- och förprocessorbaserad , arbetskrävande och begränsad i omfattning. C++-mallsystemet är faktiskt en kompileringstidsvariant av det primitiva funktionella programmeringsspråket . Detta språk har nästan ingen överlappning med C++ i sig, varför potentialen för tillväxt i komplexiteten av abstraktioner är begränsad. Program som använder C++-mallar har extremt dålig förståelse och testbarhet, och malluppackning genererar i sig ineffektiv kod, eftersom mallspråket inte ger några medel för optimering (se även avsnittet #Computational efficiency ). Inbäddade domänspecifika språk som implementeras på detta sätt kräver fortfarande kunskap om själva C++, vilket inte ger en fullvärdig arbetsfördelning. Således är förmågan för C++ att utöka kapaciteten för C++ själv ganska begränsad [41] [42] .
Cross-platformAtt skriva bärbar C++-kod kräver en hel del skicklighet och erfarenhet, och "slarvig" C++-kod är högst sannolikt icke-portabel [43] . Enligt Linus Torvalds , för att uppnå C++-portabilitet som liknar C, måste programmeraren begränsa sig till C++-funktionerna som ärvts från C [33] . Standarden innehåller många element definierade som "implementationsdefinierade" (till exempel varierar storleken på pekare till klassmetoder i olika kompilatorer från 4 till 20 byte [44] ), vilket försämrar portabiliteten för program som använder dem.
Språkstandardiseringens direktiva karaktär , ofullständig bakåtkompatibilitet och inkonsekvens av kraven för olika versioner av standarden leder till problem med att porta program mellan olika kompilatorer och till och med versioner av samma kompilatorer .
Språket innehåller verktyg som tillåter programmeraren att bryta mot den programmeringsdisciplin som ges i ett visst fall. En modifierare constställer till exempel in egenskapen för tillståndets oföränderlighet för ett objekt, men modifieraren mutableär utformad specifikt för att tvinga tillstånd att ändra tillståndet inuti ett konstobjekt, det vill säga att bryta mot restriktionen. Dessutom är det tillåtet att dynamiskt ta bort ett attribut constfrån ett konstant objekt och omvandla det till ett L-värde. Närvaron av sådana funktioner i språket gör försök att formellt verifiera koden meningslösa, och användningen av begränsningar för optimering är omöjlig.
Okontrollerad makrosubstitutionC-makrosubstitutionsfaciliteterna ( #define) är lika kraftfulla som farliga. De behålls i C++ trots att C++, för alla uppgifter som de tillhandahållits för i C, tillhandahållit mer strikta och specialiserade faciliteter - mallar, funktionsöverbelastning, inline-funktioner, namnrymder, mer avancerad skrivning, utvidgning av applikationen const-modifieraren , etc. Det finns många potentiellt farliga makron i standardbiblioteken som ärvts från C [45] . Mallmetaprogrammering kombineras också ibland med användning av makrosubstitution för att tillhandahålla sk. " syntaktisk socker ".
ÖverbelastningsproblemC++-principerna för funktion och operatörsöverbelastning leder till betydande kodduplicering. Ursprungligen avsett att introducera så kallat " syntaktisk socker ", uppmuntrar operatörsöverbelastning i C++ det okontrollerade beteendet hos elementära operatörer för olika typer. Detta ökar dramatiskt risken för fel, särskilt eftersom det är omöjligt att införa en ny syntax och ändra den befintliga (till exempel skapa nya operatorer eller ändra prioriteringar eller associativitet), även om syntaxen för standard C++ operatorer är tillräcklig för att semantik av långt ifrån alla typer som kan behöva införas i programmet. Vissa problem skapas av möjligheten till lätt överbelastning av operatörerna / , vilket kan generera extremt lömska och svårupptäckta fel. Samtidigt utförs inte vissa intuitivt förväntade operationer (rensning av dynamiska objekt i händelse av att slänga undantag) i C++, och en betydande del av överbelastade funktioner och operatörer anropas implicit (typcasting, skapande av tillfälliga instanser av klasser, etc. .). Som ett resultat blev verktyg som ursprungligen var avsedda att göra program tydligare och förbättra utveckling och underhåll ännu en källa till onödigt komplicerad och opålitlig kod. newdelete
Användningen av C++-mallar är parametrisk polymorfism på källkodsnivå, men när den översätts övergår den till ad hoc-polymorfism (dvs funktionsöverbelastning), vilket leder till en betydande ökning av mängden maskinkod jämfört med språk som har ett system av äkta polymorft typ (avkomlingar till ML ). För att minska storleken på maskinkoden försöker de att automatiskt bearbeta källkoden före steget att linda upp mallar [46] [47] . En annan lösning skulle kunna vara möjligheten att exportera mallar, som standardiserades redan 1998, men den är inte tillgänglig i alla kompilatorer, eftersom det är svårt att implementera [48] [49] [åsikter 4] och att importera C++-mallbibliotek i språk med en väsentligt annorlunda C++-semantik skulle det fortfarande vara värdelöst. Förespråkare för C++ bestrider omfattningen av koduppblåsthet som överdriven [50] , och ignorerar till och med det faktum att i C översätts parametrisk polymorfism direkt, det vill säga utan att duplicera funktionskroppar alls. Samtidigt tror anhängare av C++ att parametrisk polymorfism i C är farlig – det vill säga farligare än övergången från C till C++ (motståndare till C++ hävdar motsatsen – se ovan).
OptimeringspotentialPå grund av det svaga typsystemet och överflöd av biverkningar blir det extremt svårt att likvärdigt konvertera program, och därför bädda in många optimeringsalgoritmer i kompilatorn, såsom automatisk parallellisering av program , borttagning av vanliga underuttryck , λ-lyftning, anrop till procedurer med fortsättningspassering , superkompilering , etc. Som ett resultat begränsas den faktiska effektiviteten av C++-program av programmerarnas färdigheter och de ansträngningar som investeras i ett visst projekt, och en "slarvig" implementering kan vara betydligt sämre i effektivitet än "slarvig" ”-implementeringar på språk på högre nivå, vilket bekräftas av jämförande tester av språk [34] . Detta är en betydande barriär mot användningen av C++ i datautvinningsindustrin .
Effektiv minneshanteringAnsvaret för effektiv minneshantering faller på utvecklarens axlar och beror på utvecklarens kompetens. För automatisk minneshantering i C ++, den sk. "smarta pekare", manuell minneshantering minskar effektiviteten hos programmerarna själva (se avsnittet Effektivitet ) . Många implementeringar av sophämtning , såsom statisk slutledning av regioner , är inte tillämpliga för C++-program (mer exakt, detta kräver implementering av en ny språktolk ovanpå C++-språket, vilket skiljer sig mycket från C++ både i de flesta objektiva egenskaper och i allmän ideologi) på grund av behovet av direkt tillgång till AST .
Korrelationen av prestandafaktorer med utvecklingskostnader, såväl som den allmänna disciplinen och programmeringskulturen som odlas i programmeringsgemenskapen, är viktiga för kunder som väljer ett språk (och följaktligen föredrar detta utvecklarspråk) för genomförandet av sina projekt, såväl som för människor som börjar lära sig programmering, speciellt med avsikten att programmera för dina egna behov.
Programmeringskvalitet och kulturPrincipen för C++ " att inte påtvinga en" bra "programmeringsstil " strider mot det industriella förhållningssättet till programmering, där den ledande rollen spelas av kvaliteten på programvaran och möjligheten att underhålla koden inte bara av författaren , och för vilka språk som minimerar inflytandet av den mänskliga faktorn är att föredra , det vill säga bara " påtvinga en "bra" programmeringsstil ", även om sådana språk kan ha en högre ingångströskel.
Det finns en åsikt att preferensen för att använda C++ (med möjlighet att välja alternativa språk) negativt kännetecknar en programmerares professionella egenskaper. Specifikt säger Linus Torvalds att han använder kandidaternas positiva åsikter om C++ som ett bortfallskriterium [åsikter 3] :
C++ är ett hemskt språk. Vad som gör det ännu mer fruktansvärt är det faktum att många programmerare som inte är läskunniga använder det... Ärligt talat, även om det inte finns någon anledning att välja C annat än att hålla C++-programmerare borta, skulle det bara vara en tillräckligt bra anledning att använda C.
…Jag har kommit fram till att jag verkligen skulle föredra att sparka ut alla som skulle föredra att utveckla ett projekt i C++ snarare än i C, så att den här personen inte förstör projektet där jag är involverad.
Den kontinuerliga utvecklingen av språket uppmuntrar (och ibland tvingar) programmerare att ändra redan felsökt kod om och om igen - detta ökar inte bara kostnaderna för utveckling, utan medför också risken att introducera nya fel i den felsökta koden. I synnerhet, även om bakåtkompatibilitet med C ursprungligen var en av kärnprinciperna för C++, har C sedan 1999 upphört att vara en delmängd av C++, så att felsökt C-kod inte längre kan användas i ett C++-projekt utan modifiering.
Komplexitet för sin egen skullC++ definieras av dess apologeter som "den mest kraftfulla" just för att den är fylld av farliga, ömsesidigt motstridiga egenskaper. Enligt Eric Raymond gör detta språket i sig till en grund för personlig självbekräftelse av programmerare, vilket gör utvecklingsprocessen till ett mål i sig:
Programmerare är ofta flamboyanta individer som är stolta över … sin förmåga att hantera komplexitet och hantera abstraktioner med skicklighet. Ofta tävlar de med varandra och försöker ta reda på vem som kan skapa "de mest invecklade och vackra komplexiteterna." ... rivaler tror att de måste konkurrera med andras "dekorationer" genom att lägga till sina egna. Ganska snart blir "massiv tumör" industristandard, och alla kör stora, buggiga program som inte ens deras skapare kan tillfredsställa.
…
… det här tillvägagångssättet kan hamna i problem om programmerare gör enkla saker på komplexa sätt, helt enkelt för att de känner till dessa sätt och vet hur de ska använda dem.
Fall har noterats när slarviga programmerare, som använder det starka sammanhangsberoendet av C ++ och avsaknaden av förmågan att spåra makrodefinitioner av kompilatorn, saktade ner utvecklingen av projektet genom att skriva en eller två extra, korrekt från kompilatorns punkt. visning, rader med kod, men införa ett svårt att upptäcka spontant manifesterat fel på deras bekostnad. Till exempel:
#define if(a) if(rand())På språk med bevisad korrekthet , även med avancerade makrofaciliteter, är det omöjligt att göra skada på detta sätt.
Otillförlitlig produktEtt orimligt överflöd av biverkningar, i kombination med bristande kontroll från språkets runtime-system och ett system av svag typ, gör C++-program benägna att få oförutsägbara dödskrascher (de välkända kraschen med meddelanden som "Access violation", "Ren virtuell funktion call" eller "Programmet utförde en olaglig operation och kommer att stängas"), vilket utesluter användningen av C++ med höga krav på feltolerans. Dessutom ökar det varaktigheten av själva utvecklingsprocessen [34] .
ProjektledningFaktorerna som anges ovan gör komplexiteten i C++-projektledning till en av de högsta inom mjukvaruutvecklingsbranschen.
James Coggins, en fyraårig krönikör för The C++ Report , förklarar:
Problemet är att OOP-programmerare har experimenterat med incestuösa applikationer och strävat efter en låg abstraktionsnivå. Till exempel byggde de klasser som "länkad lista" istället för "användargränssnitt" eller "strålningsstråle" eller "finita elementmodell". Tyvärr gör stark typkontroll, som hjälper C++-programmerare att undvika buggar, det också svårare att bygga stora objekt från små.
Den enda direkta ättlingen till C++ är D-språket , avsett att vara en omarbetning av C++ för att lösa dess mest uppenbara problem. Författarna övergav kompatibiliteten med C, behöll syntaxen och många av de grundläggande principerna för C++ och introducerade funktioner i språket som är karakteristiska för nya språk. D har ingen förprocessor, inga header-filer, inget multipelt arv, utan ett modulsystem, gränssnitt, associativa arrayer, stöd för unicode i strängar, skräpinsamling (med bibehållen möjlighet till manuell minneshantering), inbyggd multithreading, typinferens , explicit deklaration av rena funktioner och oföränderliga värden. Användningen av D är mycket begränsad, den kan inte betraktas som en riktig konkurrent till C++.
Den äldsta konkurrenten till C++ i lågnivåuppgifter är Objective-C , också byggt på principen att kombinera C med en objektmodell, endast objektmodellen ärvs från Smalltalk . Objective-C, liksom dess ättling Swift , används ofta för mjukvaruutveckling för macOS och iOS.
Ett av de första alternativen till C++ inom applikationsprogrammering var Java-språket . Det anses ofta felaktigt vara en direkt ättling till C++; i själva verket ärvs Javas semantik från Modula-2- språket , och den grundläggande semantiken för C++ går inte att spåra i Java. Med tanke på detta, och släktforskningen av språk (Modula-2 är en ättling till Simula , som C++, men det är inte C), kallas Java mer korrekt för " andra kusin " till C++, snarare än " arvingen ". Detsamma kan sägas om C# -språket , även om andelen affinitet med C++ är något högre än för Java.
Ett försök att kombinera säkerheten och utvecklingshastigheten för Java och C# med funktionerna i C++ var Managed C++ dialekten (senare C++/CLI ). Det utvecklades av Microsoft främst för att porta befintliga C++-projekt till Microsoft .NET-plattformen. Program körs under CLR och kan använda hela utbudet av .NET-bibliotek, men det finns ett antal begränsningar för användningen av C++-funktioner, vilket effektivt reducerar C++ till C#. Denna dialekt har inte fått bred erkännande och används främst för att länka bibliotek skrivna i ren C++ med C #-applikationer.
Ett alternativt sätt att utveckla C-språket är att kombinera det inte med objektorienterad programmering, utan med applikativ programmering , det vill säga att förbättra abstraktionen, rigoriteten och modulariteten hos lågnivåprogram genom att tillhandahålla förutsägbart beteende och referenstransparens . Exempel på arbete i denna anda är språken BitC , Cyclone och Limbo . Även om det också finns framgångsrika försök att använda FP i realtidsproblem utan integration med C-verktyg [52] [53] [54] , fortfarande för närvarande (2013) i lågnivåutveckling, användningen av C-verktyg i viss utsträckning har ett bättre förhållande mellan arbetsintensitet och effektivitet. Mycket ansträngning har lagts ner på Python och Lua av Python och Lua- utvecklarna för att säkerställa att dessa språk används av C++-programmerare, så av alla språk som är nära besläktade med FP, är de de som oftast noteras att användas tillsammans med C++ i samma projekt. De viktigaste kontaktpunkterna mellan C++ och FP är bindningarna av wxWidgets och Qt- bibliotek utvecklade i C++ med en C++-specifik ideologi till Lisp , Haskell och Python (i de flesta fall görs bindningar till funktionella språk för bibliotek skrivna i C eller andra funktionella språk).
Ett annat språk som anses vara en konkurrent till C++ är Nemerle , som är resultatet av ett försök att kombinera Hindley-Milners typmodell och en makroundergrupp av Common Lisp med C# [55] . I samma veva är Microsofts F# , en dialekt av ML anpassad för .NET-miljön.
Ett försök att skapa en industriell ersättning för C/C++ var programmeringsspråket Go som utvecklades av Google 2009 . Författarna till språket påpekar direkt att motivet för dess skapande var bristerna i utvecklingsprocessen orsakade av särdragen hos C- och C++-språken [56] . Go är ett kompakt, okomplicerat imperativt språk med C-liknande syntax, ingen förprocessor, statisk typning, stark typning, paketeringssystem, automatisk minneshantering, några funktionella funktioner, ekonomiskt byggt OOP-undersystem utan stöd för implementeringsarv, men med gränssnitt och duck typing , inbyggd multithreading baserad på koroutiner och rör (a-la Occam ). Språket är placerat som ett alternativ till C++, det vill säga, först och främst, ett medel för grupputveckling av mycket komplexa mycket komplexa datorsystem, inklusive distribuerade sådana, som vid behov tillåter lågnivåprogrammering.
I samma ekologiska nisch med C/C++ finns Rust, utvecklad 2010 och underhållen av Mozilla Corporation , fokuserad på säker minneshantering utan användning av en sophämtare . I synnerhet tillkännagavs planer på att delvis ersätta C/C++ med Rust 2019 av Microsoft [57] .
Ordböcker och uppslagsverk | ||||
---|---|---|---|---|
|
Programmeringsspråk | |
---|---|
|
ISO- standarder | |
---|---|
| |
1 till 9999 |
|
10 000 till 19999 |
|
20 000+ | |
Se även: Lista över artiklar vars titlar börjar med "ISO" |
C++ | |
---|---|
Egenheter | |
Vissa bibliotek | |
Kompilatorer | |
påverkas | |
|