2 Algoritmo La programmazione Procedimento di risoluzione di un problema Permette di ottenere un risultato eseguendo una sequenza finita di operazioni elementari Esempi: Ver. 2.4 Una ricetta di cucina Il metodo per calcolare le radici di un’equazione di secondo grado Le istruzioni per utilizzare il microonde Ci possono essere più algoritmi in grado di risolvere lo stesso problema © 2010 - Claudio Fornaro - Corso di programmazione in C 3 Algoritmo Proprietà fondamentali dell'algoritmo: la sequenza di istruzioni deve essere finita (finitezza); la sequenza di istruzioni deve portare ad un risultato (efficacia); le istruzioni devono essere eseguibili materialmente (realizzabilità); le istruzioni devono essere espresse in modo non ambiguo (non ambiguità). È importante valutare le risorse utilizzate (tempo, memoria, …) perché un consumo eccessivo delle stesse può pregiudicare la possibilità stessa di utilizzo di un algoritmo 4 Programmare Se esiste un procedimento che: può essere descritto in modo non ambiguo fino ai dettagli conduce sempre all'obiettivo desiderato in un tempo finito allora esistono le condizioni per affidare questo compito a un calcolatore Si descrive l'algoritmo in questione in un programma scritto in un opportuno linguaggio comprensibile alla macchina. 5 Programmare 6 Linguaggi Il calcolatore sa eseguire molte operazioni di base: somma, sottrazione, AND, ecc. Per risolvere un determinato problema si combinano queste operazioni in modo opportuno Programmare significa determinare quali operazioni eseguire e in quale sequenza per raggiungere la soluzione Perché il programmatore possa istruire il calcolatore sulle operazioni da fare, serve un linguaggio noto ad entrambi Problema: Il calcolatore comprende solo sequenze di zeri e uno (ad es. la sequenza 1001001 potrebbe significare, per un ipotetico calcolatore, “fai la somma”): linguaggio macchina Il programmatore comprende le parole “fai la somma” (mentre 1001001 non significa nulla per lui): linguaggio umano 7 Linguaggio di programmazione Soluzione 1 Il programmatore impara il linguaggio macchina, ma questo: ha un basso livello di astrazione (scende molto nei dettagli realizzativi e perde la visione di insieme del problema da risolvere) è difficile da ricordare (le istruzioni possono essere diverse centinaia) è diverso per ogni piattaforma hardware (ogni tipo di microprocessore ha il suo set di istruzioni) 8 Linguaggio di programmazione Soluzione 2 Il programmatore impara un linguaggio simile al linguaggio macchina detto assembly Ogni istruzione del linguaggio assembly corrisponde ad un’istruzione in linguaggio macchina, ma ha il vantaggio di essere mnemonico (es. ADD è l’istruzione per calcolare una somma) 9 Linguaggio di programmazione Soluzione 2 (Continuazione) Il linguaggio assembly: 10 Linguaggio di programmazione ha un basso livello di astrazione è più facile da ricordare (ad es. per avere una somma invece di scrivere 1001001 si scrive ADD) viene tradotto in linguaggio macchina da un programma relativamente semplice (assembler ) che, in linea di massima, sostituisce le istruzioni assembly con le corrispondenti istruzioni macchina è diverso per ogni piattaforma hardware (sebbene possano essere simili) Soluzione 3 Il programmatore impara un linguaggio di programmazione ad alto livello (HLL) un traduttore complesso ed efficiente lo traduce in linguaggio macchina o in assembly ha un alto livello di astrazione (esprime le operazioni da svolgere senza entrare nei dettagli, es. A+B calcola la somma di due valori) è più simile al linguaggio umano e quindi più facile da ricordare (es. “print X” potrebbe essere l’istruzione per visualizzare il valore di X) è (quasi) indipendente da piattaforma hardware e sistema operativo (PC, Mac, Windows, Linux, ecc.), è il traduttore che lo converte per il sistema in uso 11 Programma sorgente Il programmatore sviluppa un programma scrivendo in un linguaggio di programmazione (di alto o basso livello) le operazioni da far eseguire al calcolatore e le memorizza in un file detto: programma programma sorgente codice sorgente sorgente 12 Traduttore di tipo interprete Le istruzioni del codice sorgente vengono ad una ad una tradotte in linguaggio macchina e subito eseguite dalla CPU Sorgente somma somma stampa stampa leggi leggi calcola calcola ... ... 13 Traduttore di tipo compilatore Differenze Tutto il codice sorgente viene tradotto in linguaggio macchina e memorizzato in un file detto programma (o file o codice) eseguibile Sorgente somma somma stampa stampa leggi leggi calcola calcola ... ... 14 Eseguibile 1001001010101 1001001010101 0010100101010 0010100101010 1001001010010 1001001010010 1010010100101 1010010100101 0101010101011 0101010101011 0101001010100 0101001010100 1001001010010 1001001010010 Velocità di esecuzione Ogni volta che l’interprete esegue un programma, deve attuare la traduzione delle istruzioni in linguaggio macchina: lento Il programma compilato è già tradotto e ha quindi una velocità di esecuzione molto superiore Il compilatore è in genere in grado di produrre una traduzione più efficiente dal punto di vista della velocità di esecuzione del codice prodotto (oppure della dimensione del codice) 15 16 Differenze Differenze Competenze per l’uso Eseguire un programma interpretato richiede l’acquisto e del programma interprete da parte dell’utente finale e l’acquisizione dello stesso delle competenze necessarie al suo uso Eseguire un programma compilato non richiede che un (doppio) click Il compilatore viene acquistato solo dal programmatore e solo questi ha la necessità di avere la competenza necessaria per utilizzarlo Copyright e gestione della complessità L’interprete richiede il codice sorgente che quindi risulta visibile a chiunque Il programma eseguibile non necessita del sorgente: protezione del copyright La procedura di compilazione permette di suddividere un programma complesso in più parti, ma è più complessa da gestire 17 Librerie 18 Creazione di un eseguibile In un HLL il programmatore non ha necessità di programmare le operazioni di base (ad es. leggere un numero dalla tastiera, calcolare la radice quadrata, visualizzare una parola, ecc.) Queste operazioni sono state programmate e compilate dal produttore del traduttore e sono a disposizione del programmatore sotto forma di funzioni I codici eseguibili (quindi già tradotti in linguaggio macchina) che realizzano queste operazioni vengono raggruppati in file detti librerie (collezioni di funzioni di base) Il processo di creazione di un eseguibile a partire dai sorgenti (build) è composto da 2 fasi: compilazione: il sorgente viene compilato, ma alcune parti (le “operazioni di base”) sono ancora mancanti; viene generato un file intermedio detto file oggetto linking: il file oggetto e le librerie vengono unite (collegate – link) così da aggiungere al file oggetto le parti mancanti e costituire un unico file eseguibile La fase di link può creare un eseguibile collegando più file oggetto e più librerie 19 Librerie statiche Nella compilazione il codice delle funzioni di libreria viene inserito nel file eseguibile File eseguibile File oggetto File libreria 20 Librerie statiche Spesso le stesse librerie sono usate da più programmi (es. le operazioni di input/output): spreco di memoria Eseguibile A Eseguibile B Eseguibile C Oggetto A Oggetto B Oggetto C Libreria Libreria Libreria RAM RAM 21 Librerie dinamiche 22 Librerie dinamiche Dynamic Link Libraries (DLL) Shared Libraries, Shared Objects Nella compilazione il codice delle funzioni di libreria NON è inserito nel file eseguibile, viene invece indicato il nome del file che lo contiene File eseguibile File oggetto Quando viene eseguito un programma che usa quella libreria, questa viene caricata in memoria, ma è utilizzabile anche dagli altri programmi Eseguibile A Eseguibile B Eseguibile C Oggetto A Oggetto B Oggetto C File libreria RAM RAM Libreria 23 Librerie dinamiche Quando viene eseguito un altro programma che necessita di quella libreria, questa è già caricata in memoria e pronta all’uso: il programma impiega meno tempo a partire Se una delle funzioni della libreria deve essere aggiornata (es. nuova versione), è sufficiente sostituire la DLL mentre il programma in sé non viene modificato Se la DLL viene sostituita da un’altra con codice contenente ad esempio un virus, il lancio del programma esegue il virus! 24 Interfacce utente L’interazione tra utente e programma può avvenire tramite: Interfacce a carattere (console mode): vengono visualizzate e immesse solo righe di testo Interfacce grafiche (GUI – Graphic User Interface): vengono visualizzati pannelli, bottoni, caselle di testo, immagini, ecc. Molti linguaggi dispongono di entrambe le interfacce