Dr. Francesco Fabozzi Corso di Informatica Programmazione Dr. Francesco Fabozzi Corso di Informatica
Programmazione La programmazione rappresenta la seconda fase della risoluzione di un problema tramite un elaboratore Consiste nella traduzione dell’algoritmo definito nella fase di analisi in una serie di istruzioni che possano essere eseguite dai circuiti elettronici dell’elaboratore (programma) Il linguaggio di programmazione “comprensibile” dall’hardware si chiama linguaggio macchina
Linguaggio macchina Strettamente legato all’hardware dell’elaboratore Chi programma in linguaggio macchina deve conoscere l’hardware della macchina che deve eseguire il programma Le istruzioni e i dati sono stringhe binarie La scrittura, lettura e il mantenimento di un programma sono difficili Operazioni anche semplici richiedono molte istruzioni elementari
Linguaggio macchina Esempio di istruzione in linguaggio macchina Carica nel primo registro libero della CPU il numero 8 0011 1000 8 Istruzione LOAD Rilevante sforzo da parte del programmatore anche per effettuare operazioni semplici!
Linguaggi simbolici I linguaggi simbolici si collocano a un livello immediatamente superiore al linguaggio macchina Si parla di “linguaggi a basso livello” Codifica simbolica delle istruzioni anziché binaria Ogni istruzione è identificata da una sigla Una variabile può essere rappresentata da un nome
Linguaggi simbolici I linguaggi simbolici necessitano di un programma per tradurre le istruzioni in linguaggio macchina (programma assemblatore) Questi linguaggi sono detti anche linguaggi assembler o assembly
Linguaggi simbolici Esempio di istruzione in linguaggio assembler MOV A 7 Scrivi 7 nella variabile A Il vantaggio di un linguaggio assembler su un linguaggio ad alto livello è la possibilità di ottimizzare il programma rispetto ai tempi di esecuzione
Linguaggi ad alto livello I linguaggi ad alto livello non sono legati alle componenti fisiche dell’elaboratore Sono più vicini al linguaggio naturale rispetto al linguaggio macchina + Linguaggio macchina Assembler precisione potenza espressiva Linguaggi ad alto livello Linguaggio naturale +
Linguaggi ad alto livello Ma rispetto al linguaggio naturale sono un linguaggio di programmazione ad alto livello è più formale e preciso Caratterizzato da una rigida semantica, grammatica e sintassi Anche per i linguaggi ad alto livello sono necessari programmi per la traduzione di un programma in linguaggio macchina Programmi compilatori e interpreti
Linguaggi ad alto livello Vantaggi Portabilità: lo stesso programma può essere usato su diversi elaboratori Leggibilità Mantenibilità: più facile correggere ed evolvere il programma anche da parte di persone diverse dall’autore originale Svantaggio Minore efficienza: controllo limitato sulla modalità di traduzione del compilatore
Programmazione strutturata Approccio disciplinato alla programmazione nato negli anni ’60 Obiettivi: realizzare programmi chiari, leggibili, facili da testare e modificare Facilita il mantenimento del software Elementi basilari: eliminazione dei salti uso sistematico degli schemi di sequenza, selezione, iterazione
Linguaggi procedurali Una categoria di linguaggi di alto livello è quella dei linguaggi procedurali Il programma viene diviso in diverse unità (procedure) ciascuna preposta allo svolgimento di una certa azione Una procedura può essere “chiamata” da un’altra e possono scambiarsi dati Il programma appare come una sequenza di chiamate di procedure accompagnato da un conseguente flusso di dati
Linguaggi Object-Oriented Esistono anche linguaggi non procedurali Citiamo per la loro importanza i cosiddetti “linguaggi orientati agli oggetti” Nel programma vengono definiti dei componenti software che modellizzano gli elementi del problema (oggetti) Vengono definite le loro proprietà e azioni insieme alla loro interfaccia-utente Il programma appare come una serie di oggetti che sono creati all’occorrenza e ai quali si possono impartire comandi
Ambiente di sviluppo Per scrivere un programma abbiamo bisogno di altri programmi! Si dice ambiente di sviluppo l’insieme dei programmi che sono di ausilio alla scrittura di programmi applicativi in un certo linguaggio di programmazione
Ambiente di sviluppo Un ambiente di sviluppo deve fornire: Editor: per la scrittura mediante tastiera del programma sorgente Programmi traduttori: per la traduzione in linguaggio macchina del programma sorgente Interprete oppure compilatore Debugger: per la ricerca di errori (detti anche bachi o bug) Analizza l’esecuzione del programma verificando passo passo il risultato delle singole istruzioni
Programma interprete Cosa fa un programma interprete: traduce ciascuna istruzione del programma sorgente in istruzioni macchina la esegue passa all’istruzione successiva In caso di errore: Si può correggere subito l’errore nel programma che potrà riprendere dal punto in cui si era interrotto Ma…
Programma interprete Ma… In genere programmi complessi hanno istruzioni che si ripetono diverse volte Questo significa che la traduzione in linguaggio macchina verrà ripetuta ogni volta I programmi interpreti sono poco efficienti per l’esecuzione di programmi complessi
Compilatore Cosa fa un compilatore: Esistono compilatori ottimizzati traduce l’intero programma sorgente in un programma in codice macchina (programma oggetto) Istruzioni ripetute sono tradotte una sola volta Esistono compilatori ottimizzati Generano un codice macchina particolarmente efficiente per un migliore utilizzo delle risorse hardware Ma…
Compilatore Ma… In caso di errore bisogna ricompilare il tutto e rigirare il programma dall’inizio I compilatori ottimizzati danno meno informazioni in caso di errore
Compilatore Per ovviare al problema di ricompilare tutto il programma in caso di errore, si divide il programma in moduli più piccoli da compilare separatamente Ottengo un certo numero di programmi oggetto I programmi oggetto contengono solo gli indirizzi di memoria relativi ma non quelli assoluti
Compilatore Si rende pertanto necessario un altro programma: programma assemblatore (Linker) Il linker trasforma i vari programmi oggetto in un unico programma eseguibile Assegna gli indirizzi di memoria assoluti Associa anche le librerie necessarie
Librerie Spesso programmi diversi richiedono di eseguire lo stesso tipo di operazioni Ad esempio il calcolo della radice quadrata di un numero E’ utile incapsulare queste operazioni in programmi (o program unit) separati che possono essere linkate alla fine col programma principale (main program) E’ preferibile pre-compilare tutti questi programmi separatamente e raggruppare i programmi oggetto in collezioni (dette librerie) che vengono linkate all’occorrenza dal linker
Dai sorgenti all’eseguibile editing compilazione linking programma oggetto (file .obj) programma sorgente programma oggetto (file .obj) programma eseguibile (file .exe) Scrivo programmi con un editor programma sorgente programma sorgente programma oggetto (file .obj)
Cenni storici Inizio anni ’50 Nascono i linguaggi simbolici 1956: nasce il FORTRAN (FORMula TRANslator) Primo linguaggio ad alto livello Per scopi scientifici ed ingegneristici 1960: nasce il COBOL (COmmon Business Oriented Language) Semplice e versatile Per applicazioni commerciali e gestionali
Cenni storici 1960-1970: proliferazione di numerosi linguaggi, tentativo di razionalizzare la definizione e le tecniche di implementazione dei linguaggi Nasce l’ALGOL 60 (viene considerato il capostipite dei linguaggi moderni) Inizio anni ’70: diffusione di linguaggi strettamente aderenti ai principi della programmazione strutturata
Cenni storici 1971: nasce il Pascal 1974: nasce il C Nasce in ambito scientifico, largo uso didattico Uso coerente della programmazione strutturata 1974: nasce il C Nasce in ambito scientifico Struttura aderente ai principi della programmazione strutturata Molto diffuso: programmi per la risoluzione di problemi molto complessi e per il software di base di sistemi
Cenni storici Anni ’70: nasce il SIMULA 67 Capostipite dei linguaggi Object-Oriented Dagli anni ’80 a oggi: sviluppo di linguaggi non procedurali, affermazione dei linguaggi Object-Oriented Versioni ad oggetti del C (C++) e del Pascal (TurboPascal 5.5) VisualBasic, Java