Gli algoritmi e i linguaggi di programmazione Pag. 1 Definizione di Algoritmo e Programma Un ALGORITMO l'insieme delle istruzioni che risolvono un problema. L’algoritmo è un metodo per la soluzione di un problema. Siamo abituati a lavorare con gli algoritmi perché i problemi da affrontare, anche nella vita quotidiana sono tanti. Problemi Soluzioni Come si calcola l'area di un rettangolo Libro di Geometria Come si fa una frittata Libro di ricette Come si sintonizza la televisione Libretto di istruzioni Istruzione per istruzione, è necessario: ¾ ¾ ¾ capire in cosa consiste la istruzione da eseguire mettere in pratica l’istruzione individuare la istruzione da eseguire successivamente Svolgere queste operazioni significa ESEGUIRE l’ algoritmo. L’esecutore può essere: ¾ ¾ un uomo, come per gli esempi precedenti oppure una macchina, un computer. In questo caso l’algoritmo si chiama anche programma. Ovviamente il linguaggio in cui sono scritte le istruzioni di un programma deve essere comprensibile al computer che lo deve eseguire. Un programma è quindi un algoritmo scritto per un computer in un linguaggio ad esso comprensibile Proprietà di un algoritmo Solo un algoritmo ben fatto porta alla soluzione del problema. Un algoritmo deve quindi avere le seguenti caratteristiche: ¾ ¾ ¾ ¾ ¾ deve avere un solo punto di inizio cioè deve essere chiaro quale è la istruzione da eseguire per prima una volta terminata la esecuzione di una istruzione deve essere univoca la istruzione da eseguire successivamente cioè l’esecutore non deve avere dubbi sulla istruzione da eseguire successivamente e, in caso di due alternativa possibili gli deve essere fornito un altrettanto chiaro criterio per scegliere tra le due istruzioni ogni istruzione che lo compone deve avere una durata limitata cioè ogni istruzione per quanto complessa sia la sua esecuzione prima o poi deve terminare e l’esecutore deve poter passare alla istruzione successiva ogni istruzione che lo compone deve essere non ambigua cioè non deve prestarsi ad interpretazioni differenti ogni istruzione che lo compone deve essere elementare per l'esecutore cioè l’esecutore deve poter associare alla istruzione le azioni da fare senza necessità di ulteriori spiegazioni Un algoritmo può avere più punti di fine, se propone istruzioni alternative per risolvere il problema. Ad esempio un algoritmo che “spiega” come effettuare una telefonata può terminare in modo diverso in funzione se il numero chiamato è libero oppure occupato Durante la stesura di un algoritmo non esistono istruzioni "ovvie" che si può pensare di omettere. Se una istruzione non è presente, l’esecutore non la può aggiungere: se la istruzione era necessaria la sua mancata esecuzione provocherà il non funzionamento dell’algoritmo. Questo punto è molto importante nella stesura dei programmi perché il computer non ha iniziativa a differenza di un esecutore uomo che potrebbe ovviare con il buon senso alla mancanza di una istruzione A.S. 08-09 ©Rauch Gli algoritmi e i linguaggi di programmazione Pag. 2 La sequenza Eseguire un algoritmo in sequenza significa eseguire tutte le istruzioni che compongono l’algoritmo dalla prima fino all’ultima senza avere possibilità di scelta. La sequenza è simile alla visita di una fiera seguendo un percorso obbligato: si visitano tutti gli spazi espositivi senza saltarne nessuno. Solo problemi particolarmente semplici possono essere risolti da una sequenza di istruzioni Spegni la sveglia Alzati Lavati Vestiti Fai Colazione Ascolta la radio Esci di casa Consideriamo ad esempio la sequenza di istruzioni qui accanto. E’ l’algoritmo “RISVEGLIO MATTUTINO” che nessuno ha mai scritto ma che probabilmente tutti eseguiamo da anni metodicamente in modo sempre uguale tutte le mattine. Ricordiamo che le istruzioni sono ordini da eseguire che obbligano l’esecutore ad eseguire, una dopo l’altra, una serie di azioni. L’algoritmo è discutibile ed è solo un esempio perché: ¾ ¾ Il risveglio mattutino non è un vero problema (anche se qualcuno potrebbe pensare il contrario) le istruzioni, sia pure ordinate in un modo più o meno ragionevole, obbligano tutti gli esecutori a eseguire le stesse azioni Nella vita quotidiana raramente si eseguono algoritmi in modo rigido. Infatti: Anche se non è frequente, si può spegnere la sveglia dopo essersi alzati. Invece di ascoltare la radio, qualcuno potrebbe voler vedere la televisione o leggere il giornale. Molti escono da casa digiuni e fanno colazione al bar o non la fanno per niente. Non è detto che si debba fare colazione vestiti di tutto punto, qualcuno preferisce farla ancora in pigiama. Probabilmente però tutti si vestono prima di uscire di casa! Un esecutore uomo può concepire questo algoritmo come un promemoria e comportarsi in modo più o meno simile omettendo delle istruzioni o aggiungendone altre di sua iniziativa. Quando l’esecutore è una macchina, che non pensa e non ha buon senso, è necessario che le istruzioni di una sequenza siano ordinate in modo logico perché: ¾ ¾ ¾ nessuna istruzione può essere arbitrariamente aggiunta o non eseguita o eseguita in un ordine diverso da quello prescritto. A.S. 08-09 ©Rauch Gli algoritmi e i linguaggi di programmazione Pag. 3 Il Linguaggio macchina Il microprocessore comprende solo istruzioni in LINGUAGGIO MACCHINA: un programma composto da numeri binari. è Il primo numero che compone l’istruzione si chiama Codice Operativo. Gli altri numeri che eventualmente compongono l’istruzione si chiamano operandi Al Fetch la CPU legge il codice operativo dell’istruzione e nella fase di Decode comprende: ¾ di quale istruzione si tratta ¾ se ci sono operandida leggere Dopo la eventuale lettura degli operandi la CPU passa alla fase di Execute. Eseguita la istruzione la CPU fa Fetch del codice operativo della istruzione successiva e così via. Per un programmatore quindi è difficile scrivere un programma in linguaggio macchina in quanto dovrebbe conoscere il significato associato ad ogni singolo numero; inoltre è alto il rischio di commettere errori. I linguaggi di programmazione I programmi vengono quindi scritti in un LINGUAGGIO INTERMEDIO, cioè in un linguaggio che pur non essendo quello della macchina, non è neppure il linguaggio normale in cui il programmatore si esprime. In questa situazione per poter fare eseguire al microprocessore un programma scritto in un linguaggio intermedio è necessario avere a disposizione un traduttore da quel linguaggio al linguaggio che il microprocessore comprende. B=3 H=5 AREA = B * H Traduttore Linguaggio intermedio Linguaggio macchina Il linguaggio più vicino al linguaggio macchina: l’ASSEMBLER Le istruzioni dell’Assembler corrispondono grosso modo a quelle elementari della CPU, con il vantaggio che, invece di usare i numeri le istruzioni si scrivono con delle paroline chiamate mnemonici perché aiutano il programmatore a “ricordare” di che istruzione si tratta. Ogni CPU ha il suo assembler. Famiglie di microprocessori possono avere lo stesso assembler. Esempio: La Cpu ha al suo interno i registri, aree di memoria in cui depositare i dati. I registri sono quasi sempre contrassegnati con le lettere dell’alfabeto A B C etc. E’ possibile per la CPU eseguire istruzioni di spostamento dei dati da un registro all’altro Lo mnemonico per l’istruzione di spostamento è quasi sempre: MOV ( dal verbo inglese to move = spostare ) oppure LOAD (dal verbo to load = caricare) La sintassi per spostare il dato da un registro (sorgente del dato) ad un altro (destinazione del dato) MOV registro destinazione , registro sorgente L’istruzione MOV A , B significa: copia il contenuto del registro B nel registro A. In questo modo il precedente valore contenuto in A viene distrutto. Per invertire il contenuto dei registri A e B serve un terzo registro C in cui “salvare” il contenuto precedente di A prima di copiare B in A. La terza istruzione porta in B il contenuto di C, cioè il vecchio valore di A MOV C , A MOV A , B MOV B , C A.S. 08-09 ©Rauch Gli algoritmi e i linguaggi di programmazione Pag. 4 I Linguaggi Evoluti Un linguaggio si definisce tanto più EVOLUTO quanto più è lontano da quello della macchina e quanto più si avvicina a quello naturale in cui parla il programmatore. Purtroppo gli autori dei linguaggi intermedi sono di madrelingua inglese. Imparare i linguaggi intermedi, anche quelli più evoluti, comporta per un italiano uno sforzo aggiuntivo: deve imparare molti termini inglesi che sono “naturali” invece per i programmatori che parlano normalmente inglese. Più il linguaggio è evoluto e più la singola istruzione di quel linguaggio verrà tradotta in un gran numero di istruzioni in linguaggio macchina. BASIC, PASCAL, COBOL, C, ASSEMBLER, JAVA sono tutti nomi di linguaggi intermedi. Un programma scritto in uno di questi linguaggi deve essere tradotto in linguaggio macchina per poter essere eseguito. Il programma scritto in un linguaggio di programmazione viene chiamato programma sorgente (source program). Il programma tradotto in linguaggio macchina si chiama programma oggetto Di solito il programmatore scrive il programma su un foglio di carta. Per poter subire il processo di traduzione da parte del traduttore, il programma deve essere immagazzinato su disco. Il programmatore deve poter adoperare il computer “come una macchina da scrivere” e alla fine della digitazione deve poter salvare il programma su disco ( sul floppy o sull’hard disk). Il programma deve diventare quindi un file su disco. I file sorgente hanno un no me a scelta del programmatore ma una estensione obbligatoria che identifica il linguaggio di programmazione in cui sono scritti. Ad esempio la estensione: .bas identifica un file che contiene istruzioni scritte in basic .pas identifica un file che contiene istruzioni scritte in pascal .c identifica un file che contiene istruzioni scritte in C .cpp identifica un file che contiene istruzioni scritte in C++ .asm identifica un file che contiene istruzioni scritte in assembler .java identifica un file che contiene istruzioni scritte in java Per programmare in Basic bisogna avere installato nel computer un programma che traduca dal Basic al linguaggio macchina. Per programmare in Java ci vuole un traduttore Java e così via. Il Visual Basic 6.0 installato nei computer del Laboratorio è un traduttore. Imparare a programmare significa imparare la “grammatica” e la “sintassi” del linguaggio intermedio che abbiamo scelto. Alcuni traduttori forniscono al programmatore un completo ambiente di lavoro in cui: ¾ ¾ ¾ digitare il programma far tradurre il programma far eseguire il programma Questo ambiente si chiama integrated development environment (IDE), in italiano ambiente integrato di sviluppo, Oggi gli IDE più noti sono: • • • • • Delphi e Kylix, prodotti della Borland, che supportano il linguaggio Object Pascal. Visual Studio, prodotto della Microsoft, che supporta i linguaggi VisualBasic, C, C++, J++,. Visual Studio .NET, prodotto dalla Microsoft, che supporta C#, J sharp Visual Basic .Net e. Per il linguaggio C e C++ C++Builder, prodotto dalla Borland e Bloodshed Dev C++ JBuilder, prodotto dalla Borland, che supporta il linguaggio Java. A.S. 08-09 ©Rauch