C (linguaggio di programmazione): differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Negli anni '90 all'università si pronunciava all'italiana |
Annullata la modifica 145187668 di 62.97.36.6 (discussione) Etichetta: Annulla |
||
(25 versioni intermedie di 20 utenti non mostrate) | |||
Riga 5:
|autore = [[Dennis Ritchie]]
|data = 1972
|versione =
|utilizzo = Generico (alta efficienza)
|paradigmi = [[Programmazione imperativa|imperativo]] [[Programmazione procedurale|procedurale]]
Riga 15:
}}
'''C''' ([[Alfabeto fonetico internazionale|AFI]]: {{IPA|/ˈsiː/|en}}{{cn}}) è un [[linguaggio di programmazione]]
Successore del linguaggio [[B (linguaggio di programmazione)|B]], C fu in origine sviluppato ai [[Bell Labs]] da Ritchie tra il 1972 e il
C è un linguaggio procedurale imperativo, che supporta la [[programmazione strutturata]], la [[Visibilità (programmazione)|visibilità lessicale]] e la [[ricorsione]], e possiede un [[Sistema dei tipi|sistema di tipi]] statico. Il linguaggio C permette l'utilizzo a basso livello alla [[Memoria (informatica)|memoria]] e fornisce costrutti che combaciano efficientemente con le istruzioni del [[linguaggio macchina]]. Nonostante le sue capacità a basso livello, il linguaggio è adatto per essere programmato su piattaforme diverse: un programma in C conforme scritto per essere portabile può essere compilato per una vasta gamma di piattaforme con poche variazioni al suo codice sorgente.<ref name="cppreference2">{{cita web|url=http://en.cppreference.com/w/c/language/history|titolo=History of C|accesso=28 maggio 2018|urlarchivio=https://web.archive.org/web/20180529130541/http://en.cppreference.com/w/c/language/history|urlmorto=}}</ref>
A partire dal 2000, C è
== 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=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
La prima standardizzazione di 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
=== Funzionalità introdotte nelle revisioni del linguaggio ===
==== C99 ====
* Il tipo di dato
* Il tipo di dato
* Il tipo di dato
* Il tipo di dato
* Il tipo booleano in <code><stdbool.h></code>;
* Le funzionalità addizionali floating-point in <code><float.h></code>;
* I commenti su linea singola introdotti da
* Le funzioni
* Il qualificatore di tipo
* È rimosso l'
* La lunghezza variabile dell'array (VLA, variable-length array);
* I letterali composti (Compound literals);
Riga 45:
* È ammesso dichiarare variabili ovunque si desidera nell'ambito di un blocco di codice così come frapporre tra di esse altre istruzioni;
* Le funzioni della famiglia vscanf;
* Le regole per le [[Costante (informatica)|costanti]] di tipo intero;
* Le regole di promozione degli interi (integer promotion);
* Le macro matematiche di tipo generico in <code><tgmath.h></code>;
* Le macro con un numero variabile di argomenti;
* La macro <code>va_copy</code>;
* Lo specificatore di conversione
* Il supporto all'aritmetica IEEE Floating-Point ([[IEC 559]]);
* L'operatore di preprocessing
==== C11 ====
Lo standard C11 ha introdotto cinque nuovi file header, ovvero <code><stdalign.h></code>, <code><stdatomic.h></code>, <code><stdnoreturn.h></code>, <code><threads.h></code> e <code><uchar.h></code>, nonché diverse funzionalità che hanno contribuito a migliorare il linguaggio:
* Le macro inerenti alle specifiche di allineamento della memoria, con il relativo file header <code><stdalign.h></code> , tra cui
* Aggiunto il supporto al
* Le strutture (
* Espressioni di tipo generico mediante la parola chiave
* Migliorato il supporto Unicode con i tipi di dato <code>char16_t</code> ([[UTF-16]]) e <code>char32_t</code> ([[UTF-32]]) con le relative funzioni di conversione dichiarate in <code><uchar.h></code>;
* Rimossa la funzione <code>gets()</code> dichiarata in <code><stdio.h></code>;
* Lo specificatore
* Le asserzioni statiche mediante la parola chiave
* La funzione <code>quick_exit</code> per la terminazione di un programma;
* Bounds-checking interfaces (specificate nella sezione opzionale "Annex K" del C11);
* Analyzability features (specificate nella sezione opzionale "Annex L" del C11);
* La modalità esclusiva
* Le macro per la creazione di numeri complessi in <code><complex.h></code>.
Riga 77:
=== Caratteristiche generali ===
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
La sintassi di 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 di C fu decretato dall'essere un linguaggio creato da programmatori esperti, per essere usato da programmatori esperti.
Riga 83:
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, 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
Il suo successivo larghissimo utilizzo portò alla nascita di diversi dialetti e quindi alla necessità di definirne uno standard. A questo scopo, nell'estate del
Il risultato finale del continuo sviluppo di C fu lo standard promulgato nel
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à.
=== Tipi di dato ===
C supporta quattro [[tipi di dato]] fondamentali, tutti numerici:
Esistono inoltre i seguenti modificatori, che si possono anteporre ai nomi dei tipi interi per cambiarne delle caratteristiche:
C supporta
I tipi complessi presenti sono gli [[array]], le enumerazioni (
=== Parole chiave ===
Riga 105:
Lo standard ANSI ha definito il seguente insieme di parole chiave:
<!-- non aggiungete parole a caso, solo quelle ansi o meglio iso -->
{{Codice|codice=auto|linguaggio=C}}, {{Codice|codice=break|linguaggio=C}}, {{Codice|codice=case|linguaggio=C}}, {{Codice|codice=char|linguaggio=C}}, {{Codice|codice=const|linguaggio=C}}, {{Codice|codice=continue|linguaggio=C}}, {{Codice|codice=default|linguaggio=C}}, {{Codice|codice=do|linguaggio=C}}, {{Codice|codice=double|linguaggio=C}}, {{Codice|codice=else|linguaggio=C}}, {{Codice|codice=enum|linguaggio=C}}, {{Codice|codice=extern|linguaggio=C}}, {{Codice|codice=float|linguaggio=C}}, {{Codice|codice=for|linguaggio=C}}, {{Codice|codice=goto|linguaggio=C}}, {{Codice|codice=if|linguaggio=C}}, {{Codice|codice=int|linguaggio=C}}, {{Codice|codice=long|linguaggio=C}}, {{Codice|codice=register|linguaggio=C}}, {{Codice|codice=return|linguaggio=C}}, {{Codice|codice=short|linguaggio=C}}, {{Codice|codice=signed|linguaggio=C}}, {{Codice|codice=sizeof|linguaggio=C}}, {{Codice|codice=static|linguaggio=C}}, {{Codice|codice=struct|linguaggio=C}}, {{Codice|codice=switch|linguaggio=C}}, {{Codice|codice=typedef|linguaggio=C}}, {{Codice|codice=union|linguaggio=C}}, {{Codice|codice=unsigned|linguaggio=C}}, {{Codice|codice=void|linguaggio=C}}, {{Codice|codice=volatile|linguaggio=C}}, {{Codice|codice=while|linguaggio=C}}.
=== Sequenze di escape ===
! Sequenza
! Nome del carattere
Riga 132:
|<code>\"</code> || " (doppi apici)
|-
|<code>\0</code> || [[NULL]] (carattere nullo o di fine stringa)
|}
Riga 139:
{{Vedi anche|Hello world}}
Il seguente esempio stampa il testo
<syntaxhighlight lang="c" line="1">
#include <stdio.h>
Riga 149:
}
</syntaxhighlight>
Quanto segue è un'analisi linea per linea del programma mostrato; questo tipo di scrittura è eseguibile soltanto su sistemi basati su
<syntaxhighlight lang="c" line="1" start="1">#include <stdio.h></syntaxhighlight>
Questa linea è una [[direttiva di inclusione]] per il [[preprocessore]]. Il preprocessore è un programma (o un modulo di un [[Integrated Development Environment|ambiente integrato]]) che esegue alcune trasformazioni preliminari del [[codice sorgente]], prima che quest'ultimo venga consegnato al [[compilatore]] vero e proprio. In questo caso, la trasformazione richiesta consiste nel rimpiazzare la linea in questione con l'intero contenuto dello ''[[header file]]'' ("file di intestazione")
<syntaxhighlight lang="c">
</syntaxhighlight>
▲Questa linea è una [[direttiva di inclusione]] per il [[preprocessore]]. Il preprocessore è un programma (o un modulo di un [[Integrated Development Environment|ambiente integrato]]) che esegue alcune trasformazioni preliminari del [[codice sorgente]], prima che quest'ultimo venga consegnato al [[compilatore]] vero e proprio. In questo caso, la trasformazione richiesta consiste nel rimpiazzare la linea in questione con l'intero contenuto dello ''[[header file]]'' ("file di intestazione") "<code>stdio.h</code>". La presenza di [[parentesi angolari]] indica che il file si trova in una [[directory]] standard nota al preprocessore. Per includere un header (di solito creato dal programmatore) presente nella stessa cartella dove si trova il file da compilare si usa una sintassi del tipo:
Un ''header file'', in C, è un [[file]] che contiene dichiarazioni di [[Tipo di dato|tipi]] di dati e di [[Funzione (informatica)|funzioni]]; nel caso specifico, viene incluso per introdurre nel sorgente la dichiarazione della funzione di [[libreria software|libreria]] standard <code>printf</code>. Tale dichiarazione, specifica quali tipi di [[parametro (programmazione)|parametri]] sia obbligatorio e consentito fornire alla <code>printf</code> e di che tipo sia il suo valore
▲Con al posto di ''nomeheader'' il nome dell'header desiderato.
▲Un ''header file'', in C, è un [[file]] che contiene dichiarazioni di [[Tipo di dato|tipi]] di dati e di [[Funzione (informatica)|funzioni]]; nel caso specifico, viene incluso per introdurre nel sorgente la dichiarazione della funzione di [[libreria software|libreria]] standard <code>printf</code>. Tale dichiarazione, specifica quali tipi di [[parametro (programmazione)|parametri]] sia obbligatorio e consentito fornire alla <code>printf</code> e di che tipo sia il suo valore tornato. Entrambe queste informazioni saranno poi usate dal compilatore per verificare che l'uso che "Hello world!" fa di questa funzione sia corretto.
Al posto di <code>printf</code> si può anche utilizzare la funzione <code>puts</code>, scritta come
<syntaxhighlight lang="c" line="1" start="5">
puts("Hello world!");
</syntaxhighlight>
<syntaxhighlight lang="c" start="3" line="1">
</syntaxhighlight>
Una linea di questo tipo costituisce l'inizio di una definizione di funzione, in questo caso la [[funzione main
La [[Parola riservata|parola chiave]] iniziale <code>int</code> rappresenta il tipo del valore restituito dalla funzione. Nel caso speciale del <code>main</code>, esso viene interpretato come valore restituito dall'intero programma al [[sistema operativo]]. Coerentemente con una convenzione universale circa i valori restituiti dai programmi al sistema, il <code>main</code> restituisce
<syntaxhighlight lang="c" start="4" line="1">
{
</syntaxhighlight>
Le [[parentesi graffe]] sono utilizzate in C per indicare l'inizio e la fine di un blocco, una unità di programma; in questo caso, la funzione <code>main</code>.
<syntaxhighlight lang="c" line="1" start="5">
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 del 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>
Il punto e virgola finale della riga indica la fine dell'istruzione (la chiamata a funzione).
<syntaxhighlight lang="c" line="1" start="6">
return 0;
</syntaxhighlight>
Un'istruzione iniziata con la parola chiave
=== Calcolatrice ===
Riga 225 ⟶ 223:
}
</syntaxhighlight>Spiegazione:
*
* <code>printf</code> è l'istruzione che stamperà a video ciò che è contenuto tra le virgolette
* <code>scanf</code> legge l'input e lo colloca nella variabile
*
* La sintassi
* La sintassi
*
*
== Linguaggi collegati ==
Riga 239 ⟶ 237:
=== C++ ===
{{vedi anche|C++}}
Il linguaggio di programmazione [[C++]]
[[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 C e C++ dovrebbero essere ridotte il più possibile per massimizzare l'interoperatività tra i due linguaggi. Altri hanno sostenuto che poiché C e 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 in 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
* Singole costanti di caratteri (racchiuse tramite apici singoli) hanno la dimensione di un
<!-- 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 in C++,
* In C++, il compilatore crea automaticamente un ''tag'' per ogni
=== Objective-C ===
Riga 255 ⟶ 253:
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 di [[C++]], mantiene la piena compatibilità con C.
Nel 2014
== Note ==
Riga 310 ⟶ 308:
{{Linguaggio C}}
{{Principali linguaggi di programmazione}}
{{Android}}
{{Controllo di autorità}}
{{portale|informatica}}
|