Cenni di programmazione

Da Hacknowledge.

Indice

[modifica] Il programma

Si definisce "programma" qualsiasi sequenza di istruzioni scritte in linguaggio macchina (l'unico linguaggio comprensibile ad un calcolatore, le famose sequenze di 0 e 1) atta ad essere elaborata da un calcolatore o comunque da una struttura informatica.

Ogni volta che accendiamo il PC facciamo uso di programmi. Word e Outlook sono programmi. Winamp è un programma. Windows stesso non è altro che un programma (un "programma di base" o "software di base"). Anche i virus sono dei programmi eseguibili.

Si pone qui il problema di come scrivere un programma. Per questa esigenza si fa ricorso ai linguaggi di programmazione.

[modifica] Breve storia della programmazione

[modifica] I linguaggi a basso livello

In principio, quando i computer erano enormi mobili chiusi a chiave dentro le stanze delle università o dei laboratori di ricerca, era il programmatore stesso a dettare le istruzioni binarie al calcolatore. Ma scrivere programmi usando sequenze di 0 e 1 non è certo la cosa più comoda del mondo, oltre ad essere del tutto innaturale per l'uomo.

Passiamo alla metà degli anni 50: i programmatori creano un sistema più "comodo" per creare i loro progetti, l'Assembly. L'Assembly (o GLI Assembly, dato che la sintassi di questo linguaggio cambia in funzione di molte variabili, quali il sistema operativo in uso, l'architettura della macchina che si va a programmare e l'assemblatore in uso) non è altro che una rappresentazione simbolica del linguaggio macchina, dove ad ogni istruzione binaria corrisponde un'istruzione mnemonica, relativamente più semplice da ricordare. Così la sequenza 1100 1101 0010 0001, o CD 21 (linguaggio macchina) diventa int 21h (sintassi Assembly Intel).

[modifica] I linguaggi a medio/alto livello

Ma l'Assembly non è il massimo della vita. E' pur sempre un linguaggio orientato alla macchina, non al problema, e, col passare degli anni i progetti si fanno via via più grandi, e l'Assembly da solo non può gestirli. Ecco quindi che compaiono sulla scena i primi linguaggi ad "alto livello", ossia linguaggi più orientati al problema (e quindi all'utente) che all'architettura intrinseca della macchina. Sono il COBOL, il BASIC e il FORTRAN, linguaggi molto più semplici dell'Assembly ma non altrettanto potenti. Anche questi linguaggi hanno le loro pecche: il COBOL ha delle regole sintattiche troppo rigide per essere usato dalle masse di programmatori, ed è dedicato ad uno scopo, ovvero la gestione di basi di dati piuttosto primitive e di applicazioni per il business, che non lo rende universale. Il FORTRAN è ottimo per la progettazione di applicazioni a carattere scientifico, ma non per la progettazione di codice di sistema, il BASIC, nonostante la sua incredibile facilità di apprendimento, non è potente, e non ha una struttura vera e propria. Inoltre, questi tre linguaggi si basano tutti sull'istruzione GOTO ("vai a"), ripresa dall'istruzione JMP dell'Assembly, quindi i programmi scritti con questi linguaggi tendono al cosiddetto "codice spaghetti", un codice spezzettato, pieno di diramazioni e salti condizionati che rendono spesso il programma illeggibile, un vero dramma quando si tratta di fare manutenzione.

Nasce quindi il PASCAL, un linguaggio ad alto livello dotato di una struttura e di istruzioni vere e proprie per il controllo del flusso del programma, ma non progettato per un vasto campo di azione, quindi poco efficiente per la scrittura di codice di sistema. Al giorno d'oggi il PASCAL è usato solo per scopi didattici, grazie alla sua semplicità di apprendimento e alla sua sintassi "pulita".

[modifica] Il C

Arriviamo all'inizio degli anni 70, l'hardware diventa sempre più potente e la richiesta di software cresce giorno dopo giorno, ma non esiste ancora un linguaggio ad alto livello che soddisfi qualsiasi richiesta di software. Fino al 1972, "l'ora zero" del linguaggio C: in un laboratorio della AT&T Bell Dennis Ritchie fa girare un primo prototipo del C su un DEC PDP-11 con sistema operativo UNIX. Il C fu il risultato dello sviluppo di due linguaggi di programmazione più vecchi: il B (sviluppato da Ken Thompson) e il BCPL (sviluppato da Martin Richards). Per anni il linguaggio C fu strettamente legato al sistema operativo UNIX (infatti, dopo la progettazione del C, tutte le successive versioni di UNIX furono scritte in questo linguaggio, e ancora oggi i kernel UNIX sono scritti in C). Nel 1989, alla luce dei vari "stili" del C formatisi, l'ANSI (American National Standards Institute) mise a punto l'ANSI-C, una versione standard del C priva di ambiguità, che è in uso tuttoggi.

La novità del C, ed anche il motivo di tutto il suo successo, è che il C è un linguaggio di programmazione sviluppato dai programmatori stessi, e non da un'istituzione governativa o da un'università, per i programmatori stessi: questo rende il C il linguaggio dei programmatori. Unita a questa caratteristica, c'è la versalità del C: un linguaggio usato tanto per semplici programmini didattici, tanto per programmare sistemi operativi: è un linguaggio che si presta ad un'infinità di usi, grzie anche ad una libreria davvero vastissima. Il C infatti, a differenza degli altri linguaggi di programmazione, ha davvero pochissime keyword (parole riservate), ma una vastissima gamma di funzioni che spaziano dalle funzioni per l'I/O standard alle funzioni matematiche, dalla manipolazione dei file alla gestione della memoria, dagli strumenti per la creazione di interfacce grafiche (GUI) alla manipolazione delle regex: queste funzioni sono ormai parte integrante del linguaggio. Inoltre, chiunque può aggiungere nuove funzioni a quelle che corredano il C, e questo è un altro elemento che rende il C tanto flessibile e potente.

E' inoltre uno dei pochi linguaggi ad alto livello che mette a disposizione delle funzioni per la gestione della memoria e dei processi, o anche per la gestione di porte e periferiche di I/O (operazioni notoriamente di basso livello): se voglio creare un programma che gestisca queste componenti, devo fare assolutamente ricorso ad un linguaggio di basso livello come l'Assembly.

[modifica] L'evoluzione ad oggetti del C - il C++

Del 1982 è invece il C++ che, a differenza di quello che pensano in molti, non è un nuovo linguaggio, bensì un'evoluzione naturale del C; un programma scritto in C infatti verrà compilato senza problemi anche da un compilatore C++. Tuttavia, il C++ mette a disposizione del programmatore la OOP, la programmazione orientata agli oggetti, che non è qualcosa che si "aggiunge" al programma, bensì è un modo totalmente diverso di concepire un'applicazione. Quando si ha che fare con grandi progetti diventa difficile gestire l'applicazione nella sua interezza. Qui entra in soccorso il C++, che permette al programmatore di gestire le singoli componenti del programma come oggetti, ossia come componenti intrinseche del linguaggio stesso; gli oggetti sono disposti in classi, che sono la loro rappresentazione astratta, ed ogni classe può ereditare oggetti da altre classi o cambiare la loro visibilità all'interno del programma (esistono oggetti privati, protetti e pubblici). La potenza della OOP permette al programmatore di fare cose davvero interessanti, come ridefinire gli operatori, fare l'overloading di funzioni, creare tipi di dati "su misura" (con i template), gestire le eccezioni in modo potente (con i blocchi try e catch). Ovviamente, occorre procedere per passi: non si possono apprezzare appieno le novità introdotte dal C++ se non si ha familiarità col C.

[modifica] La programmazione oggi

Nel 1991 fu concepito il Java che, pur essendo un linguaggio a sè stante, è considerato da molti come un'evoluzione del C++. Infatti, la sintassi di questo linguaggio deve molto al C/C++, i costrutti alla base sono molto simili. Ciononostante, il Java si pone come obiettivi quello di essere un linguaggio di programmazione orientato al Web (ed è diventato con gli anni il linguaggio di programmazione del Web, grazie ai suoi meccanismi estremamente versatili di applet e servlet) e quello di essere un linguaggio multipiattaforma (write once, run everywhere è il motto del Java), e queste caratteristiche hanno decretato il suo successo negli ultimi anni. Lo stesso programma che scrivo in Java lo posso eseguire teoricamente senza problemi su Windows, su Linux, un un Mac e persino su un telefonino (i famosi "giochi Java"), a patto che esista una JVM (Java Virtual Machine) per quel sistema.

Passando all'ultimo decennio, abbiamo la nascita dei linguaggi di quarta generazione, linguaggi di script (non di programmazione) estremamente intuitivi e facili da usare: il Perl, il Python (entrambi sviluppati grazie al C). Microsoft ha messo a punto un suo ambiente di sviluppo basato sul C++ (Visual C++) ed il C#, un linguaggio ad oggetti che deve molto sia alla sintassi del C/C++, sia a Java.

Strumenti personali