Il 0% ha trovato utile questo documento (0 voti)
35 visualizzazioni39 pagine

08 Lesson FI Algoritmi Complessita Linguaggi Di Programmazione

Caricato da

rbruno1647
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
35 visualizzazioni39 pagine

08 Lesson FI Algoritmi Complessita Linguaggi Di Programmazione

Caricato da

rbruno1647
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 39

CORSO DI FONDAMENTI DI INFORMATICA

ANNO ACCADEMICO 2023/2024


Corso di Laurea in Ingegneria dell’Automazione
Corso di Laurea in Ingegneria Informatica

Docente: Luigi De Simone


Informatica e studio di Algoritmi
• Algoritmo
– la sequenza precisa di operazioni il cui svolgimento sequenziale
è necessario per la soluzione di un problema assegnato

• Informa-ca → studio sistema,co degli algoritmi


– Il calcolatore è tra tu7 gli esecutori di algoritmi (compreso
l’uomo) quello che si mostra più potente degli altri e con una
potenza tale da perme=ere di ges>re quan>tà di informazioni
altrimen> non tra=abili
Algoritmo ed Esecutore
• Algoritmo
– Dalla trascrizione latina del nome del matematico persiano al-Khwarizmi,
vissuto nel IX secolo d.C., considerato uno dei primi autori ad aver fatto
riferimento a questo concetto
– Prescrive un insieme di operazioni o azioni finite eseguendo le quali è
possibile risolvere il problema assegnato
– Se si indica con istruzione la prescrizione di una singola operazione, allora
l'algoritmo è un insieme di istruzioni da svolgere secondo un ordine
prefissato
• Esecutore
– l'uomo o la macchina in grado di risolvere il problema eseguendo l'algoritmo
– Se un algoritmo è un insieme di istruzioni da eseguire secondo un ordine
prefissato, allora l’esecutore non solo deve comprendere le singole istruzioni
ma deve essere anche capace di eseguirle
Cos’è un Computer
• Un computer è un apparecchio elettronico
– Strutturalmente non ha niente di diverso da un televisore, uno stereo, un telefono
cellulare o una calcolatrice elettronica

• Progettato per eseguire autonomamente e velocemente attività diverse


– Come tutte le macchine, non ha nessuna capacità decisionale o discrezionale, ma si
limita a compiere determinate azioni secondo procedure prestabilite

• Il computer è una macchina che in maniera automatica esegue operazioni


“elementari” ad altissima velocità
– L'altissima velocità di elaborazione (ad es. milioni di istruzioni per secondo) fa sì che
operazioni complicate, espresse mediante un gran numero di operazioni semplici,
siano eseguite in tempi ragionevoli per l'ambiente esterno
Algoritmo e Programma
• Informalmente, un algoritmo è la descrizione di un lavoro
da far svolgere ad un esecutore
– Se si vuole usare un computer bisogna non solo progettare
preliminarmente un algoritmo, ma anche provvedere a
comunicarglielo in modo che gli risulti comprensibile
• La descrizione di un algoritmo in un linguaggio
comprensibile ad un calcolatore è detto Programma
• Il linguaggio nel quale viene scritto il programma è detto
linguaggio di programmazione
Programma
• La specifica è la descrizione in linguaggio naturale del
problema da risolvere
• Informazioni di ingresso
• Informazioni di uscita
• Esempi:
– Somma di due numeri naturali di una cifra
• Input: i due numeri; output: la somma e il riporto
– Somma di due numeri naturali in colonna
• Input:i due numeri naturali; output: la somma
Macchina di Turing
• La Macchina di Turing (1936) è un modello fondamentale nella teoria
dell’informaIca. Ha consenIto di oKenere importanI risultaI circa la calcolabilità, la
complessità, e l’equivalenza di algoritmi.
Un parIcolare automa composto da:
• Un nastro ideale (memoria), cioè una striscia con/nua di celle ciascuna delle quali può essere vuota
o contenere i simboli di un alfabeto
• Una tes/na di le0ura-scri0ura
• Ha la capacità di compiere le seguenI azione elaboraIve
• Spostamento tes/na di una posizione (le:-right)
• Le0ura e scri0ura di un simbolo nella cella so?o la tes/na (s os/tuendo il contenuto
precedente)
• Un disposi8vo di controllo che in ogni istante si trova in uno tra un numero finito di
staI e che per ciascuna coppia (stato-simbolo leKo):
• Cambia stato
• Esegue una delle azioni elabora/ve
Macchina di Turing
Macchina di Turing
Calcolabilità e trattabilità
• Calcolabilità
• consente di dimostrare l’esistenza (ossia, la decidibilità) di un algoritmo
risolvente un problema assegnato ed indipendente da qualsiasi automa
• classifica i problemi in risolvibili e non risolvibili
• un problema è risolvibile se esiste una Macchina di Turing in grado di
fornire la soluzione al problema in tempo finito
• Trattabilità
• studia l’eseguibilità degli algoritmi risolventi
• classifica i problemi in facili e difficili
• un problema è trattabile se esiste un algoritmo computazionale in grado di
giungere alla soluzione in tempi di esecuzione accettabili e con un
consumo di risorse (memoria) accettabile
Calcolabilità e trattabilità
• Complessità computazionale
• studia i costi di esecuzione di un algoritmo risolutivo e come essi
variano al crescere della dimensione del problema
• mira a comprendere le prestazioni massime raggiungibili da un
algoritmo risolutivo di un problema
• corrisponde ad una misura delle risorse di calcolo consumate
durante la computazione di un algoritmo
• Il concetto di trattabilità dipende da quello di complessità
computazionale
Tipi di complessità
• Esistono due tipi fondamentali, fra loro interdipendenti, di
complessità computazionale
• Complessità Spaziale
• misura la quantità di memoria necessaria alla rappresentazione dei
dati richiesti dall’algoritmo per risolvere il problema
• Complessità Temporale
• misura il tempo richiesto per produrre la soluzione maggiormente
considerata in quanto i calcolatori hanno tipicamente molta memoria
disponibile
Misure di complessità
• Le misure di complessità possono essere di due tipi
fondamentali:
• Statiche
• basate sulle caratteristiche strutturali (ad es. il numero di istruzioni)
dell’algoritmo indipendenti dai dati di input su cui esso opera
• Dinamiche
• dipendenti sia dalle caratteristiche strutturali dell’algoritmo che dai
dati di input su cui esso opera
Complessità e dati di input
• Un primo fattore che incide sul tempo impiegato dall’algoritmo è la
quantità di dati su cui lavora
• Il tempo di esecuzione di un algoritmo è tipicamente espresso
come una funzione f(n) della dimensione n dei dati di input
• ad esempio, un algoritmo ha un tempo di esecuzione n2 se il tempo
impiegato aumenta in funzione del quadrato della dimensione dell’input
• Da sola la dimensione dei dati di input non basta
• il tempo di esecuzione può dipendere anche dalla particolare
configurazione che possono assumere i dati in input
• possono esserci alcune condizioni di esecuzione che in funzione di
particolari valori dei dati di ingresso, determinano diversi percorsi
nell’algoritmo e quindi diverse quantità di dati da elaborare
Tempo di esecuzione
• Analisi del caso migliore
• per calcolare il tempo di esecuzione quando la configurazione dei dati
presenta difficoltà minime di trattamento
• Analisi del caso peggiore
• per calcolare il tempo di esecuzione quando la configurazione dei dati
presenta difficoltà massime di trattamento
• si tratta di un’analisi molto utile, perché fornisce delle garanzie sul tempo massimo
che l’algoritmo può impiegare
• Analisi del caso medio
• per calcolare il tempo di esecuzione quando la configurazione
presenta difficoltà medie di trattamento
Complessità asintotica
• Quando si analizza la complessità computazionale di un
algoritmo si valuta come i tempi di esecuzione crescono al
crescere della dimensione dei dati
• In pratica si valuta come l’ordine di grandezza del tempo di
esecuzione f(n) cresca al limite (tenda ai suoi asintoti)
• per dimensioni dell’input sufficientemente grandi
• si trascurano operazioni non significative concentrando l’attenzione
solo su quelle predominanti
• La complessità asintotica dipende solo dall’algoritmo
• la complessità esatta, invece, dipende da tanti fattori legati alla
esecuzione dell’algoritmo
Complessità asintotica
• Dati due algoritmi diversi che risolvono lo stesso problema e
presentano due diverse complessità 𝑓(𝑛) e 𝑔(𝑛)
• se 𝑓(𝑛) è asintoticamente inferiore a 𝑔(𝑛)
• allora esiste una dimensione dell’input 𝑛0 oltre la quale l’ordine di
grandezza del tempo di esecuzione del primo algoritmo è inferiore
all’ordine di grandezza del tempo di esecuzione del secondo
Esempi di complessità temporale
• Le complessità asintotiche più diffuse sono la logaritmica, la
polinomiale, e l’esponenziale (più trattabile la prima)
• Complessità logaritmica
• f(n) = log n,…
• Complessità polinomiale
• f(n) = n, f(n) = n2, f(n) = n3, f(n) = n5,…
• Complessità esponenziale (o, in generale, Non Polinomiale, NP)
• f(n) =2n, f(n) = 3n,…
Esempio: Trovare il minimo
• PROBLEMA: Trovare il minimo m in un insieme di n numeri {x1, x2,…, x𝑛}
• Possibile algoritmo risolutivo
• considero x1 come primo candidato ad essere il minimo m
• confronto m con gli elementi x2,…,x𝑛
• ogni volta che trovo un elemento xi<m à aggiorno il valore temporaneo del minimo m = xi
• al termine dei confronti, il valore attuale di m è il minimo effettivo
• Complessità dell’algoritmo risolutivo à f(n) = n
• complessivamente sono stati eseguiti n-1 confronti, che asintoticamente tende a n
• l’efficienza dell’algoritmo è quindi direttamente proporzionale alla dimensione n dei dati
di input
Esempio: ordinamento
• PROBLEMA: Disporre in ordine crescente un insieme di n numeri {x1,
x2,…, x𝑛}

• Possibile algoritmo risolutivo


• per ogni valore di un indice 𝑖 = 1,2,…,𝑛 ripetere le seguenti operazioni
• trovare l’elemento più piccolo nel sottoinsieme {x𝑖, x𝑖+1,…, x𝑛}
• portare il minimo locale m in prima posizione, scambiando m con l’elemento 𝑋𝑖
• Complessità dell’algoritmo risolutivo → f(n) = n2
• per n-1 volte si cerca il minimo su n-1 insiemi diversi sempre più piccoli
• poi si sposta il minimo trovato nella prima posizione dell’insieme considerato
• si eseguono 𝑛 + 𝑛 − 1 + 𝑛 − 2 + ⋯ + 2 ≈ 𝑛2 operazioni
Esempio: ordinamento
• Analisi del caso migliore
• Il caso migliore per l'algoritmo è quello in cui la sequenza di partenza sia
già ordinata, poiché non bisogna effettuare alcuno scambio
• Analisi del caso peggiore
• Il caso peggiore è invece quello in cui la sequenza di partenza sia ordinata
al contrario, poiché ad ogni iterazione si dovrà effettuare uno scambio
Linguaggi di programmazione
• Notazioni formali per descrivere algoritmi
• Dotati di un alfabeto, un lessico, una sintassi ed una semantica
• Alfabeto
• Insieme di simboli costituiti da caratteri

• Lessico
• Insieme di regole formali per la scrittura di insiemi di simboli dell’alfabeto, detti parole
• Crea il vocabolario, fatto di parole leggibili e comprensibili per chi le usa

• Sintassi
• Insieme di regole formali per la scrittura di frasi in un linguaggio, che stabiliscono la grammatica del
linguaggio stesso
• Semantica
• Insieme dei significati da attribuire alle frasi (sintatticamente corrette) costruite nel linguaggio
Linguaggio macchina
• Linguaggio più semplice, direttamente compreso dalla CPU
• Stretto legame con l’hardware
• Alta velocità di esecuzione ed ottimizzazione nell’uso delle
risorse hardware
• Non c’è portabilità dei programmi tra processori differenti
• Un programma scritto per una CPU non è eseguibile da una CPU con
caratteristiche diverse
• Difficoltà di programmazione
• Gran numero di comandi per singole istruzioni
• Istruzioni espresse sotto forma di sequenze di bit!!!
Codifica delle istruzioni in linguaggio macchina
• Le istruzioni che un processore è in grado di eseguire sono rappresentate mediante un codice
binario definito dal cosiddetto linguaggio macchina del processore

• Codifica in linguaggio macchina delle istruzioni 0100000001100110


• codice operativo
• modo di indirizzamento
• operandi
codice operativo operando/i
modo di indirizzamento

• La maggior parte dei codici operativi prevede 0, 1, 2 o (raramente) 3 operandi


• Semplificando molto, il modo di indirizzamento consente di distinguere tra operandi costanti,
operandi contenuti in registri del processore e operandi contenuti in locazioni di memoria
24
Istruzione in Linguaggio Macchina
• Concettualmente il linguaggio macchina è una quadrupla:
• i = (Cop, Pdi, Pdo, Pis)
• in cui:
• Cop è il codice operativo, ossia il codice che indica alla CU della CPU
l’operazione da compiere;
• l’insieme dei Cop prendere il nome di repertorio di istruzioni e dipende dalla specifica CPU;
• Pdi sono i puntatori ai dati che servono per svolgere l’operazione Cop detti
anche di input;
• esistono istruzioni che non hanno operandi di input;
• Pdo sono i puntatori ai dati prodotti dall’operazione Cop detti anche di output;
• esistono istruzioni che non hanno operandi di output;
• Pis è il puntatore all’istruzione da svolgere al termine dell’esecuzione di quella
corrente
Esempio di programma allocato in memoria
Linguaggi assemblativi
• Sostituiscono alle sequenze di bit dei codici mnemonici più facili
da interpretare e ricordare
• Mantengono uno stretto legame con le potenzialità offerte dal linguaggio
macchina
• I linguaggi macchina e assemblativi sono detti linguaggi di basso
livello
• Si pongono al livello della macchina comunicando direttamente con la
CPU
• Utilizzano codici operativi (binari o mnemonici) dello stesso processore
• Comportano difficoltà di scrittura e di verifica del corretto funzionamento
dei programmi
Linguaggi ad alto livello
• Fanno uso di istruzioni più sintetiche e vicine al tradizionale modo di
esprimere i procedimenti di calcolo da parte di un essere umano
• Pseudo-linguaggio umano basato su parole chiave o codici operativi ispirati quasi
esclusivamente alla lingua inglese
• Rendono l’attività di programmazione più semplice
• Necessitano di un “interprete” per la traduzione in reali istruzioni interpretabili
dalla CPU
• Ciascuna CPU ha il suo traduttore o interprete per garantire che lo stesso programma sia
eseguito da macchine diverse
• L’assemblatore traduce i codici mnemonici del linguaggio assemblativo con le sequenze di
bit corrispondenti comprensibili dalla CPU
Esempio: Codice Macchina vs Codice Assembly
Paradigma di programmazione
• Corrisponde al modo di intendere i concetti di programma e di programmazione
• Permette di classificare i linguaggi ad alto livello

Linguaggi di programmazione

Imperativi Dichiarativi

Procedurali Ad oggetti Paralleli Funzionali Logici

C++, Java,
C, Pascal,
Objective C, Occam Lisp Prolog
Fortran
C#
Linguaggi imperativi
• Il problema viene risolto mediante una sequenza ordinata di passi
• Sono fortemente legati al modello di Von Neumann (lo vedremo nelle prossime lezioni)

• Programmazione procedurale
• Permette di descrivere le operazioni in blocchi di codice detti sottoprogrammi

• Programmazione ad oggetti
• Consente la modellazione del problema come un insieme di oggetti che si scambiano
messaggi
• Gli oggetti sono istanze di tipi di dato astratto (le classi) definiti dal programmatore

• Trasversale
• Esistono linguaggi funzionali e logici ad oggetti, anche se è molto più frequente trovare linguaggi imperativi ad
oggetti

• Programmazione parallela
• Permette di descrivere formalmente algoritmi non sequenziali
Linguaggi dichiarativi
• Paradigma orientato al problema, cioè a cosa il programma deve fare per
risolvere un dato problema
• Programmazione funzionale
• Consiste nella valutazione di espressioni e nella combinazione di funzioni matematiche per
generare funzioni più potenti
• Programmazione logica
• Permette di descrivere la struttura logica del problema mediante definizioni ed
affermazioni, piuttosto che il modo di risolverlo
• L’esecuzione del programma consiste nell’utilizzare le informazioni ricevute per rispondere
alle interrogazioni dell’utente utilizzando regole di deduzione della logica classica
Elementi lessicali
• Un programma, scritto in un qualsiasi linguaggio di programmazione, prima di
essere eseguito viene sottoposto ad un processo di traduzione
• Lo scopo di questo processo è quello di tradurre il programma originale
(codice sorgente) in uno semanticamente equivalente, ma eseguibile su una
certa macchina
• Il processo di traduzione è suddiviso in più fasi, ciascuna delle quali volta
all'acquisizione di opportune informazioni necessarie alla fase successiva
Elementi lessicali
• La prima di queste fasi è nota come analisi lessicale ed ha il
compito di riconoscere gli elementi costitutivi del linguaggio
sorgente, individuandone anche la categoria lessicale
• Ogni linguaggio prevede un certo numero di categorie lessicali e in
C/C++ possiamo distinguere in particolare le seguenti categorie:
• Commenti
• Identificatori
• Parole riservate
• Costanti letterali
• Segni di punteggiatura e operatori
Traduzione dei programmi
¡ Per essere eseguito da una CPU, un Editor

algoritmo deve essere espresso in linguaggio prog.c


macchina
§ insieme di istruzioni che la CPU comprende Compilatore
▪ sequenze di bit

¡ C e C++ sono linguaggi di alto livello prog.o

§ la loro potenza espressiva è superiore a quella del


linguaggio macchina
§ sono stati pensati per aiutare i programmatori
¡ Per tutti i linguaggi di programmazione esiste
§ una grammatica
§ il programma di traduzione in linguaggio macchina
Traduzione dei programmi
Editor
¡ Compilazione
§ la traduzione avviene una volta sola prog.c
▪ velocità di esecuzione
▪ il programma dipende strettamente dalla CPU per la quale è Compilatore
stato prodotto
§ ad esempio, Fortran e C/C++ prog.o

¡ Interpretazione
§ la traduzione avviene ogni volta che il programma viene
eseguito
▪ tempi più lunghi
▪ maggiore portabilità
§ ad esempio, Python e PHP
Compilazione dei programmi
Editor
¡ Nell’approccio per compilazione la sola
traduzione non è sufficiente a rendere il prog.c
programma «eseguibile» dalla CPU
Compilatore
§ Servono delle funzionalità raccolte in librerie
▪ Interazione con il sistema operativo
prog.o
▪ Gestione dell’I/O lib.a
¡ Linker funz.o
Linker

§ assembla tutti gli oggetti e librerie necessari per


prog.out
generare un programma che sia eseguibile dalla CPU
Compilazione dei programmi
Editor
¡ Loader o Caricatore
§ carica in memoria il programma prog.c

§ attiva il programma
Compilatore
¡ Il suffisso dei file dipende dal sistema operativo
§ Windows § Unix prog.o

▪ lib.a
Sorgente: .c / .cpp ▪ Sorgente: .c / .cpp
Linker
▪ Oggetto: .obj ▪ Oggetto: .o funz.o
▪ Libreria: .lib ▪ Libreria: .a
prog.out
▪ Eseguibile: .exe ▪ Eseguibile: .out
Compilazione dei programmi
Editor
¡ Ambienti di sviluppo integrato (IDE)
§ In essi sono presenti funzionalità per prog.c

▪ scrivere e modificare codice sorgente (editor)


Compilatore
▪ tradurre il codice sorgente (compilatore)
▪ generare l’eseguibile (linker)
prog.o
▪ effettuare il debugging
lib.a
§ Tipicamente fanno da front-end verso compilatori a Linker
funz.o
linea di comando
▪ ad esempio gcc e g++, che sono pienamente compatibili prog.out

con gli standard ANSI C e ANSI C++

Potrebbero piacerti anche