You are on page 1of 32

Introduzione alla Programmazione

Introduzione A cosa serve scrivere un programma per computer ? Cosa rende un programma utile o inutile ? Quali sono gli obiettivi della programmazione? Quali i problemi coinvolti? E quali soluzioni fornisce una corretta programmazione?

Un computer uno strumento utilizzato per creare delle procedure, pi o meno complesse, che permettono di ottenere dei risultati a partire da un problema iniziale. Scrivere un programma senza sapere quale problema si vuole risolvere non ha ovviamente senso. Vediamo come scrivere la codificazione di un programma (scrivere codice) mirato ad uno scopo. Obiettivi base della programmazione: quando si scrive un programma dobbiamo: - assicurarci che il programma soddisfi le esigenze per cui stato creato

- Assicurarci che sia facile da usare - Assicurarci che sia facile da capire, correggere e migliorare senza troppi interventi. Problemi comuni: - il programma non fa il lavoro per cui stato ideato - il programma non funziona come previsto - il programma troppo complesso per poter essere utilizzato da altre persone

Criteri da seguire per risolvere i problemi : Utilit ed Utilizzabilit -Svolgere delle indagini su programmi esistenti simili a quelli che si vogliono sviluppare per capire come migliorare tali programmi. -Realizzare solo codice scritto correttamente ed utilizzabile - Pianificare ci che s i vuole realizzare prima di iniziare a scrivere codice - Realizzare il massimo della funzionalit con la minima complessit possibile.

Manutenibilit* - Rendere semplice la lettura e la comprensione del codice sorgente** - Utilizzare i commenti allinterno del codice - Utilizzare sempre dei nomi di variabili semplice e facili da capire

*la manutenibilit (manutenzione) di un software consiste nella facilit di apportarvi modifiche sia a livello di eliminazione dei difetti (riparabilit) che a livello di miglioramenti (evolvibilit). **il codice sorgente o semplicemente sorgente il testo di un programma, scritto in un linguaggio di programmazione, la cui elaborazione porta ad un programma eseguibile.

Cosa un programma? Un programma un insieme di istruzioni che vengono processate dalla CPU. Possiamo pensare ad un programma come alla ricetta per preparare un piatto. Le operazioni indicate nella ricetta devono essere eseguite con una data sequenza: nello stesso modo la CPU esegue le istruzioni del programma seguendo la sequenza indicata dal codice sorgente del programma stesso. Tutto quello che il computer fa scritto attraverso il pi elementare dei sistemi numerici: quello binario. Se vogliamo dire direttamente al computer cosa fare, dobbiamo esprimerci in binario, scrivendo cio una sequenza di 1 e di 0 che dice al computer come risolvere il compito affidatogli.

Questo ovviamente impossibile, nella pratica si usano i linguaggi di programmazione. Per maggiori dettagli sui numeri binari si veda larticolo su Wikipedia al seguente link: http://en.wikipedia.org/wiki/Binary_numeral_system.

Cosa un linguaggio di programmazione? Un linguaggio di programmazione, come suggerisce il nome stesso, un linguaggio creato per scrivere programmi. Tutti i computer hanno un linguaggio di programmazione nativo, detto linguaggio macchina. Tuttavia il linguaggio macchina difficile da usare; una fra le tante difficolt consiste nel fatto che questo linguaggio solitamente espresso in numeri binari ed specifico della particolare architettura del computer: due computer diversi possono avere due linguaggi macchina diversi). Altri linguaggi come lAssembler, il C/C++, il Java o il Basic, forniscono una migliore interfaccia che si interpone fra il programmatore ed il computer, permettendo di scrivere i programmi in un linguaggio pi facilmente comprensibile per il programmatore e potenzialmente comune a differenti architetture di computer.

Tuttavia tutti quest linguaggi devono essere sempre tradotti in linguaggio macchina, e a tale scopo il computer deve compilare o interpretare i programmi scritti in tali linguaggi prima di poterli eseguire.

Compilazione versus Interpretazione Il codice di un programma memorizzato allinterno di file chiamati file sorgenti i quali non sono direttamente leggibili dalla CPU: necessitano quindi di essere tradotti in linguaggio macchina. Sostanzialmente esistono due procedure che rendono i file sorgenti leggibili dalla CPU: linterpretazione e la compilazione. INTERPRETAZIONE: questa procedura viene eseguita da un programma scritto in linguaggio macchina (detto interprete) che traduce in linguaggio macchina, e sequenzialmente tutte le istruzioni dei file sorgenti; ogni istruzione, una volta tradotta, viene trasferita alla CPU che la esegue.

COMPILAZIONE: questa operazione viene eseguita da un programma scritto in linguaggio macchina (detto compilatore). A differenza dallinterprete, il compilatore traduce le istruzioni presenti nei file sorgenti e le memorizza allinterno di un file eseguibile. La principale differenza tra queste due procedure sta nel fatto che quando si vuole eseguire un programma interpretato necessario eseguire anche linterprete che traduce il file sorgente in tempo reale; mentre quando si esegue un programma compilato questo risulta gi tradotto in linguaggio macchina (dal compilatore) e cui non quindi necessario eseguire altri programmi insieme ad esso. Questa differenza ha ripercussioni non trascurabili sulla velocit di esecuzione del programma: un programma compilato permette delle prestazioni pi elevate.

Livelli di linguaggio di programmazione I linguaggi di programmazione sono descritti mediante dei livelli: i programmi di basso livello sono simili al linguaggio macchina mentre quelli di alto livello sono simili al linguaggio naturale. Al livello pi basso troviamo il linguaggio assembly. Questo linguaggio pu essere tradotto direttamente nelle istruzioni binarie che il computer esegue. Ogni istruzione in assembly corrisponde ad una istruzione del linguaggio macchina e, siccome ogni architettura di computer ha il suo linguaggio macchina particolare, per ogni architettura di computer esiste un linguaggio assembly specifico (ovviamente computer con architettura simile avranno linguaggi macchina e linguaggi assembly simili, fatto che facilita il passaggio da un codice allaltro).

Ecco per esempio come si richiede al computer la somma di due numeri in linguaggio MIPS assembly LUI R1, #1 LUI R2, #2 DADD R3, R1, R2

Con tali istruzioni viene esguita la somma 1 + 2 = 3. Semplificando le prime due istruzioni fanno caricare in memoria i due numeri e la terza ne fa eseguire la somma e la fa salvare in memoria. Come e v i d ente dallesempio, il linguaggio assembly p i u t t o s t o diverso da quello naturale. Viceversa i linguaggi di alto livello sono molto pi simili a

a quello naturale e presentano modi pi efficienti di esprimere le istruzioni.

Limplementazione di una funzionalit in assembly richieder sempre, o quasi sempre, una maggiore quantit di codice rispetto allimplementazione della stessa funzionalit in un linguaggio di alto livello come il C.
Il linguaggio assembly fornisce al programmatore il massimo della flessibilit e delle prestazioni, ma presenta una maggiore complessit e tempi di sviluppo pi lunghi.

Informazioni pi approfondite sul linguaggio assembly sono reperibili nel larticolo Assembly language.

I linguaggi di alto livello assomigliano maggiormente al linguaggio naturale le operazioni matematiche vi sono gi incluse. Questi linguaggi sono pi difficili da tradurre in linguaggio macchina ma sono pi semplici da scrivere. Il programma visto precedentemente scritto in un linguaggio di alto livello ha laspetto seguente: x = 1 + 2; Le differenze fra i diversi linguaggi di programmazione possono anche essere notevoli.

Un programma molto semplice impiegato tradizionalmente a scopo didattico il programma Hello World (Salve Mondo), un semplice programma che fa comparire la frase Ciao Mondo sul display. Come illustrato negli esempi seguenti, anche le istruzioni per un compito semplice come questo pu essere espresso in molti modi diversi a seconda del linguaggio di programmazione scelto. Per esempio:
In C: #include <stdio.h> int main() { printf("Hello World!\n"); return 0; }

In Basic: 10 PRINT "Hello world!" 20 END In Java: public class HelloWorld { public static void main(string[] args) { System.out.println("Hello world!"); } }

In Pascal: program HelloWorld; begin writeln('Hello World'); end. In Perl: #!/usr/bin/perl print "Hello World!\n";

In riferimento agli esempi considerati, il linguaggio C considerato quello di livello pi basso, cio pi vicino al linguaggio macchina. Gli altri sono considerati linguaggi di alto livello e quindi in generale pi vicini al linguaggio naturale. Molte delle complessit che si possono notare, specialmente in Java, derivano dal modo in cui il linguaggio strutturato; Java un linguaggio orientato agli oggetti, mentre il Pascal, per esempio, un linguaggio procedurale; le differenze in questione verranno descritte pi approfonditamente nel seguito. Maggiori dettagli si trovano nellarticolo: High-level programming language. Una collezione completa di p r o g r a m m i Hello World si pu t r o v a r e n e l sito The Hello World collection

Schemi di traduzione A seconda del linguaggio utilizzato e dal particolare programma che si sta realizzando, il processo di traduzione di unistruzione espressa in un linguaggio ad alto livello in linguaggio macchina, e quindi ad una azione, pu coinvolgere il compilatore, linterprete o entrambi. La compilazione coinvolge, come gi detto, un programma detto compilatore. Linterpretazione pu essere realizzata o, in modo diretto, dalla CPU oppure da un programma detto interprete (o macchina virtuale). La traduzione dai codici sorgente al linguaggio macchina un processo che si limita allo schema di compilazione o allo schema di interpretazione.

Un malinteso molto comune consiste nel credere che tali schemi siamo propriet del linguaggio stesso. Tecnicamente parlando sono invece delle propriet dellimplementazione del linguaggio utilizzato. Quindi diverse implementazioni dello stesso linguaggio possono produrre codice che sar compilato o interpretato.

Unulteriore complicazione deriva dal fatto che molto difficile realizzare una classificazione completa dei diversi schemi possibili . Esistono, ad esempio, seguenti possibilit:
Un implementazione che usa diversi schemi. Diverse implementazioni che usano diversi schemi. Un implementazione che cambia i suoi schemi. Un implementazione che usa uno schema misto.

Schema compilato

In questo caso un programma viene tradotto in linguaggio macchina binario eseguibile che quindi interpretato dalla CPU. N.B.: molti compilatori non compilano direttamente in linguaggio macchina, ma in C, quindi in Assembly e poi in linguaggio macchina, e tutto ci in maniera completamente trasparente.
Esempi: gcc (C), g++ (C++), MSVC (C/C++), ghc (Haskell), fpc (Pascal), gpc (Pascal), V8 (JavaScript), Visual Basic 6 (BASIC).

Schema interpretato

In questo caso il codice sorgente del programma viene interpretato riga per riga dellinterprete. E uno schema utilizzato raramente, perch la stessa riga di codice deve essere reinterpretata ogni volta che viene usata; si preferisce di solito uno schema misto.
Esempi: PHP 3 o precedenti (PHP), SpiderMonkey (JavaScript)

Schema misto Viene eseguita una compilazione preliminare in una forma intermedia che non il linguaggio macchina. N.B.: a volte, per aumentare la performance, alcune parti del codice possono essere compilate direttamente in linguaggio macchina.

Esistono due modalit principali:


Schema con macchina virtuale: il codice sorgente viene compilato in modo indipendente dalla piattaforma (o architettura) in un file di bytecode, che assomiglia pi o meno al linguaggio macchina, ma che non pu essere letto direttamente dalla CPU. Un particolare programma, detto macchina virtuale interpreta il byte-code.

Esempi: javac e JVM (Sun Java), CPython (Python), PHP 4 o superiori (PHP), Visual Basic 6 P-code (BASIC), i vari linguaggi .NET (C#, VB.NET). Schema a sintassi ad albero astratta: il codice sorgente di un programma compilato in un oggetto in memoria equivalente. Quindi loggetto letto solo quando viene eseguito da questo albero. Esempi: perl (Perl), pugs (Perl)

Ogni linguaggio pu essere implementato in uno qualsiasi degli schemi precedenti. Ciascun linguaggio, per, si adatta meglio ad un certo schema piuttosto che agli altri. Alcuni programmatori considerano i linguaggi interpretati come inferiori rispetto a quelli compilati, dal momento che sono molto pi lenti.
Tuttavia la natura dinamica dei linguaggi interpretati li rende molto pi flessibili, pi facili da imparare, e pi veloci da sviluppare; in certi casi, per piccole applicazioni, accettando un ritardo di una frazione di secondo nellesecuzione si pu guadagnare una settimana nel tempo di sviluppo.

Come regola generale non bisogna scegliere un linguaggio perch veloce. Nel dubbio meglio scegliere direttamente lassembly. Va scelto un linguaggio di programmazione che si conosce bene, e con cui ci si trova a proprio agio. Lo si dovr utilizzare nel corso di tutto lo sviluppo, quindi la scelta deve essere oculata. E importante provare un certo numero di linguaggi prima di arrivare ad una scelta definitiva. Ogni linguaggio nasce da una specifica esigenza; alcuni soddisfano molte delle esigenze di un programmatore, ma non sono mai in grado di soddisfarle tutte. Ad esempio Lua, un linguaggio mirato allo scripting per videogiochi, rimane utilizzabile anche al di fuori di questo contesto, ma nelle sue funzioni

principali, di base, che esso riesce a dare il meglio di se, vale a dire la massima efficienza ed adattabilit nello scrivere le attivit da eseguire.

Come si diventa programmatore? Il compito di un programmatore risolvere un problema tramite un programma (o applicazione), che pu essere riutilizzato ogni volta che il problema si ripropone. Per svolgere tale compito, un programmatore deve poter comprendere il problema, saper ricavare una soluzione adeguata ed essere poi in grado di esprimere la soluzione trovata tramite un linguaggio di programmazione. Il primo requisito per diventare un programmatore sviluppare una solida formazione nel problem solving (risoluzione dei problemi).

La capacit di formulare in maniera formale, concisa e chiara un problema, e quindi derivarne una soluzione, una competenza fondamentale che prescinde dalla capacit di scrivere codice. Tecniche come i design pattern (modelli di progettazione) forniscono dei modelli pratici per la soluzioni dei problemi in modo comprensibile e riutilizzabile. In generale in informatica esistono diverse classi di problemi ciascuna delle quali richiede tecniche diverse per arrivare ad una soluzione efficiente. Disporre di un vasto repertorio di approcci alla soluzione di un problema di aiuto fondamentale nel raggiungimento della soluzione migliore.

Il secondo requisito richiesto ad un programmatore la conoscenza di un linguaggio di programmazione, tramite il quale esprimiere le soluzioni ottenute. Un linguaggio di programmazione, come labilit nel problem solving, uno strumento, che si affina tramite la pratica. Imparare pi di un linguaggio di programmazione pu essere utile, in modo da poter sfruttare i vari punti di forza dei diversi linguaggi per risolvere i problemi.