Ad oggi esistono più di 2500 linguaggi di programmazione diversi, alcuni sono uno standard consolidato, altri, invece, hanno avuto vita breve. Sicuramente qualcuno avrà sentito parlare del linguaggio C, del JAVA, del PHP, ma difficilmente conoscerà il COWSEL o il MUMPS. Alcuni linguaggi hanno una sintassi molto simile all’inglese scritto (link, link), altri invece nascono solo con l’intento di essere assurdamente complessi (link) come il linguaggio composto solo da spazi e segni di tabulazione ( link ).
In questo corso parleremo in maniera approfondita del linguaggio C, a mio avviso IL linguaggio che ogni buon programmatore, per dirsi tale, deve conoscere, ma per meglio collocare questo linguaggio nell’universo dei linguaggi esistenti è bene chiarire quali sono le caratteristiche dei vari linguaggi e capire come il C si pone in questo variopinto universo.
Cercherò quindi di elencare alcune caratteristiche che rendono un linguaggio differente da un altro. Purtroppo alcuni aspetti forse non saranno chiari fin da subito, perchè richiedono un minimo di familiarità con qualche linguaggio di programmazione, ma ho deciso ugualmente di parlarne qui, perchè così riuscirete, nel corso delle lezioni, a notare tali aspetti avendone già acquisito il significato.
Linguaggi di alto e basso livello
Questa distinzione l’abbiamo già incontrata nella prima lezione, per chi non l’avesse ancora letta ricordo che “basso” o “alto” livello non sono aggettivi riferiti alla qualità del linguaggio, ma si riferiscono al livello di astrazione del linguaggio. I linguaggi a “basso livello” di solito sono meno comprensibili, hanno un minore livello di astrazione, e sono più legati all’architettura della macchina, mentre i linguaggio di “alto livello” hanno una sintassi più intuitiva e forniscono strumenti per scrivere del codice più vicino al modo di pensare dell’uomo rispetto a quello della macchina.
I linguaggi a basso livello sono poco utilizzati, ma in alcuni casi sono utili per scrivere programmi ad altissime prestazioni o programmi per interagire a basso livello con le periferiche, come nel caso dei drivers.
Per avere un’idea della differenza tra i due tipi di linguaggio confrontiamo questi due programmi, entrami fanno la stessa cosa: sommano due numeri. Secondo voi quale dei due è il linguaggio di alto livello?
Linguaggio Assembly | Linguaggio C |
MOV [1000h],3 MOV [1001h],4 MOV AX,[1000h] ADD AX,[1001h] MOV [1002h],AX |
x = 3 + 4; |
A ciascuno il suo paradigma
Un’altra grande differenza tra i linguaggi di programmazione è il paradigma su cui si basano.
Comprendere cosa sia un paradigma di programmazione senza aver mai scritto una riga di codice non è certo semplice, ma possiamo dire che il paradigma di programmazione è uno stile fondamentale del linguaggio, uno stile per cui il linguaggio mette a disposizione delle funzionalità.
Il C fa parte dei cosiddetti linguaggi imperativi, chiamati così perchè la soluzione di un problema la si ottiene eseguendo una serie di istruzioni, scritte da noi, in un preciso ordine.
In altri paradigmi di programmazione, come la “programmazione dichiarativa” e la “programmazione ad oggetti” (OOP Object Oriented Programming) questo concetto viene in parte modificato, prediligendo una descrizione più generica del problema e degli enti che ne fanno parte.
Benchè io sia sicuro che questa spiegazione in questo momento non vi abbia chiarito fino in fondo le idee (nel corso faremo altri accenni a questo argomento, soprattutto in riferimento alla OOP), insisto nell’affermare che l’approccio nel risolvere un problema deve essere diverso a seconda del paradigma utilizzato. Questo dovrebbe essere un comandamento per il buon programmatore, perchè è un grosso errore, ad esempio, utilizzare un linguaggio che per sua natura segue il paradigma ad oggetti, come se fosse imperativo e viceversa.
Possiamo fare un piccolissimo esempio: Il nostro problema è quello di estrarre il numero più alto da un insieme di 10 numeri. Vediamo come bisognerebbe scrivere questo programma in ciascun paradigma:
Programmazione imperativa | Programmazione dichiarativa | Programmazione ad oggetti |
numero più alto = 0 prendi il primo numero. È più grande di “numero più alto”? se si allora: il numero più alto è il primo numero. prendi il secondo numero…..etc etc etc |
SELEZIONA numero più alto DA mio insieme | [mioinsieme prendivalorepiùalto] |
Non saltiamo a facili conclusioni giudicando dalla lunghezza del codice, ciascun paradigma si presta bene ad una determinato set di operazioni. Inoltre non è sempre vero che la programmazione imperativa richiede un maggior numero di righe di codice, anzi è più probabile l’inverso, che la OOP, a causa della sua intrinseca generalità obblighi a scrivere più codice.
Compilato o interpretato?
Il codice sorgente dei nostri programmi non può essere eseguito così com’è dalla cpu ma, come abbiamo detto nella prima lezione, le nostre istruzioni devono essere convertite in linguaggio macchina (codice binario). Per far questo esistono dei software che si chiamano compilatori il cui compito è quello di analizzare il codice sorgente, verificare che non ci siano errori formali e convertire tutte le istruzioni in linguaggio macchina, generando quindi un file eseguibile come i famosi .exe del sistema operativo windows.
I linguaggi, come il C, che seguono questa prassi prendono il nome di linguaggi compilati. Esistono però altri tipi di linguaggi che funzionano in modo leggermente diverso: sono i linguaggi interpretati e i linguaggi di scripting. Per queste categorie di linguaggi non è previsto il compilatore, ma un programma che si chiama interprete, che analizzando il file sorgente produce “al volo” il codice binario adatto per la cpu.
In linea generale i linguaggi interpretati dovrebbero essere più lenti rispetto ai linguaggi compilati, proprio per questo lavoro di “traduzione” che deve essere fatto ogni volta e “in tempo reale”, ma considerate le attuali velocità delle cpu questo aspetto non è più limitante.
Per complicare le gerarchie esistono anche linguaggi che non appartengono nè ad una nè all’altra categoria, come il JAVA, in cui il sorgente viene compilato non in linguaggio macchina ma in byte-code, una sorta di via intermedia tra JAVA e linguaggio macchina, e poi interpretato al volo dalla JAVA Virtual Machine.
Nota sugli errori formali: Quali sono gli errori che un compilatore può segnalare? Ogni linguaggio di programmazione ha le sue regole sintattiche, che definiscono come il programma deve essere scritto. Le regole sintattiche includono l’uso delle parentesi, delle lettere maiuscole/minuscole, dei segni di punteggiatura, in alcuni casi anche gli spazi.
Purtroppo per loro natura queste regole evidenziano solo errori sintattici e non quelli semantici, quindi gli errori segnalati dal compilatore sono solo quelli del primo tipo, mentre per scoprire gli errori del secondo tipo bisogna analizzare il codice con molta, molta pazienza.
Programmazione ad eventi
La programmazione event-driven a rigor di termini è un paradigma di programmazione come la programmazione dichiarativa o la OOP, ma a mio avviso questa definizione non le rende giustizia. In un programma non event-driven c’è un punto di inizio, poi il programma esegue il suo compito ed infine giunge al termine, come nell’algoritmo per fare il tè della precedente lezione, mentre in un programma event-driven il programma si avvia e resta in un loop molto stretto (in gergo si chiama loop stretto un loop in cui vengono effettuate pochissime operazioni), in ascolto di eventuali eventi scatenati dall’utente, come un click su un pulsante, su un menù etc.

La programmazione event-driven infatti da il suo massimo nella realizzazione delle interfacce grafiche, ma esistono ambiti in cui si può sfruttare con successo la programmazione event-driven anche per altri scopi. C nella sua concezione più classica non è event-driven.
Tipizzato o non tipizzato?
La tipizzazione di un linguaggio di programmazione è una delle caratteristiche che si nota appena si inizia a scrivere qualche riga di codice inoltre è anche una delle prime (non chiedetemi perchè) che viene citata nella descrizione di un linguaggio. Ma cosa vuol dire che un linguaggio è o non è tipizzato? Purtroppo ancora non abbiamo citato il concetto di variabile all’interno dei nostri programmi, ma intuitivamente possiamo dire che una variabile è qualcosa che durante l’esecuzione del nostro programma è destinata a cambiare valore. Ad esempio una variabile potrebbe contenere il totale di una fattura in un programma di contabilità, un titolo di film in un programma per videoteche e via discorrendo. Nella stesura dei programmi con i linguaggi tipizzati è necessario dichiarare esplicitamente se quella variabile conterrà un numero, se conterrà del testo, una data e così via, mentre nei linguaggi non tipizzati questi vincoli non vi sono o sono meno restrittivi.
I programmi non tipizzati sono di norma programmi interpretati, perché i programmi compilati riservano durante la compilazione uno spazio predefinito nella memoria del computer per contenere quel valore, quindi è strettamente necessario sapere che tipo è e quanto spazio occupa.
Perchè proprio il C?
Il linguaggio C è stato ideato nel (lontano) 1972 nei laboratori Bell, una vera fucina di innovazioni (link), da Dennis Ritchie, un programmatore statunitense che lo creò apportando alcune modifiche al linguaggio B. È stato uno dei primi linguaggi di programmazione ad alto livello, anche se in alcuni casi viene definito come il linguaggio “più a basso livello tra quelli di alto livello” proprio a voler evidenziare la sua natura alle volte un po’ scarna e priva di fronzoli.
Il linguaggio C è stato standardizzato dall’American National Standard Institute e dall’International Standardization Organization, infatti la versione “standard” del C viene chiamata ANSI C. L’ultima revisione ufficiale risale al 1990, e ci si riferisce a quella revisione con il nome di C99.
Ci si potrebbe chiedere come mai, dopo quasi quaranta anni si studi ancora il linguaggio C, ci saranno sicuramente dei linguaggi più moderni e innovativi, no?
La risposta è che il C, a differenza di quanto si possa credere, è un linguaggio semplice da imparare, e questa sua semplicità non va a scapito delle potenzialità o della rigorosità del linguaggio. Inoltre linguaggi apparentemente più evoluti come il C++ e il JAVA sotto sotto utilizzano parte dei concetti del C, tanto che una buona conoscenza del C vi permetterà di muovervi meglio anche in questi linguaggi. (A fine corso ponetevi questa domanda: “c’è molta differenza tra un riferimento ad un oggetto java ed un puntatore ad una struttura C?” vi anticipo che la risposta è no 🙂 )
Insomma, conoscere il C è utile quanto il solfeggio per un pianista ma più divertente. Utile come saper far di conto prima di studiare l’analisi matematica.
Se poi il vostro obbiettivo è quello di imparare l’objective-C, che deriva totalmente dal C, direi che lo studio di questo linguaggio è quasi un passo obbligato.
Una delle caratteristiche che a mio avviso fanno del C un ottimo linguaggio anche dal punto di vista didattico è che è molto facile commettere errori nella stesura del codice.
Questa caratteristica, che può sembrare negativa, si rivela invece estremamente formativa, perchè costringe a scrivere codice pulito, ordinato e, soprattutto, corretto.
Il C possiede molte altre caratteristiche che gli hanno permesso di vivere questi 40 anni senza perdere lo smalto iniziale, alcune le vedremo durante questo corso le altre, quelle che non trovano posto nei manuali, quelle meno scientifiche e più emozionali vi toccherà scoprirle da soli, mentre scriverete i vostri primi programmi in C.
Prossimamente:
Nella prossima lezione faremo qualcosa di pratico, vedremo quali sono gli strumenti necessari per programmare in C sia con windows che con linux e mac, vedremo come compilare un programma da riga di comando oppure utilizzando un software più completo per svolgere il nostro lavoro.
Letture consigliate:
Il linguaggio C. Principi di programmazione e manuale di riferimento (Accademica)
Brian W. Kernighan – Dennis M. Ritchie
Editore: Pearson | Lingua: Italiano | Brossura: 313 pagine
Prezzo Listino: EUR 27,00
Prezzo Promozione: EUR 22,95 con Spedizione gratuita
C. Corso completo di programmazione
Paul J. Deitel – Harvey M. Deitel
Editore: Apogeo | Lingua: Italiano | Brossura: 640 pagine
Prezzo Listino: EUR 39,00
Prezzo Promozione: EUR 33,15 con Spedizione gratuita

28 Responses to “3. Panoramica sui linguaggi di programmazione”
18 Marzo 2011
SpartanBella lezione,ti ho letto con piacere anche se queste cose le ho già studiate su un libro dei Deitel.
Alla prossima 😉
18 Marzo 2011
iCharrlesNon posso che farvi i complimenti. Sono molto entusiasto di questa guida.
(Non c’entra niente, ma non esiste alcun modo di togliere la barra a fondo pagina che mi dice di iscrivermi al forum? E’ abbastanza fastidiosa)
18 Marzo 2011
luponatanon vedo l’ora di scrivere i miei programmi!!,
iCharrles certo che puoi, scaricati Google Chrome e poi installati l’estensione AdBlock! ci vogliono 5 secondi!
ciaoo
18 Marzo 2011
luponataahah gia che ci sono mi iscrivo!
19 Marzo 2011
Gianluca Tranchedone(Mi accodo alla domanda che non c’entra niente 😀 Un bottoncino “chiudi” sarebbe comodo)
19 Marzo 2011
RaffpioGrazie 🙂
19 Marzo 2011
EnricoSarei solo curioso, veramente solo per curiosità, di sapere di quante lezioni è fatto questo corso:-)
Come per ogni lezione: grazieeee!
19 Marzo 2011
Ignazioctutte le lezioni necessarie a farvi diventare dei veri “master of C programming” 🙂
19 Marzo 2011
AndreabernsNon vedo l’ora di andare+ in profondità……
@ignazoc ma una versione per iPad della tua ultima App?
20 Marzo 2011
TuxUn paio di domande all’autore!
1) Al passo di un articolo alla settimana, quando più o meno terminerà la guida?
2) Dopo la guida al C, farai una guida per programmare per iOS?
20 Marzo 2011
Rino PicardiCiao, ti rispondo io 😉
Il corso non ha ancora un numero ben definito di lezioni, questo perché potremmo fare variazioni strada facendo, anche secondo le vostre esigenze. Posso solo assicurare che sarà un corso completo e che toccheremo argomenti molto complessi più avanti, quindi cercheremo di portarvi ad un buon livello! Per qesto è molto importate la vostra partecipazione, tramite commenti e post nel forum. Non è detto che la periodicità rimanga di un articolo a settimana, in ogni caso vogliamo offrivi materiale di qualità 😉
2) dopo il corso di C inizierà un corso completo di Objective-C, utile per programmare iOS (iPhone, iPod, iPad) ma anche per programmare Mac
20 Marzo 2011
TuxGrazie mille per la risposta!
Comunque spero che il corso sia adatto anche a chi parta da 0 e che, prima di arrivare ad argomenti complessi, siano fornite le conoscenze necessarie a capire appunto gli argomenti complessi.
Comunque in linea di massima in un anno saranno finiti entrambi i corsi?
21 Marzo 2011
TuxAggiungo alla domanda: io generalmente uso Ubuntu, posso prima di arrivare all’objective C usare un compilatore C per Linux o è meglio che usi xCode da subito?
21 Marzo 2011
Ignazioclo strumento non fa la differenza, utilizza pure ubuntu finché puoi, poi purtroppo ti servirà xcode
21 Marzo 2011
Ignazioc….e poi le domande fatele sul forum! c’è una sezione apposta! Qui rischio di non leggerle.
21 Marzo 2011
danimartialiceComplimenti davvero !
21 Marzo 2011
SpartanForza un’altra lezioneee ^ ^
21 Marzo 2011
3doComplimentissimiiii!!
Ogni volta che leggo ho sempre più voglia di leggere la parte successiva!!
Veramente bravi e soprattutto molto utile!!
Penso che sia l’unico sito che fornisca un servizio del genere!!
Grazie!
22 Marzo 2011
dvddaviBeh, la differenza tra assembly e C è lampante 🙂
anche per scrivere bisogna ricordarsi di spostare tutto in AL, assegnare ad AH il valore 2 e richiamare la INT 21H, mentre in C è più semplice 🙂
Però secondo me i vecchi linguaggi sono più semplici: sono limitati e puoi facilmente imparare quasi ogni cosa, mentre con quelli moderni ci sono vastità di funzioni che magari non sai neanche che esistano… ed è impossibile impararli alla perfezione
22 Marzo 2011
Vale93itaDavvero interessante.. Aspetto con ansia il prossimo articolo!
22 Marzo 2011
manzo31Salve, ottimo articolo, ho letto la notizia oggi su iSpazio e ho letto anche le lezioni precedenti.
Tutto è stato molto chiara tranne (secondo me, che parto da 0) la frase “La programmazione event-driven a rigor di termini è un paradigma di programmazione come la programmazione dichiarativa o la OOP”
Vi faccio i miei complimenti e aspetto la prossima lezione!
22 Marzo 2011
iMikemmm… secondo me state volando! 🙂
Quello che avete fatto in 3 lezioni io l’ho fatto in 3 mesi al corso dell’uni.
Opinione personale 🙂
22 Marzo 2011
CamilloSalve,
complimenti innanzitutto per il corso che è abbastanza chiaro! Avrei una domanda! Non ho capito una cosa:
il paradigma di programmazione che cos’è effettivamente? è sinonimo di linguaggio di programmazione? il C, Java, php ecc. sono paradigmi/linguaggi di programmazione? o sono 2 cose diverse?
Non ho capito questa cosa!
23 Marzo 2011
VëonComplimenti vivissimi, continuate così, questi articoli sono scritti magistralmente! La parte finale, poi, mi ha gasato parecchio 😉
23 Marzo 2011
LuigiComplimenti, davvero un bel lavoro! Spero si affrontino presto argomenti sull’objective C e sulla programmazione per iphone, mi interessa molto.
24 Marzo 2011
congicomplimenti davvero bravi ,questo corso mi sta’ appassionando molto,ma io consiglierei di uscire due volte a settimana,tre giorni bastano per memorizzare e imparare ,dopo sette quando esce il nuovo numero del corso devo tornare a leggermi quello vecchio.
Io li stampo cosi che li ho sempre sotto mano,ancora grazie e spero di aver dato un consiglio valido.
ps.ovviamente mi sono inscritto al vostro sito.
24 Marzo 2011
congiio ho letto la notizia del corso su italia mac
27 Marzo 2011
Lamba2Vi stimo! non acora riuscivo a trovare una guida ben fatta come questa…