Simonini Matilde Ingegneria Informatica anno 2022/2023
Linguaggi di programmazione
Che cosa è un linguaggio di programmazione?
Def : “Un LP è uno strumento di astrazione che permette di specificare computazioni tali da poter essere eseguite su un
elaboratore”. astrae
Il linguaggio di programmazione dalla macchina fisica su cui verrà effettivamente eseguito il programma.
Si avrà ovviamente bisogno di un compilatore che traduca in linguaggio macchina il linguaggio di programmazione.
Esistono migliaia di LP, ognuno progettato in modo da soddisfare certi requisiti.
Al di là della grande varietà di linguaggi ci sono due requisiti che tutti i LP devono rispettare.
Il progettista di un LP deve bilanciare due requisiti fondamentali: adatto
1. Computazione espressa convenientemente per la persona: il linguaggio deve essere per chi scrive il
permettere di scrivere le cose come le persone le hanno sempre viste
programma. Devono in sostanza .
ergonomia
Si tratta di un requisito di .
2. Uso efficiente degli elaboratori. troppo
Il problema è che se un linguaggio fosse di alto livello, potrebbe essere inefficiente dal punto di vista
dell’esecuzione: questo viene evitato dal secondo requisito.
Si tratta di due requisiti controvarianti, per i quali è necessario trovare un equilibrio.
Noi dedicheremo metà del corso alla specifica di un linguaggio e la seconda metà verrà dedicata ai diversi paradigmi di
programmazione.
Verso LP di alto livello
I LP sono stati inventati per rendere l’uso degli elaboratori (macchine) facile.
Si tratta di un termine informale di livello utile per una distinzione di massima dei LP.
I linguaggi possono essere distinti in base al loro livello di astrazione.
Linguaggio macchina: basso livello (pieno di dettagli che hanno a che fare più con il modo con cui funziona la macchina
che con l’oggetto della computazione).
Non è stato specificato per un particolare ambito applicativo → general-purpose.
LP progettati in modo da essere:
→
֎ alto livello indipendente dalla macchina
→
֎ general-purpose applicabile ad un ampio dominio
Alto livello e general-purpose sono due concetti differenti.
Sono due ulteriori requisiti da rispettare.
Linguaggi come Java e C sono di alto livello e general-purpose, ossia non sono stati creati per nessuno specifico
dominio.
Un esempio di linguaggio di alto livello e special-purpose è prolog, che vedremo in seguito.
Si noti che più è stretto il dominio di applicazione e più il linguaggio è efficiente.
La storia evolutiva dei LP verso l’alto ha inizio con la definizione di un linguaggio simbolico (mnemonico) da tradurre
manualmente. scattata
L’evoluzione dei linguaggi è quando, programmando in esadecimale, ci si rese conto di poter dare dei nomi alle
variabili e alle operazioni per semplificare la programmazione. Questo richiedeva ovviamente la successiva traduzione,
da parte dello stesso programmatore, delle istruzioni in esadecimale.
Da questa idea è nato il linguaggio assembly, per il quale la traduzione in linguaggio macchina avviene in maniera
automatica (programmazione automatica).
I LP di alto livello hanno sostituito il linguaggio Assembly virtualmente in tutte le aree della programmazione, poiché:
1. Notazione:
familiare
leggibile 1
Simonini Matilde Ingegneria Informatica anno 2022/2023
2. Indipendenti dalla macchina (portabilità)
3. Disponibilità di librerie di programmi
→
4. Permettono analisi del programma supporta l’individuazione di errori (affidabilità = il più importante
requisito di un software)
Programmazione scientifica
FORTRAN (FORmula TRANslation): permetteva di scrivere espressioni matematiche in modo naturale (IBM 704).
È stato il primo linguaggio di alto livello progettato nella storia. L’obiettivo dei progettisti era quello di specificare in
modo naturale le formule matematiche.
L’obiettivo era ristretto ad una particolare macchina, ossia IBM 704.
L’idea geniale della progettazione di questo linguaggio risiede nel fatto che l’espressione può essere vista come un
algoritmo e per la quale è possibile derivare un albero delle espressioni.
Le istruzioni che realizzano l’istruzione si basano sull’albero → si parte dalle foglie e il valore associato alla radice
dell’albero è il risultato dell’espressione stessa.
Prima che venisse effettivamente creato il linguaggio si pensava che fosse irrealizzabile o comunque inefficiente,
opinioni smentite una volta concluso lo sviluppo del linguaggio.
È importante, in un linguaggio, specificare la priorità delle espressioni, cosa che consente di costruire un albero delle
espressioni.
Se avessimo − + ci si si chiede a chi si deve dare la priorità → per questo entrano in gioco le regole di associatività.
Con le regole di associatività e di precedenza siamo, in generale, in grado (data un’espressione) di risalire all’albero
dell’espressione.
CASO: () + ()
Si tratta del caso in cui potrebbe variare il valore di e → è necessaria un’ulteriore specifica: ordine di valutazione
degli operandi.
Questi temi verranno trattati nella parte del programma dedicata alle espressioni.
Paradigmi
Ogni LP supporta uno stile di programmazione paradigma di programmazione.
Di linguaggi ce ne sono molti ma spesso non sono tanto diversi fra loro → obbediscono agli stessi paradigmi, mentre
linguaggi che sono molto diversi → obbediscono a paradigmi diversi.
Def: “LP che suggerisce un particolare paradigma si dice orientato al paradigma”.
Un LP può avere diversi paradigmi: si assume che ogni ellisse sia un paradigma diverso e i puntini
facciano riferimento ad un linguaggio. Come si può notare dall’immagine esistono linguaggi multi-
paradigma (puntini che risiedono nell’intersezione fra due o più ellissi), ossia orientati a più
paradigmi; un esempio è rappresentato dal linguaggio C++.
Def: “Un LP che supporta diversi paradigmi si dice ibrido” (C++).
Quando:
Astrazioni del design direttamente mappabili sui componenti del programma → ossia quando il design e il linguaggio di
programmazione si fondono sullo stesso paradigma.
→
Altrimenti: scollamento aumento del costo della codifica.
2
Simonini Matilde Ingegneria Informatica anno 2022/2023
Programma deve implementare:
⇒ soluzione del problema
⇒ concetti del paradigma
1. Programmazione imperativa
Programma = sequenza di passi.
È il primo tipo di programmazione inventato.
Ad ogni passo:
➢ lettura input
➢ computazione
➢ scrittura output
L’unico meccanismo di astrazione: procedura (istruzione "complessa") → viene chiamata e utilizzata più volte.
Permette di fattorizzare il codice.
Costrutti fondamentali:
o assegnamenti
o sequenze
o istruzioni
o condizionali
o cicli assegnamento
L’elemento fondamentale della programmazione imperativa è l’ .
Esempio: il linguaggio C è un linguaggio di programmazione che segue il paradigma della programmazione imperativa.
2. Programmazione orientata agli oggetti
Programma = collezione di oggetti che interagiscono passandosi messaggi che trasformano il loro stato.
Costrutti fondamentali:
modellazione degli oggetti
classificazione
ereditarietà
Esempi: Smalltalk, C++, Java, C#, Ruby.
Di fatto tutti i linguaggi moderni sono orientati agli oggetti.
3. Programmazione funzionale
Programma = collezione di funzioni matematiche
Di base formale non ha una macchina fisica ma una formula matematica.
L’idea è che si definisce un programma come una lista di funzioni che mappa un insieme di oggetti che stanno in un
dominio in un insieme di oggetti che stanno nel codominio.
Ogni funzione ha:
• Dominio
• Codominio
Costrutti fondamentali:
o Composizione
o Condizioni
o Ricorsione: funzione che richiama sé stessa (ricorsione diretta), funzione che chiama altre funzioni che
richiamano la stessa di partenza (ricorsione indiretta)
Non esistono:
Variabili 3
Simonini Matilde Ingegneria Informatica anno 2022/2023
Assegnamenti
Istruzioni di controllo lazy
Si possono creare delle liste infinite: vengono generati solo gli elementi utili in quel particolare momento (
evaluation = si fa qualcosa solo se necessario).
Esempi: Lisp, Scheme, ML, Haskell.
Il Lisp è stato il primo linguaggio funzionale, nato poco dopo il Fortran.
Haskel è più moderno e permette l’uso di strutture dati infinite.
4. Programmazione logica
Programma = collezione di dichiarazioni logiche su cosa una certa funzione deve computare piuttosto che sul come.
Anche questo fa riferimento ad una teoria matematica: logica del primo ordine → si definiscono dei predicati.
L’esecuzione: applica le dichiarazioni per trovare possibili soluzioni al problema. Non viene eseguito come un
programma classico dall’inizio alla fine.
Tipicamente: problemi risolvibili mediante "tentativi".
La programmazione logica è quella adatta per formulare problemi esprimibili attraverso vincoli. Ad ogni tentativo si
evita di ripercorrere le strade già fatte.
Backtracking: ritorno sui propri passi per percorrere una strada alternativa.
Nondeterminismo: soluzione del problema non unica → quando l’interprete fornisce un risultato si può interrogare
l’interprete per verificare se ne è presente un altro.
Esempio: Prolog.
LP ed architettura degli elaboratori
Doppia influenza sui LP (il linguaggio deve essere di alto livello ; il programma deve essere efficiente):
→
Metodi di design requisiti sul LP in modo da supportare meglio lo sviluppo (design) del sw.
→
Architettura degli elaboratori requisiti sul LP in modo che possa essere implementato efficientemente sulle
macchine correnti (architettura di Von Neumann)
Nonostante le macchine si siano evolute, mantengono l’architettura di Von Neumann.
Sappiamo sostanzialmente che questa è fatta da: memoria, CPU.
Architettura della macchina di Von Neumann
CPU: preleva una istruzione alla volta dalla memoria
→
Esecuzione di una istruzione prelievo di dati dalla memoria
+ manipolazione dei dati + copiatura dei risultati nella
memoria ⇒ Transizione di stato della macchina.
La CPU preleva dalla memoria un’istruzione alla volta. L’operazione
di lettura ed esecuzione, che cambia un valore nella memoria
prende nome di transizione di stato della memoria.
modello computazionale
Il assomiglia ad un automa. 4
Simonini Matilde Ingegneria Informatica anno 2022/2023
I linguaggi di programmazione imperativi fanno esattamente questo ma in maniera più astratta.
⇒ LP convenzionali (imperativi): visti come astrazione di una architettura di Von Neumann.
Astrazione:
evidenzia gli aspetti rilevanti
ignora i dettagli
Modello computazionale di un LP imperativo = esecuzione sequenziale di istruzioni, ognuna delle quali cambia lo stato
della computazione mediante la modifica dei valori di un insieme di variabili.
Un linguaggio imperativo compie le stesse operazioni svolte dalla macchina di Von Neumann ma in maniera più
astratta: il controllo e il modo di operare sono uguali.
Ad esempio una variabile, e in particolare il suo nome, è un’astrazione della cella di memoria.
Nel linguaggio di astrazione lo stato è l’insieme dei valori del programma, mentre nella macchina sono i contenuti delle
celle di memoria.
Storicamente: LP si sono evoluti verso livelli di astrazione crescenti.
Anche un linguaggio ad oggetti opera in questo modo.
Abbandono del modello computazionale di Von Neumann
I linguaggi di programmazione si sono evoluti molto e sono passati ad avere come riferimento delle teorie matematiche
e non più una macchina.
Sono quindi definiti in modo autonomo con delle basi matematiche.
Può succedere che per rendere il linguaggio efficiente, nonostante sia di livello molto alto, si introducono al suo interno
degli elementi imperativi, facendolo così diventare di fatto ibrido.
Qualità dei LP si devono analizzare i suoi risultati
Poiché un LP è uno strumento, per comprenderne la qualità , i suoi effetti.
Si devono quindi guardare i software che possono essere prodotti con tale LP: sw di qualità ⇒ LP di qualità.
Si parte quindi ad analizzare i requisiti di qualità del sw.
Si vuole capire se le caratteristiche dell’LP in esame supportano le caratteristiche dell’sw considerato.
Requisiti di qualità del sw:
Affidabilità
Manutenibilità
Efficienza: si fa riferimento sia alla potenza (velocità di esecuzione) che al consumo (minimizzare l’utilizzo
delle risorse) software engineering
Questi requisiti non sono solo affidati al linguaggio di programmazione ma anche ad esempio al ,
ossia al modo in cui viene progettato il sw.
Requisiti di qualità soddisfacibili mediante:
o metodi di sviluppo del sw
o tools di supporto allo sviluppo del sw
o particolari caratteristiche del LP → noi ci concentriamo su questo
Requisiti di qualità del sw 5
Simonini Matilde Ingegneria Informatica anno 2022/2023
1. Affidabilità
Il sw deve rispettare i suoi requisiti in ogni circostanza → questo è importante in quanto un sw viene utilizzato in
ambienti sempre più critici, si pensi al controllo e analisi in una centrale nucleare.
Idealmente tollerante ai guasti:
hw
sw
Importanza crescente, perché sw sempre più usato in ambienti critici:
֎ Impianti nucleari
֎ Navicelle spaziali
֎ Telecomunicazioni
֎ Strumentazione chirurgica
֎ Diagnosi medica
֎ Mercato finanziario
֎ ... (AI = Artificial Intellingence)
Bisogna fare in modo che tutte le tecnologie basate su intelligenza artificiale vengano controllate.
Si potrebbe arrivare a situazioni in cui una macchina, dotata di intelligenza artificiale sia in grado di creare un
programma più potente di essa stessa, che a sua volta ne può creare un altro → si vuole impedire uno sviluppo continuo
di questo tipo.
2. Manutenibilità
Possibilità di intervenire sul sw esistente, senza buttare quanto già fatto, per soddisfare nuovi requisiti, poiché:
sw sempre più costoso e sistemi sempre più complessi (non si può gettare)
Impossibile catturare tutti i requisiti reali “al primo colpo”
3. Efficienza
Dipende da:
hw
LP
Algoritmi
Questo vuol dire che se l’hw è più potente si ha una maggiore efficienza in generale.
A parità di hw si ha che anche le applicazioni diventano più esigenti.
A parità di LP, ciò che può fare la differenza sono gli algoritmi → un problema può essere risolto con algoritmi differenti
per ottenere efficiente completamente diverse.
Esempio: calcolo dei numeri di Fibonacci
0,1, 1, 2, 3, 5, 8, 13, …
Dove:
() = 0 se = 0
() = 1 se = 1
() = ( − 1) + ( − 2)
Proviamo a calcolare quanti passi ricorsivi sono necessari, seguendo l’algoritmo, per calcolare (5) → 15.
Il numero di chiamate cresce molto all’aumentare del numero e questo perché una chiamata ricorsiva viene effettuata
ridondanza di chiamate
più volte → c’è quindi una .
LP e affidabilità
Ci si chiede quali sono le particolari caratteristiche di un linguaggio che possono supportare l’affidabilità di un sw:
Scrivibilità 6
Simonini Matilde Ingegneria Informatica anno 2022/2023
Leggibilità
Semplicità
Sicurezza
Robustezza
Il problema è che tutte le caratteristiche sono:
Soggettive → “per me quello che scrivo è molto leggibile ma per te no”.
Qualitative
Non indipendenti (correlate) → alcune
In conflitto → alcune
1. Scrivibilità
Def: “Misura di quanto facilmente un LP può essere usato per scrivere un programma relativo ad un certo dominio
applicativo”.
Il linguaggio deve essere il più possibile vicino alla mentalità del programmatore.
Non ha senso confrontare LP1 e LP2 in un dominio per il quale LP1 è stato progettato, mentre LP2 no!
→ →
Esempio: FORTRAN scientifico; COBOL gestionale. problem solving
Principio di scrivibilità: programmatore concentrato sul , senza essere distratto dai dettagli/trucchi del
LP → LP di alto livello più scrivibili dell’Assembly.
2. Leggibilità
Def: “Misura della possibilità di seguire la logica del programma leggendolo”.
Fatto storico (22 luglio 1962): Razzo contenente la sonda Mariner I diretta verso Venere viene distrutto dopo 290
secondi dal lancio perché stava uscendo dall’orbita.
La missione è fallita per un piccolo problema sw:
Il programma era quindi bacato, nonostante fosse stato utilizzato altre volte in precedenza per lanci lunari.
Questo problema è dato dal fatto che chi ha controllato il codice, scritto da altri, non è riuscito a identificare l’autore.
Gli scienziati NASA hanno cercato di spiegare l’errore ad una commissione d’indagine.
Tecniche di verifica/convalida:
Ispezione del codice fatta da altri ← Leggibilità
Codice testato (300 esecuzioni di test)
Osservazione: Supporto alla leggibilità = Def: operazioni e tipi di dati separati da un punto d’uso.
3. Semplicità
Def: “Grado di riduzione del numero di costrutti del LP”. 7
Simonini Matilde Ingegneria Informatica anno 2022/2023
numero di costrutti limitato
Il linguaggio di p
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Linguaggi di Programmazione - Appunti
-
Appunti Linguaggi di programmazione
-
Linguaggi di Programmazione - Appunti in LaTeX
-
Programmazione I - Appunti