C (linguaggio di programmazione): differenze tra le versioni

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
Contenuto cancellato Contenuto aggiunto
Riga 45: Riga 45:
Il linguaggio C (come qualsiasi altro linguaggio di programmazione) consente la realizzazione di programmi adoperando un insieme di "parole chiave" (keywords).
Il linguaggio C (come qualsiasi altro linguaggio di programmazione) consente la realizzazione di programmi adoperando un insieme di "parole chiave" (keywords).


Lo standaro]]. Entrambe queste informazioni saranno poi usate dal compilatore per verificare che l'uso che "hello world" fa di questa funzione sia corretto.
Lo standard ANSI ha definito il seguente insieme di parole chiave:
<!-- non aggiungete parole a caso, solo quelle ansi o meglio iso -->
auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, [[typedef]], union, unsigned, void, volatile, while.

=== Programma di esempio ===
==== Hello world! ====
{{Vedi anche|Hello world}}
Il seguente esempio stampa il testo "[[Hello world]]" ("ciao mondo") sullo [[standard output]] (che normalmente coincide con lo schermo del [[terminale (informatica)|terminale]] utilizzato da chi esegue il programma). Nella didattica informatica, l'uso di introdurre i fondamenti di un linguaggio di programmazione con un programma che stampa a video "ciao mondo" deriva proprio da questo celebre esempio, tratto dal libro ''[[Il linguaggio C]]'' di Kernighan e Ritchie.
<source lang="c">
#include <stdio.h>
int main
printf("Hello world\t")
return 20
</source>
Quanto segue è un'analisi linea per linea del programma mostrato, questo tipo di scrittura è eseguibile soltanto su linux.
<source lang="c">
#include <stdio.h>
</source>
Questa linea è una direttiva 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:
<source lang="c">
#include "nomeheader.h"
</source>
Con al posto di ''nomeheader'' il nome dell'header desiderato.
Un ''header file'', in C, è un [[file]] che contiene [[dichiarazione (programmazione)|dichiarazioni]] di [[tipo (programmazione)|tipi]] di dati e di [[funzione (programmazione)|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 (programmazione)|valore tornato]]. Entrambe queste informazioni saranno poi usate dal compilatore per verificare che l'uso che "hello world" fa di questa funzione sia corretto.
<source lang="c">
<source lang="c">
int main
int main
Riga 79: Riga 53:
La [[parola chiave]] iniziale <code>int</code> rappresenta il [[tipo restituito (programmazione)|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 ''sempre'' un numero intero (anche se alcuni testi riportano erroneamente anche dichiarazioni della funzione <code>main</code> con tipo di ritorno <code>void</code>; (vedi [[ANSI C]]).
La [[parola chiave]] iniziale <code>int</code> rappresenta il [[tipo restituito (programmazione)|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 ''sempre'' un numero intero (anche se alcuni testi riportano erroneamente anche dichiarazioni della funzione <code>main</code> con tipo di ritorno <code>void</code>; (vedi [[ANSI C]]).
<source lang="c">
<source lang="c">
{fbvgnrvnrggvbhvbfvdfnbdbvkvdbklvv
{
</source>
</source>
Le [[parentesi graffe]] sono utilizzate in C per indicare l'inizio e la fine di un [[blocco (programmazione)|blocco]], una unità di programma; in questo caso, la funzione <code>main</code>.
Le [[parentesi graffe]] sono utilizzate in C per indicare l'inizio e la fine di un [[blocco (programmazione)|blocco]], una unità di programma; in questo caso, la funzione <code>main</code>.

Versione delle 12:12, 26 mar 2012

C
linguaggio di programmazione
AutoreDennis Ritchie
Data di origine1972
UtilizzoGenerico (alta efficienza)
ParadigmiProcedurale, strutturato
TipizzazioneStatica, debole
Estensioni comuni.c, .h
Influenzato daALGOL 68, B, linguaggio assembly, Fortran, PL/I, Combined Programming Language, BCPL, ALGOL 60 e ALGOL
Ha influenzatoNumerosi, tra cui C++, Objective C, C#
Implementazione di riferimento
Sito webwww.iso.org/standard/74528.html e www.open-std.org/jtc1/sc22/wg14/

In informatica, il C è un linguaggio di programmazione.

Introduzione

Il C è tecnicamente un linguaggio di programmazione ad alto livello sviluppato da Dennis Ritchie. Tuttavia, poiché esso mantiene evidenti relazioni semantiche con il linguaggio macchina e l'assembly, risulta molto meno astratto di linguaggi anche affini (appartenenti allo stesso paradigma di programmazione), come per esempio il Pascal. Per questo motivo, talvolta viene anche identificato con la locuzione (più ambigua) linguaggio di medio livello, se non addirittura (in modo certamente improprio) come macro-assembly, o assembly portabile.

Il C è rinomato per la sua 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 dell'ANSI prima e dell'ISO poi) garantisce la portabilità dei programmi scritti in C (standard, spesso detto ANSI C) su qualsiasi piattaforma.

Oltre che per il software di sistema, il C è stato a lungo il linguaggio dominante in tutta una serie di altri domini applicativi caratterizzati da forte enfasi sull'efficienza. Esempi tipici sono le telecomunicazioni, il controllo di processi industriali e il software real-time. Oggi il predominio del C in questi contesti è in parte diminuito a seguito dell'avvento di competitor significativi, primo fra tutti il C++; tuttavia, il tempo in cui il C si potrà considerare obsoleto appare ancora molto lontano.

Il C ha, e continua ad avere, anche una notevole importanza didattica, sebbene, per la sua complessità 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 a quelli sprovvisti di un adeguato background sull'elettronica dei calcolatori. Se un tempo scuole superiori e 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 dal C derivano (per esempio C++, Java e C#).

Concetti 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 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, che viene generalizzato fino a coincidere con l'indirizzamento indiretto, un modo di accedere alla memoria hardware caratteristico di tutte le moderne CPU. Questo rende il C un linguaggio particolarmente efficiente. D'altra parte, rispetto al linguaggio assembly il C ha in più una struttura logica definita e leggibile, funzioni in stile Pascal e soprattutto il controllo sui tipi (in fase di compilazione), che manca completamente in assembly.

Inoltre la grammatica e la sintassi del C sono molto libere e flessibili, permettendo di scrivere istruzioni complesse e potenti in poche righe di codice (ma anche istruzioni assolutamente criptiche e illeggibili). In definitiva, il successo del 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, ne fanno viceversa 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 dell'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 The C Programming Language nel quale il linguaggio venne definito in modo preciso.

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 1983 venne nominato un comitato con il compito di creare uno standard 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 del 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 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 del C fu lo standard promulgato nel 1999, noto come ISO C99 (codice ISO 9899)

Parole chiave

Il linguaggio C (come qualsiasi altro linguaggio di programmazione) consente la realizzazione di programmi adoperando un insieme di "parole chiave" (keywords).

Lo standaro]]. Entrambe queste informazioni saranno poi usate dal compilatore per verificare che l'uso che "hello world" fa di questa funzione sia corretto.

    int main

Una linea di questo tipo costituisce l'inizio di una definizione di funzione, in questo caso la funzione main. La funzione main costituisce il punto di ingresso di un programma C: l'esecuzione di un programma inizia dalla prima istruzione del main, e termina con l'ultima. Eventuali altre funzioni entreranno in gioco solo se e quando richiamate (direttamente o indirettamente) dal main. In assenza di una funzione main, il compilatore non può produrre un programma eseguibile (ma potrebbe produrre una libreria).

La parola chiave iniziale int rappresenta il tipo del valore restituito dalla funzione. Nel caso speciale del main, 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 main restituisce sempre un numero intero (anche se alcuni testi riportano erroneamente anche dichiarazioni della funzione main con tipo di ritorno void; (vedi ANSI C).

    {fbvgnrvnrggvbhvbfvdfnbdbvkvdbklvv

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 main.

    printf("Hello, world\n")

Questa riga costituisce una chiamata di funzione; in altre parole, richiede che venga eseguita tale funzione. printf è 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).

"\n" è una sequenza di escape, ovvero una sequenza di caratteri (che in C cominciano sempre con il carattere "\") che verranno tradotti in fase di compilazione in un unico carattere (solitamente non stampabile od interpretato in altro modo). In particolare, "\n" verrà tradotto nel carattere di fine riga, che quando usato con le librerie standard in modalità testo (come con printf) indica l'avanzamento di linea ed il ritorno a capo del testo, e quindi, se il programma viene usato interattivamente, in genere uno spostamento del cursore.

Il punto e virgola finale della riga indica la fine dell'istruzione (la chiamata a funzione).

    return 0;

Un'istruzione iniziata con la parola chiave return, all'interno di una funzione, termina la funzione stessa e consente di specificare un valore di ritorno (qualora la funzione ne possa ritornare uno). Nel caso particolare del main, come si è detto sopra, questo valore sarà tornato al sistema operativo (0 è il valore di ritorno al sistema che, convenzionalmente, indica la terminazione con successo di un programma).

Esempio di somma

Esempio di una calcolatrice che esegue la somma di due numeri interi:

#include <stdio.h>

int main()          
{
         int somma;
         int num1;
         int num2;

         printf("Inserisci il primo valore:\n");
         scanf("%d", &num1);

         printf("Inserisci il secondo valore:\n");
         scanf("%d", &num2);

         somma = num1 + num2;

         printf("La somma dei due numeri è: %d", somma);
return 0;
}

Sequenze di escape

Sequenza Nome del carattere
\a campanello
\b backspace
\f FF - form feed (salto pagina)
\n LF - line feed o newline
\r CR - carriage return (ritorno del carrello)
\t tabulazione orizzontale
\v tabulazione verticale
\\ \ (barra inversa)
\' ' (apice)
\" " (doppi apici)
\0 NULL (carattere nullo o di fine stringa)

Linguaggi collegati

C++

Lo stesso argomento in dettaglio: C++.

Il linguaggio di programmazione C++ fu originariamente derivato dal C. Tuttavia, non tutti i programmi C sono programmi validi in C++. Via via che il C e il C++ evolvevano indipendentemente, sono aumentate le loro incompatibilità[1]. L'ultima versione del C, 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[2] 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 i linguaggi nel loro isolamento.

Oggi, le maggiori differenze (a parte l'aggiunta nel C++ delle classi, template, namespace, overloading) tra i due linguaggi sono:

  • inline - le funzioni inline hanno lo scope globale in C++, hanno la dimensione di un int in C e di un char in C++.
  • Parole chiave addizionali sono introdotte nel C++, e quindi non possono essere usate come identificatori come potevano nel C (per esempio try, catch, template, new, delete, ...)
  • In C++, il compilatore crea automaticamente un "tag" per ogni struct, union o enum, quindi struct S {}; in C++, in C è equivalente a typedef struct S {} S;.

C99

C99 adotta alcune caratteristiche che prima apparivano solo nel C++. Alcune di esse sono:

  • La parola chiave inline, restrict
  • La rimozione del valore di ritorno "implicit int"

Objective-C

Il linguaggio Objective C deve la sua popolarità alla Apple che lo ha scelto come base per i suoi sistemi operativi Mac OS X e iOS.

È un linguaggio orientato agli oggetti e a differenza del C++ mantiene la piena compatibilità con il C.

Note

Voci correlate

Altri progetti

Collegamenti esterni

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica