C++: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
22denny91 (discussione | contributi)
Nessun oggetto della modifica
Etichette: Modifica visuale Modifica da mobile Modifica da web per mobile Modifica da mobile avanzata
FrescoBot (discussione | contributi)
m Bot: apostrofo dopo l'articolo indeterminativo
 
(25 versioni intermedie di 16 utenti non mostrate)
Riga 4:
|immagine = ISO C++ Logo.svg<!-- Solo nome file -->
|didascalia = Logo del linguaggio
|autore = [[Bjarne Stroustrup]]
|data = 1983
|versione =
|utilizzo = Generico
Riga 20:
C++ fu progettato con in mente la programmazione di [[Sistema embedded|sistemi e software integrati]] o a risorse limitate, presentando come punti salienti prestazioni, efficienza e flessibilità.<ref name=Stroustrup1>{{cita web|url=https://www.youtube.com/watch?v=86xWVb4XIyE|autore=B. Stroustrup|titolo=Lecture:The essence of C++. University of Edinburgh.|data=6 maggio 2014|accesso=12 giugno 2015|urlarchivio=https://web.archive.org/web/20150428003608/https://www.youtube.com/watch?v=86xWVb4XIyE}}</ref> C++ è stato anche ritenuto utile in molti contesti, con i suoi punti di forza nell'infrastruttura e nell'ottimizzazione di risorse limitate,<ref name=Stroustrup1 /> come applicazioni, videogiochi, server (ad esempio [[commercio elettronico]], [[Motore di ricerca|ricerca in rete]] o [[Base di dati|basi dati]]), nonché in applicazioni dove le prestazioni sono critiche, come [[Centralino|centralini telefonici]] o [[Sonda spaziale|sonde spaziali]].<ref name="applications">{{cita web |url=http://www.stroustrup.com/applications.html|titolo=C++ Applications|data=17 febbraio 2014|accesso=5 maggio 2014|autore=Bjarne Stroustrup|urlarchivio=https://web.archive.org/web/20210404065717/https://www.stroustrup.com/applications.html}}</ref>
 
Bjarne Stroustrup cominciò a lavorare su C++ presso i [[Bell Labs]] dal 1979 per estendere il linguaggio C, con lo scopo di ottenere un linguaggio flessibile ed efficiente come C ma capace di permettere operazioni ad alto livello per l'organizzazione di grandi progetti.<ref name="homepage">{{cita web|titolo=Bjarne Stroustrup's Homepage|url=http://www.stroustrup.com|accesso=15 maggio 2013|urlarchivio=https://web.archive.org/web/20190514123147/http://www.stroustrup.com/}}</ref> A partire dal 1998, C++ è normato dall'[[International Organization for Standardization]] (ISO), che dopo la versione ''ISO/IEC 14882:1998'', nota come C++98, ha pubblicato le versioni [[C++03]], [[C++11]], [[C++14]], e [[C++17]]. L'attuale versione più recente, pubblicata nel dicembre 2020 con il nome di ''ISO/IEC 14882:2020'', comunemente dettoe [[C++20]],<ref name="homepage"/> sussume le precedenti e aggiunge nuove funzionalità nonché una [[Libreria standard C++|libreria standard23]] ampliata. Dal 2012, la distribuzione di nuove versioni segue un piano triennale,<ref>{{Cita web|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1000r4.pdf|titolo=C++ IS schedule|accesso=9 agosto 2020|urlarchivio=https://web.archive.org/web/20200810105609/http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1000r4.pdf}}</ref> conper [[C++23]]cui comela prossima versione pianificata è [[C++26]].<ref>{{cita web|titolo=C++; Where it's heading|url=https://dzone.com/articles/c-where-is-it-heading-and-what-are-the-new-feature|accesso=3 dicembre 2018|urlarchivio=https://web.archive.org/web/20181203104022/https://dzone.com/articles/c-where-is-it-heading-and-what-are-the-new-feature}}</ref>
 
== Storia ==
Riga 26:
[[Bjarne Stroustrup]] iniziò a lavorare al linguaggio nel [[1979]]. L'idea di creare un nuovo linguaggio ebbe origine nelle sue esperienze di programmazione durante la realizzazione della tesi di laurea. Stroustrup trovò che il [[Simula]] avesse caratteristiche utili per lo sviluppo di grossi progetti software, ma il linguaggio era troppo lento per l'utilizzo pratico, mentre il [[BCPL]] risultava veloce ma troppo a basso livello per lo sviluppo di grosse applicazioni. Quando Stroustrup cominciò a lavorare ai laboratori Bell, gli fu affidato il compito di analizzare il [[kernel]] di [[Unix]] in ambito di [[calcolo distribuito|elaborazione distribuita]]. Ricordandosi del lavoro della tesi, decise di aggiungere al linguaggio C alcune delle caratteristiche di Simula. Fu scelto il C perché era un linguaggio per uso generico [[Portabilità|portabile]] e veloce. Oltre al C ed al Simula, si ispirò a linguaggi come l'[[ALGOL 68]], [[Ada (linguaggio di programmazione)|Ada]], il [[linguaggio CLU|CLU]] ed il [[ML (linguaggio di programmazione)|linguaggio ML]]. Inizialmente, le funzionalità di [[classe (informatica)|classe]], [[ereditarietà (informatica)|classe derivata]], [[Tipizzazione forte|controllo rigoroso dei tipi]] e argomento di default furono aggiunte al C con [[Cfront]]. La prima versione commerciale fu distribuita nell'ottobre del [[1985]].<ref>{{Cita web|url=http://public.research.att.com/~bs/bs_faq.html#invention|titolo=Stroustrup: FAQ|accesso=22 aprile 2006|urlarchivio=https://web.archive.org/web/20120716211550/http://public.research.att.com/~bs/bs_faq.html#invention|dataarchivio=16 luglio 2012|urlmorto=sì}}</ref>
 
Nel 1983 il nome del linguaggio fu cambiato da "C con classi" a C++. Furono aggiunte nuove funzionalità, tra cui [[funzione virtuale|funzioni virtuali]], ''[[overloading]]'' di funzioni ede [[Operatori in C e C++|operatori]], ''reference'', costanti, controllo dell'utente della gestione della memoria, ''[[type checking]]'' migliorato e commenti nel nuovo stile ("//"). Nel 1985 fu pubblicata la prima edizione di ''The C++ programming Language'', che fornì un'importante guida di riferimento del linguaggio, che non era ancora stato ufficialmente standardizzato. Nel 1989 fu distribuita la versione 2.0 del C++, le cui novità includono l'[[ereditarietà multipla]], le classi astratte, le funzioni membro statiche, le funzioni membro ''const'', e i membri protetti. Nel 1990 fu pubblicato ''The Annotated C++ Reference Manual'', che fornì le basi del futuro standard. Le ultime aggiunte di funzionalità includono i ''template'', le eccezioni, i ''namespace'', i nuovi tipi di ''[[conversione di tipo|cast]]'' ed il [[booleano (informatica)|tipo di dato booleano]].
 
Così come il linguaggio, anche la libreria standard ha avuto un'evoluzione. La prima aggiunta alla libreria standard del C++ è stata la libreria degli ''[[stream (informatica)|stream]]'' di I/O che forniva servizi sostitutivi della libreria C tradizionale (come [[printf]] e [[scanf]]). In seguito, tra le aggiunte più significative c'è stata la ''[[Standard Template Library]]''.
Riga 37:
 
=== Genesi del nome ===
La [[Alfabeto fonetico internazionale|pronuncia]] di C++ è [ˌsiː plʌs ˈplʌs] (in inglese). Il nome fu suggerito da [[Rick Mascitti]] alla metà del [[1983]], quando il linguaggio veniva usato per la prima volta al di fuori dei centri di ricerca. Precedentemente il linguaggio si chiamava "C with classes" (C con classi). Il nome è un gioco di parole con un costrutto del C (dove il doppio segno più è l'[[Operatori in C e C++|operatore]] di autoincremento, che incrementa di una unità il valore di una variabile) insieme con la comune convenzione di aggiungere un segno più per indicare una versione potenziata. Secondo Stroustrup: ''«++ è l'operatore di incremento del C [...] il nome esprime la natura evoluzionaria dei cambiamenti dal C»''. Impiegando il [[gioco di parole]] si evita anche il problema che "C+" è già stato usato per un linguaggio senza alcun nesso col C++ (senza menzionare che è comunemente associato con una valutazione poco più che sufficiente in una performance accademica).
 
Quando, nel 1992, gli furono chieste informalmente spiegazioni sul nome, [[Rick Mascitti]] ha spiegato di aver dato il suggerimento con spirito [[goliardia|goliardico]], e che non pensava che quello sarebbe divenuto il nome formale del linguaggio. Stroustrup ha anche suggerito a posteriori un'interpretazione [[George Orwell|orwelliana]] del nome, in riferimento al "Dizionario C" della [[Neolingua]] - nel romanzo il dizionario dei termini tecnici, unico residuo di un linguaggio scientifico - descritto nell'appendice di ''[[1984 (romanzo)|1984]]'' e al prefisso ''doubleplus'' (''arcipiù'' nell'edizione italiana), utilizzato in Neolingua per il superlativo. Benché non fedelissimo alla sintassi fittizia definita nel romanzo con estrema precisione, il nome suonerebbe come "C-issimo" e connoterebbe comunque il C++ come intenso miglioramento del C.<ref>{{cita libro| Bjarne | Stroustrup | C++ - Linguaggio, libreria standard, principi di programmazione | 2000 | Addison-Wesley | | capitolo="Note al lettore"}}</ref>
 
== Descrizione ==
 
=== Linguaggio ===
La prima parte dello [[Norma tecnica|standard]] definisce le caratteristiche fondamentali del linguaggio<ref>{{Cita libro|lingua=inglese|autore=Bjarne Stroustrup|titolo=The C++ Programming Language, 4th Edition|capitolo=2.2 The Basics}}</ref>. Lo standard suddivide questa parte in argomenti<ref>{{Cita web|lingua=en|url=https://www.iso.org/standard/83626.html|titolo=ISO/IEC 14882:2024 Programming languages — C++|accesso=23 aprile 2025}}</ref><ref>{{Cita web|lingua=en|url=https://www.iso.org/obp/ui/en/#iso:std:iso-iec:14882:ed-7:v1:en|titolo=ISO/IEC 14882:2024(en) Programming languages — C++|accesso=23 aprile 2025}}</ref>:
 
* la dichiarazione e definizione delle [[Variabile (informatica)|variabili]], incluso il loro ciclo di vita, come sono modellate in memoria e i tipi fondamentali
* le [[Espressione (informatica)|espressioni]] e la loro grammatica, come si definiscono, come si compongono (per esempio usando gli [[Operatori in C e C++|operatori]]) e come avvengono le conversioni tra di loro
* le [[Struttura di controllo|strutture di controllo]] quali ad esempio if, for, while, break, return
* dichiarazioni e inizializzatori in generale: [[Funzione (informatica)|funzioni]], enum, [[namespace]], attributi e gli specificatori come [[Allocazione statica della memoria|static]], friend e inline
* i moduli
* le [[Classe (informatica)|classi]]
* [[Overloading|overload]] di funzioni e operatori
* i [[Programmazione generica|template]]
* le [[Eccezione (informatica)|eccezioni]]
* le direttive del [[preprocessore]]
 
La sintassi di base del C++ è un'estensione di quella del linguaggio C<ref name="c_comp">{{Cita libro|lingua=inglese|autore=Bjarne Stroustrup|titolo=The C++ Programming Language, 4th Edition|capitolo=44.3 C/C++ Compatibility|citazione=With minor exceptions, C++ is a superset of C}}</ref>. Alcuni punti in cui le differenze sono visibili sono la presenza di numerose parole chiave specifiche del linguaggio C++ e l'utilizzo di funzionalità specifiche come i template e i reference rvalue<ref>{{Cita libro|lingua=inglese|autore=Bjarne Stroustrup|titolo=The C++ Programming Language, 4th Edition|capitolo=44.3.1 C and C++ Are Siblings, 44.3.3 C Code That Is Not C++}}</ref>.
 
Lo stile di programmazione (definito anche come paradigma)<ref name="multi_p">{{Cita libro|lingua=inglese|autore=Bjarne Stroustrup|titolo=The C++ Programming Language, 4th Edition|capitolo=1.2.1 Programming Style}}</ref> supportato dal C++ non è unico. Si può scrivere codice usando uno stile [[Programmazione procedurale|procedurale]] o basato sull'astrazione dei dati (mediante l'uso di interfacce) od orientato agli [[Programmazione orientata agli oggetti|oggetti]] o in stile [[Programmazione generica|generico]]<ref name="multi_p"/>. La possibilità di utilizzare oggetti come funzioni sin da C++98 permette di utilizzare anche lo stile [[Programmazione funzionale|funzionale]], cosa facilitata dalle funzionalità aggiunte da C++11 e versioni successive<ref>{{Cita libro|lingua=inglese|autore=Ivan Cukic|titolo=Functional Programming in C++|capitolo=1.5 Evolution of C++ as a functional programming language}}</ref>.
 
=== Libreria standard ===
LoLa [[Normaseconda parte dello tecnica|standard]] del C++ delriguarda la [[1998Libreria standard C++|libreria standard]]; consistequest'ultima è un insieme di duecomponenti<ref>{{Cita partilibro|lingua=inglese|autore=Nicolai M. Josuttis|titolo=C++ Standard Library, The: ilA nucleoTutorial deland linguaggioReference, e2nd laEdition|capitolo=1.3. [[LibreriaStyle standardand delStructure Cof the Book|libreriacitazione=The C++ standard]]; quest'ultimalibrary includeprovides lacomponents maggiorthat parteare dellasomewhat, but not totally, independent of one another}}</ref> di cui una porzione importante è la [[Standard Template Library]] (STL)<ref>{{Cita libro|lingua=inglese|autore=Nicolai M. EsistonoJosuttis|titolo=C++ molteStandard librerieLibrary, perThe: ilA C++Tutorial cheand nonReference, fanno2nd parteEdition|capitolo=1.3. delloStyle standardand edStructure èof possibile,the usandoBook|citazione=There ilis linkingno esternodoubt that the STL is the most powerful, utilizzaremost anchecomplex, leand libreriemost scritteexciting perpart ilof linguaggiothe Clibrary}}</ref>. La STL era in origine una libreria di terze parti, sviluppata da [[Hewlett-Packard|HP]] e in seguito da [[Silicon Graphics]], prima che venisse incorporata nel C++ standard. Lo standard non si riferisce a essa come alla "STL", poiché è semplicemente parte della libreria completa, ma molti continuano a usare il termine<ref>{{Cita libro|lingua=inglese|autore=Marc Gregoire|titolo=Professional C++, 5th Edition|capitolo=16 Overview of the C++ Standard Library|citazione=The heart of the C++ Standard Library is its generic containers and algorithms. Some people still call this subset of the library the Standard Template Library, or STL for short, because originally it was based on a third-party library called the Standard Template Library, which used templates abundantly. However, STL is not a term defined by the C++ standard itself}}</ref> per distinguerla dal resto della libreria (come flussi di I/O, internazionalizzazione, funzioni diagnostiche, ecc.).
 
La maggior parte deiMolti compilatori fornisceforniscono anche un'implementazione della libreria standard, STL compresa. Esistono anche versioni indipendenti dal compilatore della STL, come ad esempio la [[STLPort]].<ref>{{Cita web |url=http://www.stlport.org|titolo=STLport: Welcome!<!-- Titolo generato automaticamente -->}}</ref>
 
Esistono molte librerie per il C++ che non fanno parte dello standard ed è possibile, con il meccanismo della convenzione di linkage extern "C"<ref>{{Cita libro|lingua=inglese|autore=Bjarne Stroustrup|titolo=The C++ Programming Language, 4th Edition|capitolo=15.2.5 Linkage to Non-C++ Code}}</ref>, utilizzare anche le librerie scritte per il linguaggio C.
 
=== Compilatori ===
Esistono svariati [[compilatori]] per C++<ref>{{Cita web|lingua=en|url=https://isocpp.org/get-started|titolo=Get Started!|accesso=23 aprile 2025}}</ref> che supportano lo standard a diversi livelli di completezza<ref name="comp_sup">{{Cita web|lingua=en|url=https://en.cppreference.com/w/cpp/compiler_support|titolo=C++ compiler support|accesso=23 aprile 2025}}</ref>. Tra i progetti [[Software libero|free software]]/[[open source]], esistono [[GNU Compiler Collection|GCC]]<ref>{{Cita web|lingua=en|url=https://gcc.gnu.org/|titolo=GCC, the GNU Compiler Collection|accesso=23 aprile 2025}}</ref> (supporta numerose combinazioni di [[Sistema operativo|sistemi operativi]] e [[Instruction set|architetture]]) e [[Clang]]<ref>{{Cita web|lingua=en|url=https://clang.llvm.org/|titolo=Clang: a C language family frontend for LLVM|accesso=23 aprile 2025}}</ref> (a sua volta disponibile per molte piattaforme diverse, tra cui una versione per [[MacOS]] inclusa nell'[[Ambiente di sviluppo integrato|IDE]] [[Xcode|XCode]]<ref>{{Cita web|lingua=en|url=https://developer.apple.com/xcode/|titolo=Xcode|accesso=23 aprile 2025}}</ref> di [[Apple]]). Esistono inoltre implementazioni [[Software proprietario|proprietarie]] come [[VisualC++|Visual C++]]<ref>{{Cita web|url=https://visualstudio.microsoft.com/it/vs/features/cplusplus/|titolo=Visual Studio IDE C/C++ e compilatore per Windows|accesso=23 aprile 2025}}</ref> per [[Microsoft Windows]], [[NVIDIA|Nvidia]] HPC C++<ref>{{Cita web|lingua=en|url=https://developer.nvidia.com/hpc-sdk|titolo=NVIDIA HPC SDK|accesso=23 aprile 2025}}</ref> e [[Hewlett Packard Enterprise|HPE]] Cray CCE<ref>{{Cita web|lingua=en|url=https://cpe.ext.hpe.com/docs/latest/cce/index.html#cce|titolo=Cray Compiler Environment|accesso=23 aprile 2025}}</ref>. Svariate versioni di compilatori basate su Clang/[[LLVM]] sono disponibili da compagnie come [[IBM]] con [[XL C/C++]]<ref>{{Cita web|lingua=en|url=https://www.ibm.com/products/c-and-c-plus-plus-compiler-family|titolo=IBM C and C++ Compiler Family|accesso=23 aprile 2025}}</ref> (per [[AIX (sistema operativo)|AIX]], [[Linux]], [[z/OS]], [[IBM Z|z/VM]]), [[Intel]] con oneAPI DPC++/C++ Compiler<ref>{{Cita web|lingua=en|url=https://www.intel.com/content/www/us/en/developer/tools/oneapi/dpc-compiler.html|titolo=oneAPI DPC++/C++ Compiler|accesso=23 aprile 2025}}</ref> e [[Embarcadero Technologies|Embarcadero]] C++ Compiler<ref>{{Cita web|lingua=en|url=https://www.embarcadero.com/free-tools/ccompiler|titolo=C++ Compiler|accesso=23 aprile 2025}}</ref>.
Alcuni [[compilatori]] per C++ sono: [[GNU Compiler Collection|GCC]] (multipiattaforma), [[Clang]] (disponibile per molte piattaforme diverse), [[MinGW]] ([[porting]] di GCC per Windows), [[DJGPP]] e [[TerzC++Compile]]r. Oltre a questi ci sono i compilatori commerciali come [[VisualC++]], [[C++ Builder]] (inizialmente realizzato dalla [[Borland]]). Su sistema operativo [[macOS]], è possibile utilizzare il programma [[Xcode]].
 
Lo standard del C++ non specifica l'implementazione della [[decorazione dei nomi]], della [[gestione delle eccezioni]] e altre funzioni specifiche dell'implementazione, e ciò rende incompatibile il [[codice oggetto]] prodotto da compilatori diversi. Ci sono però standard di terze parti per particolari macchine o sistemi operativi che cercano di standardizzare i compilatori per tali piattaforme, ad esempio l'ABI per C++<ref>{{Cita web|url=https://mentorembedded.github.io/cxx-abi/|titolo=C++ ABI|sito=mentorembedded.github.io|accesso=7 maggio 2018}}</ref>, e successivamente molti compilatori hanno standardizzato questi elementi.
 
Per molti anni i diversi compilatori hanno implementato lo standard del C++ con diversi livelli di correttezza, in particolare la [[specializzazione parziale dei template]]. Le versioni recenti dei compilatori più usati supportano quasi tutto lo standard del [[C++20]]<ref del 1998name="comp_sup"/>.
 
=== Operatori ===
{{Vedi anche|Operatori in C e C++}}
In C++, gli [[Operatori in C e C++|operatori]] sono punteggiature speciali che eseguono operazioni su uno o più operandi; questi possono essere classificati in diverse categorie, come logici, di assegnazione, [[Booleano (informatica)|booleani]], ..., e consentono di scrivere espressioni e di manipolare dati in modo efficace all'interno del codice C++.
 
== Programmi di esempio (derivati da C) ==
Riga 383 ⟶ 408:
 
== Voci correlate ==
* [[Operatori in C e C++]]
* [[C++11]]
* [[Crypto++]]
Riga 404 ⟶ 430:
{{Linguaggio C}}
{{Principali linguaggi di programmazione}}
{{Android}}
 
{{Controllo di autorità}}
{{portale|informatica}}