Estratto del documento

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

Anteprima
Vedrai una selezione di 20 pagine su 104
Appunti di Linguaggi di programmazione Pag. 1 Appunti di Linguaggi di programmazione Pag. 2
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 6
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 11
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 16
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 21
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 26
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 31
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 36
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 41
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 46
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 51
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 56
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 61
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 66
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 71
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 76
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 81
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 86
Anteprima di 20 pagg. su 104.
Scarica il documento per vederlo tutto.
Appunti di Linguaggi di programmazione Pag. 91
1 su 104
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher matilde simonini di informazioni apprese con la frequenza delle lezioni di Linguaggi di programmazione e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Brescia o del prof Lamperti Gianfranco.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community