elementi di informatica a. a. 2016/2017 -...
TRANSCRIPT
Elementi di InformaticaA. A. 2016/2017
Ing. Nicola Amatucci
Università degli studi di Napoli Federico II
Scuola Politecnica e Delle Scienze di Base
Algoritmi e ProgrammiElementi di Informatica – A.A. 2016/2017
Ing. Nicola Amatucci
Dove Studiare
• Alla scoperta dei Fondamenti dell’Informatica, Capitolo 3• Paragrafo 3.2, 3.3, 3.5
Descrizione degli algoritmi
• Quando si affronta un problema è di fondamentale importanza, qualunque sia l'esecutore (uomo o macchina):1. capire preliminarmente se il problema ammette soluzioni
2. nel caso ne ammetta, individuare un metodo risolutivo (algoritmo)
3. esprimere tale metodo in un linguaggio comprensibile all'esecutore a cui è rivolto.
Scrivere un algoritmo che corregge gli errori lessicali in un testo
Soluzione …
Istruzioni sequenziali e strutture di controllo
• Si usano naturalmente costrutti che fissano l'ordine in cui le diverse azioni devono essere svolte.• Il più semplice tra essi è quello che stabilisce che le azioni devono essere svolte una dopo l'altra. (sequenza)• un altro costrutto stabilisce che alcune azioni devono essere svolte solo se si verificano determinate
condizioni (selezione)• la frase "se la parola è sbagliata, allora correggi, altrimenti non fare niente" prescrive la correzione soltanto in presenza di un
errore.
• un ultimo costrutto dice che alcune azioni devono essere ripetute un numero di volte prestabilito odeterminato dal verificarsi di certe condizioni (iterazione)
• ("per ogni parola del rigo fai")• ("ripeti le azioni da 1) a 4) fino alla terminazione del testo”)
• In tutti gli algoritmi si possono individuare quindi due classi fondamentali di frasi:• quelle che prescrivono la esecuzione di determinate operazioni (istruzioni);• e quelle che indicano all'esecutore l'ordine in cui tali operazioni devono essere eseguite (strutture di
controllo).
Istruzioni elementari e non
• Istruzioni:• elementari quelle istruzioni che l'esecutore è in grado di comprendere ed eseguire;• non elementari quelle non note all'esecutore.
• Perché un'istruzione non elementare possa essere eseguita dall'esecutore acui è rivolta, deve essere specificata in termini più semplici.
• Il procedimento che trasforma una istruzione non elementare in uninsieme di istruzioni elementari, prende il nome di raffinamento ospecificazione dell'istruzione non elementare.
• Il processo di raffinamento è molto importante. Senza di esso si dovrebberoesprimere gli algoritmi direttamente nel linguaggio di programmazione disponibile
Caratteristiche delle operazioni di unalgoritmo• Finitezza
• Le operazioni devono avere termine entro un intervallo di tempo finito dall'inizio della loroesecuzione
• Descrivibilità• Le operazioni devono produrre, se eseguite, degli effetti descrivibili, per esempio
fotografando lo stato degli oggetti coinvolti sia prima che dopo l’esecuzione dell’operazione
• Riproducibilità• Le operazioni devono produrre lo stesso effetto ogni volta che vengono eseguite nelle stesse
condizioni iniziali
• Comprensibilità• Le operazioni devono essere espresse in una forma comprensibile all'esecutore che deve
eseguirle
Sequenza Dinamica
• L'esecuzione di un algoritmo da parte di un esecutore si traduce inuna successione di azioni che vengono effettuate nel tempo.
• Si dice che l'esecuzione di un algoritmo evoca un processo sequenziale, cioèuna serie di eventi che occorrono uno dopo l'altro, ciascuno con un inizio euna fine identificabili.
• Si definisce sequenza di esecuzione la descrizione del processo sequenziale.La sequenza di esecuzione è l'elenco di tutte le istruzioni eseguite, nell'ordinedi esecuzione, e per questo motivo viene anche detta sequenza dinamica.
Dipendenza della sequenza dall’input
• Primo caso semplice con una sola sequenza diesecuzione
• Solitamente un algoritmo evoca più sequenzedi esecuzioni.
• In alcuni casi il numero di sequenze diesecuzione può essere infinito e il programmanon ha una terminazione.
• L’analisi delle sequenze dinamiche serveproprio a capire se un dato algoritmo abbia omeno una terminazione.
• Se si modifica l’algoritmo di calcolo delleradici di una equazione di 2° grado percontrollare la esistenza di radici reali, sicomincia ad osservare come esso generacomportamenti diversi dipendenti dal valoredei dati di input a, b e c.
Più sequenze
• In questo caso il processoevocato non è più fisso, madipende dai dati iniziali daelaborare.
• Sono possibili due sequenze aseconda che i valori assegnati aicoefficienti forniscano undiscriminante positivo o nullo enegativo.
• Uno stesso algoritmo ha quindigenerato due sequenze diesecuzione tra loro diverse.
Solitario del carcerato
Esempio del caso migliore
Algoritmo terminaal secondo tentativo
Solitario del carcerato
Algoritmo non termina mai
• Un algoritmo può prescrivere più di una sequenza di esecuzione.• Se poi l'algoritmo prescrive un processo ciclico, può accadere che il numero di
sequenze sia infinito. In questo caso l'algoritmo prescrive un processo che non hamai termine.
Algoritmo termina all n-esimo tentativo
Sequenza Statica e Dinamica
• In un programma la sequenza lessicografica delle istruzioni descrive unapluralità di sequenze dinamiche differenti.
• sequenza lessicografica è chiamata sequenza statica e descrive l'algoritmo (ovvero leazioni da svolgere) in un linguaggio di programmazione
• Il numero di sequenze dinamiche non è noto a priori e dipende dai dati daelaborare.
• La valutazione sia del tipo che del numero delle sequenze dinamiche è difondamentale importanza per valutare soluzioni diverse dello stessoproblema in modo da poter dire quale di esse presenta un tempo diesecuzione migliore, e per poter affermare se una soluzione haterminazione o meno.
Linguaggio di Programmazione
• Il linguaggio di programmazione è una notazione formale per descrivere algoritmi e, come ognilinguaggio, è dotato di un alfabeto, un lessico, una sintassi ed una semantica.
• L'aspetto formale del linguaggio si manifesta soprattutto nella presenza di regole rigide per lacomposizione di programmi a partire dai semplici caratteri dell'alfabeto.
• L'insieme di queste regole costituisce la grammatica del linguaggio.
• Un limitato insieme di regole definisce la struttura lessicale del programma• .. o unità elementari, cioè le parole del linguaggio.• Il lessico, quindi, permette di strutturare l'insieme limitato dei caratteri dell'alfabeto nel vocabolario.
• L'organizzazione delle parole in frasi è invece guidata da regole che compongono la sintassi dellinguaggio.
• Infine l'attribuzione di un significato alle frasi è oggetto delle regole semantiche.
Dal Linguaggio Macchina …
• Il linguaggio più semplice è quello che è direttamente compreso dalla CPU.• Chiameremo linguaggio macchina tale linguaggio per evidenziare il suo stretto legame con l'hardware.
• È difficile programmare in linguaggio macchina• gran numero di comandi per singole istruzioni• istruzioni espresse sotto forma di sequenze di
• I linguaggi assemblativi• pur mantenendo uno stretto legame con le potenzialità offerte dal linguaggio macchina,
sostituiscono alle sequenze di bit dei codici mnemonici più facili da interpretare e ricordare.
• I linguaggi macchina e assemblativi sono anche comunemente detti linguaggi di basso livello, inquanto si pongono al livello della macchina
… ai linguaggi ad alto livello
• Linguaggi ad Alto Livello• linguaggi di programmazione che, con istruzioni più sintetiche
• ossia con istruzioni più vicine al tradizionale modo di esprimere i procedimenti di calcoloda parte di un essere umano,
• rendono l'attività di programmazione più semplice;
• Fanno uso di uno pseudo-linguaggio umano, utilizzando per il loro scopoparole-chiave o codici operativi ispirati quasi esclusivamente alla linguainglese.
Programmazione Strutturata
• Il ruolo degli algoritmi è fondamentale se si pensa che essi sonoindipendenti sia dal linguaggio in cui sono espressi sia dal computerche li esegue.
• Si pensi ad una ricetta per una torta alla frutta:• il procedimento è lo stesso indipendentemente dall'idioma usato;
• la torta prodotta è la stessa (dovrebbe essere) indipendentemente dal cuoco.
La progettazione degli algoritmi
• Il progetto degli algoritmi è una onerosa attività intellettuale che richiedecreatività ed intuito.
• molto più onerosa di quella di esprimere l'algoritmo con un linguaggio diprogrammazione
Non esiste un algoritmo per il progetto degli algoritmi!
• Valutazione della complessità della soluzione individuata:• se ci sono algoritmi diversi per descrivere lo stesso processo:
• la complessità ci dice quale di essi è migliore, ossia quale viene eseguito nel minor tempo conla minima occupazione di memoria, più in generale con il miglior utilizzo di tutte le risorsedisponibili.
• lo studio della correttezza ci consente di valutare l'aderenza della soluzione alle specifiche delproblema.
• Essere sicuri della correttezza è un'attività tanto più complessa quanto più complesso risulta ilprogetto dell'algoritmo.
Progettazione top-down
• L’algoritmo risolutivo viene determinato applicando il principio del "divideet impera"
• Il problema di partenza viene diviso in sottoproblemi più semplici, che aloro volta vengono divisi fino ad ottenere problemi facilmente risolvibili
• Procedimento detto "stepwise refinement": si analizza il problema dapprima al piùalto livello possibile di astrazione ("top" – livello generale) e poi si scende fino araggiungere un livello di scomposizione comprensibile all’esecutore ("down" – livelloparticolare)
• Combinando le soluzioni ottenute ai problemi più semplici si risolve ilproblema originario
Esempio di stepwise refinement
Progettazione top-down:rappresentazione dell’algoritmo risolutivo
• La soluzione al problema puòessere rappresentata come unalbero in cui:
• La radice corrisponde alproblema di partenza
• I nodi rappresentano i punti discomposizione
• Le foglie sono i problemidirettamente risolvibilidall’esecutore
Progettazione bottom-up
• Si individuano i componenti elementaridella soluzione e si specificano neldettaglio
• Tali componenti sono poi connessi traloro a formare componenti più grandi,in grado di compiere operazioni piùcomplesse
• Il procedimento di connessionecontinua fino a quando è stato creatoun modulo che corrisponde proprio allasoluzione del problema
L’Ingegneria del Software
• Ai fini di una produzione industriale di qualità è necessario evitare diprodurre software in base alle esperienze e/o alle iniziative delprogrammatore:
• il processo di produzione del software non può essere un processo di tipo artigianale• Ad esempio, negli anni '60 il programmatore usava mille trucchi per risparmiare memoria!
deve invece servirsi di metodologie e tecniche sistematiche di progettazione eprogrammazione con fissati parametri di qualità e in maniera standard.
• La "software engineering" (ingegneria del software) è la brancadell'Ingegneria Informatica che raccoglie il patrimonio di metodi e tecnicheper la produzione del software.
Il ciclo di vita del software
La progettazione dei programmi di piccoledimensioni• Una delle esigenze maggiormente sentita è quella di una separazione
netta, in fase progettuale, tra il "cosa" (analisi dei requisiti especifiche funzionali) e il "come" (progetto a diversi livelli didettaglio).
• In effetti la distinzione tra il "cosa" e il "come" è comune a qualsiasi tipo diprogetto ed è un modo per esprimere con altre parole la separazione fraanalisi e sintesi.
Realizzazione dei programmi di piccoledimensioni• Fasi
• Analisi del problema
• Progettazione della soluzione
• Programmazione (implementazione della soluzione nel linguaggio di programmazione)
• Verifica
Analisi
• Comprensione del "cosa" si deve fare• Prevede l’acquisizione di le informazioni necessarie alla comprensione del problema
• Le informazioni devono essere ricavate ..• dai colloqui con gli utenti di qualsiasi livello, ovvero con coloro che sono coinvolti
nell'uso del programma sia a livello direttivo che esecutivo,• da un esame dell'ambiente in cui il programma sarà utilizzato,
• Il compito dell'analista è quello di trarre, dall'insieme confuso e a voltecontraddittorio di esigenze ed obiettivi, un modello che esprima ilproblema con un formalismo atto ad aumentarne la comprensibilità
Analisi
• In fase di analisi, avviene la cosiddetta "definizione dei requisiti" o"delle specifiche"
• È possibile distinguere tra:• requisiti funzionali
• cosa deve fare il programma e su quali dati deve operare
• è opportuno caratterizzare separatamente le funzionalità da realizzare e i dati su cui si vaad operare
• requisiti non funzionali• quali prestazioni il programma deve offrire
Analisi
• A valle della realizzazione del programma, bisognerà testare lasoddisfazione dei requisiti
• Fase di "verifica" o "test"
• La soddisfazione dei requisiti viene interpretata come "correttofunzionamento"
• È necessario perciò verificare che non vi siano ambiguità oincongruenze nei requisiti collezionati
Analisi
• Al termine della fase di analisi si deve disporre della documentazionesu:
• la definizione dei dati di ingresso al problema;
• la definizione dei dati in uscita dal problema;
• la descrizione di un metodo risolutivo che sulla carta risolva le specifiche delproblema.
Progetto ed implementazione
• La fase di progetto definisce "come" si deve risolvere il problema• Coincide con la definizione dell’algoritmo che dovrà essere implementato
• La fase di progetto può iniziare solo dopo un'accurata fase di analisi• La netta separazione tra progetto ed analisi consente di:
• non inficiare i risultati dell'analisi a causa di scelte anticipate di progetto• rendere indipendente l'analisi dai vincoli di realizzazione
• Nella fase di progettazione, l’approccio top-down è considerato uno dei più "naturali"• Il modo di procedere di tale approccio è una diretta applicazione del metodo analitico deduttivo
che si è rilevato, storicamente, il più adatto alla media degli esseri umani
• La fase di implementazione è quella di traduzione dell’algoritmo nel linguaggio diprogrammazione considerato
La Documentazione dei Programmi
• La documentazione dei programmi è lo strumento fondamentale perla leggibilità dei programmi.
• La leggibilità di un programma consente:• una più semplice comprensione di quale sia il problema che il programma
risolve e quindi della correttezza del programma stesso;
• una più semplice prosecuzione del progetto ogni qualvolta lo si sia interrotto;
• una più elementare comunicazione delle scelte di progetto;
• una più semplice modificabilità del programma al variare delle specifiche delproblema.
Documentazione esterna
• È il primo livello di documentazione• Va preparata nella fase di analisi dei requisiti
• Deve segnalare dettagli operativi tali da rendere autonomo l'utente delprogramma nell'uso dello stesso:
• funzionalità esterne• cioè offerte all’utente finale
• "cosa" fa il programma
• attivazione del programma
• diagnostiche di errore;
• configurazione richiesta del sistema;
• indicazione sull'installazione del programma;
• versione e data di aggiornamento.
Documentazione interna
• Incrementa la comprensibilità dell’algoritmo codificato nel programma
• Strumenti di documentazione interna:• Documentazione top-down
• Descrizione di come è stato concepito il programma attraverso i vari raffinamenti• Commenti
• Inserimento di frasi esplicative che descrivono le operazioni o le scelte realizzate nei vari punti delprogramma
• Tutti i linguaggi di programmazione sono dotati di una opportuna sintassi per inserire commenti in unprogramma
• Indentazione• indentare un programma significa mettere in evidenza nel testo del programma, mediante opportuni
incolonnamenti, blocchi di istruzioni che svolgono una funzionalità ben precisa• Ciò aiuta a comprendere la struttura del programma
• Uso di nomi di variabili autoesplicativi• ossia tali da spiegare il ruolo da esse svolte nel corpo del programma
Regole della documentazione
• Produrre la documentazione nel corso stesso del progetto• in quanto si può essere certi della efficacia e della completezza della
documentazione soltanto se si documentano le scelte nel momento in cui essevengono fatte
• Inserire la documentazione quanto più possibile all'interno del programmain modo che viva con il programma stesso, cambi e cresca con esso, equindi sia sempre aggiornata
• Code for readability• Always code as if the guy who ends up maintaining your code will be a violent
psychopath who knows where you live
Assemblatori e Compilatori
• Un programma assemblatore (o assembler) è un programma che effettua la traduzione dalla rappresentazione simbolica in linguaggio assembler alla rappresentazione binaria in linguaggio macchina
• Il principio usato nella formulazione degli assemblatori è stato seguito per definire i compilatori di alto livello
• La compilazione può prevedere una traduzione diretta verso il linguaggio macchina oppure richiedere un passo intermedio di generazione di codice assembly
Il linker e il loader
• Dopo il processo di traduzione ad opera del compilatore/assemblatore, che trasforma il programma sorgente in programma oggetto, il linker effettua i collegamenti tra il modulo oggetto prodotto ed eventuali altri moduli e sottoprogrammi di libreria e genera un programma eseguibile (EXE)
• Il programma eseguibile viene caricato in memoria da un programma loader (che fa parte del sistema operativo) e passato in esecuzione
Ciclo di Sviluppo di un programma in C++
discoLibrerie
(object files)
MEMORIA
(RAM)disco
discoEditor
discoPreprocessore
discoCompilatore
Linker
Loader
Programma sorgente
(nome.cpp)
Programma sorgente
(nome.cpp)
Programma sorgente
(nome.obj)
preparazione del testo originepreparazione del testo origine
… il testo origine viene digitato mediante un editor e
viene memorizzato in un file con estensione cpp
precompilazioneprecompilazione
… il testo origine (sorgente) contenuto nel file “ .cpp”
viene elaborato da un programma detto
preprocessore (o precompilatore) che
sostanzialmente esegue l’espansione del codice
(inclusioni, macro, etc.)
compilazione delle unitàcompilazione delle unità
… le unità del programma vengono compilate
mediante l’attivazione del compilatore; il testo origine
verrà trasformato in testo oggetto e memorizzato in
un file con estensione .obj
collegamento (linkage)collegamento (linkage)
… i diversi moduli oggetto costituenti il programma
eseguibile vengono collazionati fra loro (p1.obj,…,
pn.obj) e con il supporto al tempo di esecuzione
mediante un modulo collegatore (linker). Il tutto viene
memorizzato in un file che costituisce il programma
eseguibile (p.exe)
Ciclo di sviluppo di un programma in C++
@@@ I programmi C++ (compilati) funzionano su tutti i sistemi di una
determinata architettura
Codice C++
Compilatore
C++ SPARC
Solaris OS
Codice Binario
Pentium Win OS
Compilatore
C++ PowerPC
MacOS
Compilatore
C++ Pentium
Win OS
Codice Binario
PowerPC
MacOS
Codice Binario
SPARC Solaris
OS