C (linguaggio di programmazione): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
"C" essendo un nome proprio non richiede l'articolo determinativo: rimuovo il suddetto
Riga 18:
In [[informatica]], '''C''' è un [[linguaggio di programmazione]] [[Programmazione imperativa|imperativo]] di natura [[Programmazione procedurale|procedurale]]; i [[programma (informatica)|programmi]] scritti in questo linguaggio sono composti da espressioni matematiche e da [[Istruzione (informatica)|istruzioni]] imperative raggruppate in procedure parametrizzate in grado di manipolare vari [[tipo di dato|tipi di dati]].
 
Integra caratteristiche dei linguaggi di [[linguaggio di programmazione a basso livello|basso livello]], ovvero [[Carattere (informatica)|caratteri]], numeri e [[Indirizzo di memoria|indirizzi]], che possono essere indicati tramite gli operatori aritmetici e [[Connettivo logico|logici]] di cui si servono le macchine reali<ref>{{Cita libro|titolo=Il Linguaggio C - Principi di programmazione e manuale di riferimento (Seconda edizione) - Brian W. Kernighan, Dennis M. Ritchie|editore=Pearson Prentice Hall|p=Introduzione - XIV}}</ref>. Il C è stato concepito per essere snello e performante, si avvale peraltro di numerose librerie per far fronte ad ogni tipo di esigenza, in particolare la [[libreria standard deldi C]]. Tali librerie, sotto forma di file di intestazione o [[header file|file]] con suffisso -h, possono essere caricate mediante la direttiva ''#include'' del [[preprocessore]].
 
== Storia ==
 
Il linguaggio fu originariamente sviluppato da [[Dennis Ritchie]]<ref>{{Cita pubblicazione |autore-capitolo=Dennis Ritchie |autore-capitolo2=Brian Kernighan | data=2004 |titolo=Il linguaggio C. Principi di programmazione e manuale di riferimento |editore=Prentice Hall |capitolo=XI |p=320 |url=https://www.pearson.it/opera/pearson/0-2552-il_linguaggio_c ||citazione=Il C fu progettato e scritto per il sistema operativo UNIX, sul DEC PDP-11, da Dennis Ritchie}}</ref> presso i [[Bell Laboratories|Bell Labs]] della [[AT&T]] tra il 1969 e il 1973, con lo scopo di utilizzarlo per la stesura del sistema operativo [[UNIX]], precedentemente realizzato da [[Ken Thompson]] e Ritchie stesso in [[assembly]] del [[PDP-7]]. Nel 1972 esordì il primo sistema UNIX su un DEC [[PDP-11]], scritto interamente col nuovo linguaggio di programmazione C.<ref>{{Cita web |url=https://www.bell-labs.com/usr/dmr/www/chist.html |titolo=The Development of the C Language |autore=Dennis Ritchie |sito=Bell Labs/Lucent Technologies |data=1993 |lingua=en |formato=pdf |citazione=C came into being in the years 1969-1973, in parallel with the early development of the Unix operating system; the most creative period occurred during 1972 |accesso=1º maggio 2017}}</ref> Nel [[1978]], la pubblicazione del libro ''[[Il linguaggio C]]'' ne fece crescere rapidamente la diffusione, portando alla nascita di diversi ''dialetti'' e dunque alla necessità di definire uno standard.
 
La prima standardizzazione deldi C fu realizzata dall'[[American National Standards Institute|ANSI]] nel 1989 (ANSI X3.159-1989), nota come C89. La stessa versione, solo con modifiche di formattazione minime, fu poi standardizzata anche dall'[[Organizzazione internazionale per la normazione|ISO]] nel 1990 (ISO/IEC 9899:1990), nota come C90. Successivamente l'ISO ha pubblicatoaltre quattro versioni del linguaggio C, note come C95 (ISO/IEC 9899/AMD1:1995), [[C99 (linguaggio di programmazione)|C99]] (ISO/IEC 9899:1999), C11 (ISO/IEC 9899:2011/Cor 1:2012) e C18 (ISO/IEC 9899:2018). Di queste, la C99 ha portato i principali miglioramenti al linguaggio di programmazione, introducendo nuovi tipi di dato, gli inizializzatori designati per gli array, gli array di dimensione variabile e altri miglioramenti mutuati da [[C++]].
 
== Descrizione ==
Nato insieme a [[Unix]], C è supportato dalla totalità dei [[sistemi operativi]] di largo uso impiegati ed è impiegato principalmente per la realizzazione di [[sistemi operativi]], [[linguaggi di programmazione]], [[Libreria (software)|librerie]], [[videogioco|giochi]] e per [[applicazione (informatica)|applicazioni]] altamente performanti; è rinomato per la sua [[efficienza (informatica)|efficienza]] e si è imposto come linguaggio di riferimento per la realizzazione di software di sistema su gran parte delle piattaforme [[hardware]] moderne. La standardizzazione del linguaggio (da parte prima dell'[[ANSI]] e poi dell'[[ISO]]) garantisce la [[portabilità]] dei programmi scritti in C (standard, spesso detto ANSI C) su qualsiasi piattaforma; oltre che per il software di sistema, è stato a lungo il linguaggio dominante in tutta una serie di altri [[dominio applicativo|domini applicativi]] caratterizzati mirati sull'efficienza. Esempi tipici sono le [[telecomunicazioni]], il [[Controllo industriale|controllo di processi industriali]] e il software [[sistema real-time]]. Il predominio deldi C in questi contesti è in parte diminuito a seguito dell'avvento di alternative significative, primo fra tutti il [[C++]].
 
Il C ha anche una notevole importanza didattica, sebbene, per la sua complessità [[semantica (informatica)|semantica]] e per le forti relazioni di tale semantica con il funzionamento dell'[[hardware]] dei [[computer]], non si tratti di un linguaggio particolarmente intuitivo per i principianti e, in special modo, per quelli sprovvisti di un'adeguata preparazione riguardante l'[[elettronica]] dei calcolatori. Se un tempo le scuole superiori e i corsi universitari adottavano il C come linguaggio di riferimento a causa della sua importanza tecnica, oggi questa scelta trova un'ulteriore motivazione nella crescente importanza di linguaggi che dalda C derivano (per esempio [[C++]], [[Java (linguaggio di programmazione)|Java]] e [[C sharp|C#]] e, per consentire allo studente un approccio iniziale più rapido e intuitivo, linguaggi ad alto livello come [[Python]]).
 
=== Caratteristiche generali ===
Il C è un linguaggio di programmazione relativamente minimalista; la sua semantica utilizza un insieme ristretto di concetti relativamente semplici e vicini al funzionamento dell'hardware dei calcolatori. Molte [[istruzione (informatica)|istruzioni]] C sono traducibili direttamente con una singola istruzione di [[linguaggio macchina]] (per esempio, gli operatori di [[autoincremento e autodecremento]]). Nel linguaggio, un ruolo centrale viene svolto dal concetto di [[puntatore (programmazione)|puntatore]], che viene generalizzato fino a coincidere con l<nowiki>'</nowiki>indirizzamento indiretto, un modo di accedere alla memoria hardware caratteristico di tutte le moderne [[CPU]]. Questo rende il C un linguaggio particolarmente efficiente. Inoltre, rispetto al linguaggio assembly, il C ha in più una struttura logica definita e leggibile, funzioni in stile [[Pascal (linguaggio di programmazione)|Pascal]] e soprattutto il controllo sui tipi (in fase di compilazione), che manca completamente nel linguaggio assembly.
 
La sintassi deldi C è piuttosto versatile e il linguaggio è in [[linguaggio in forma libera|forma libera]], permettendo di scrivere istruzioni complesse in poche righe di codice o di creare programmi criptici e illeggibili ([[offuscamento del codice]]). In definitiva, il successo deldi C fu decretato dall'essere un linguaggio creato da programmatori esperti, per essere usato da programmatori esperti.
 
Questa grande libertà, la complessità sintattica del linguaggio (che come abbiamo visto contiene poche istruzioni di base) e il ruolo centrale dei puntatori, che è necessario usare praticamente fin dai primi programmi, lo rendono quindi un linguaggio ostico e sconsigliabile ai neofiti, che cadono quasi subito in una serie di trappole che, se pure ovvie per un esperto, sono molto difficili da individuare per un principiante.
 
Grazie alla particolare efficienza del codice prodotto dai suoi compilatori, il C venne utilizzato per riscrivere la maggior parte del codice del sistema [[UNIX]], riducendo l'uso del linguaggio assembly ad un piccolo gruppo di funzioni.
La sua importanza tuttavia, crebbe solo dopo il [[1978]] con la pubblicazione, da parte di [[Brian Kernighan]] e [[Dennis Ritchie]], del libro ''[[Il linguaggio C|The C Programming Language]],'' nel quale il linguaggio venne definito in modo preciso.
 
Il suo successivo larghissimo utilizzo portò alla nascita di diversi [[dialetto|dialetti]] e quindi alla necessità di definirne uno standard. A questo scopo, nell'estate del [[1983]], venne nominato un comitato con il compito di creare uno standard ANSI (''[[ANSI|American National Standards Institute]]'') che definisse il linguaggio C una volta per tutte. Il processo di standardizzazione, il quale richiese sei anni (molto più del previsto), terminò nel dicembre del [[1989]] e le prime copie si resero disponibili agli inizi del [[1990]]. Questa versione deldi C è normalmente chiamata C89. Lo standard venne anche adottato dall{{'}}''International Organisation for Standardisation'' ([[ISO]]) nel [[1999]] con il nome di C Standard ANSI/ISO. Nel [[1995]], fu adottato l'Emendamento 1 al C Standard che, fra le altre cose, ha aggiunto nuove funzioni alla [[libreria software|libreria]] standard del linguaggio. Usando come documento base il C89 con l'Emendamento 1 e unendovi l'uso delle classi di [[Simula]], [[Bjarne Stroustrup]] iniziò a sviluppare il [[C++]].
 
Il risultato finale del continuo sviluppo deldi C fu lo standard promulgato nel [[1999]], noto come ISO C99 (codice ISO 9899).
 
Con la versione C11 (2011) vengono lievemente rivisti alcuni comandi, mentre la versione C18 (2018) ha corretto alcune criticità della C11, senza tuttavia introdurre alcuna nuova funzionalità.
Riga 141:
printf("Hello, world!\n");
</syntaxhighlight>
Questa riga costituisce una chiamata di funzione; in altre parole, richiede che venga eseguita tale funzione. <code>[[printf]]</code> è una funzione della [[libreria standard deldi C]] che stampa un messaggio su [[standard output]]. Pertanto sullo schermo apparirà la scritta ''Hello, world!'' (senza doppi apici, che servono nel codice sorgente a indicare inizio e fine della [[Stringa (informatica)|stringa]]).
 
<code>''\n''</code> è una ''sequenza di escape'', ovvero una sequenza di caratteri (che in C cominciano sempre con il carattere <code>''\''</code>) che verranno tradotti in fase di compilazione in un unico carattere (solitamente non stampabile od interpretato in altro modo). In particolare, <code>''\n''</code> verrà tradotto nel carattere di fine riga che, quando usato con le librerie standard in modalità testo (come con <code>printf</code>), indica l'avanzamento di linea ed il ritorno a capo del testo. Quindi, se il programma viene usato interattivamente, in genere uno spostamento del [[cursore]].
Riga 227:
== Linguaggi collegati ==
 
Molti tra i principali linguaggi di programmazione moderni sono ispirati ala C e ne ereditano parte della sintassi. Alcuni linguaggi (come [[Java (linguaggio di programmazione)|Java]], [[C++]], [[C sharp|C#]] e [[Objective C]]) mantengono buona parte della sintassi deldi C e la estendono per meglio supportare differenti paradigmi di programmazione, mentre altri linguaggi modernizzano la sintassi ma cercano di mantenere gli stessi paradigmi e domini applicativi deldi C, come programmazione di sistema (ad esempio [[Go (linguaggio di programmazione)|Go]]) o [[sistema embedded|sistemi integrati]] (ad esempio [[Zig (linguaggio di programmazione)|Zig]]).
 
=== C++ ===
{{vedi anche|C++}}
Il linguaggio di programmazione [[C++]] fu originariamente derivato dalda C. Tuttavia, non tutti i programmi C sono validi in C++. Mentre C e C++ evolvevano indipendentemente, sono aumentate le loro incompatibilità<ref>{{Cita web |url=http://david.tribble.com/text/cdiffs.htm|titolo=Incompatibilities Between ISO C and ISO C++}}</ref>. La versione del C99 creò un numero di conflitti in più. Le differenze rendono difficile la scrittura di programmi e librerie che funzionino sia in C che in C++, e creano confusione in chi programma in entrambi i linguaggi. La disparità rende difficile per entrambi i linguaggi l'adozione di caratteristiche dall'altro.
 
[[Bjarne Stroustrup]], il creatore di C++, ha ripetutamente suggerito<ref>{{Cita web |url=http://www.research.att.com/~bs/sibling_rivalry.pdf|titolo=Sibling Rivalry: C and C++}}</ref> che le incompatibilità tra il C e il C++ dovrebbero essere ridotte il più possibile per massimizzare l'interoperatività tra i due linguaggi. Altri hanno sostenuto che poiché il C e il C++ sono linguaggi differenti, la compatibilità tra i due è utile ma non vitale. Secondo questa posizione, gli sforzi per ridurre l'incompatibilità non devono ostacolare i tentativi per migliorare in modo autonomo i linguaggi.
 
Oggi, le maggiori differenze (a parte l'aggiunta nelin C++ delle classi, template, namespace, overloading) tra i due linguaggi sono:
* <code>inline</code> - le [[funzione inline|funzioni inline]] hanno lo ''scope'' globale in C++<!--, and in the file (so-called "static") scope in C. In simple terms, this means that in C++, any definition of any inline function (but irrespective of C++ function overloading) must conform to C++'s "[[One Definition Rule]]" or ODR, requiring that either there be a single definition of any inline function or that all definitions be semantically equivalent; but that in C, the same inline function could be defined differently in different ''translation units'' (translation unit typically refers to a [[Computer file|file]]). (Note that Microsoft C++ compilers define inline functions as C99 ones)-->.
* Il tipo <code>bool</code> nelin C99 è definito nel <code><stdbool.h></code>. Gli standard precedenti deldi C non definivano un tipo ''boolean'', e vari (incompatibili) metodi erano usati per simulare il tipo booleano.
* Singole costanti di caratteri (racchiuse tramite apici singoli) hanno la dimensione di un <code>int</code> in C e di un <code>char</code> in C++.
<!-- Quindi in C <code>sizeof 'a' == sizeof(int)</code> mentre in C++ <code>sizeof 'a' == sizeof(char)</code>.--><!-- Nevertheless, even in C they will never exceed the values that a <code>char</code> can store, so <code>(char)'a'</code> is a safe conversion that will only change the type of the expression (here it is changed from int to char), but not its value (which on systems using ASCII-encoded characters is 97).-->
* Parole chiave addizionali sono introdotte nelin C++, e quindi non possono essere usate come identificatori come invece era lecito in C (per esempio <code>try</code>, <code>catch</code>, <code>template</code>, <code>new</code>, <code>delete</code>, ...)
* In C++, il compilatore crea automaticamente un ''tag'' per ogni <code>struct</code>, <code>union</code> o <code>enum</code>, quindi <code>struct S {};</code> in C++, in C è equivalente a <code>typedef struct S {} S;</code>.
 
=== Objective-C ===
{{Vedi anche|Objective C}}
Il linguaggio Objective C deve la sua popolarità a [[Apple]] che lo ha scelto come base per i suoi sistemi operativi [[macOS]], [[iOS]], [[watchOS]] e [[tvOS]]. È un linguaggio orientato agli oggetti e, a differenza deldi [[C++]], mantiene la piena compatibilità con il C.
 
Nel 2014, Apple presenta un nuovo linguaggio, [[Swift (linguaggio di programmazione)|Swift]] che ha sostituito Objective C nella programmazione sui sistemi operativi sopracitati.