1 Linguaggi di programmazione. 2 Da linguaggio macchina a linguaggio assembly Linguaggi macchina...

Post on 01-May-2015

227 views 0 download

Transcript of 1 Linguaggi di programmazione. 2 Da linguaggio macchina a linguaggio assembly Linguaggi macchina...

1

Linguaggi di programmazione

2

Da linguaggio macchina a linguaggio assembly Linguaggi macchina (prima generazione) Codici operativi mnemonici, identificatori al posto

di indirizzi di memoria, nomi per i registri All’inizio, solo su carta e poi traduzione in

lunguaggio macchina Poi, traduzione automatica (programma

assemblatore) Linguaggi assembly (seconda generazione)

3

Linguaggi assembly

Dipendenti da Numero dei registri Istruzioni del linguaggio macchina

Non trasportabili su un altro calcolatore Descrizione di un algoritmo con primitive che

rappresentano passi molto piccoli Meglio primitive piu’ ad alto livello, e poi

traduzione in concetti piu’ dettagliati

4

Linguaggi di terza generazione Es.: FORTRAN (FORmula TRANslator), COBOL (COmmon

Business Language) Insieme di primitive ad alto livello, ognuna traducibile in una

sequenza di primitive in linguaggio macchina Es.: pesolordo pesocarico + pesoveicolo Due load, una add, una store

Programma traduttore (compilatore): traduce il programma in linguaggio macchina

Interprete: traduce ogni primitiva ed esegue subito le primitive corrispondenti del l.m., senza memorizzare la traduzione

Trasportabili da una macchina all’altra, basta cambiare compilatore

5

Paradigmi di programmazione

Imperativo (procedurale): programma = sequenza di comandi che descrive un

algoritmo pensato dal programmatore Es.: pseudocodice, linguaggio macchina, Pascal, C

Dichiarativo: Basta descrivere il problema e non il suo algoritmo Algoritmo generale per risolvere i problemi Ambiti ristretti o linguaggi basati su logica matematica

(programmazione logica, Prolog)

6

Paradigma funzionale

Funzioni, con ingresso e uscita Connesse in modo da costruire funzioni

complesse a partire da funzioni elementari Es.: media di una lista di valori

Somma: dato un elenco di valori, genera la somma Conta: data una lista di valori, gnera il loro numero Dividi: dati due valori, genera il quoziente della loro

divisione In LISP: (dividi (somma numeri) (conta numeri))

7

8

Paradigma orientato agli oggetti

Dati associati a procedure per gestirli (oggetti)

Es.: elenco di nomiProcedure per inserire un nuovo nome,

eliminarne uno, vedere se l’elenco e’ vuoto, ordinare l’elenco, ...

Un programma accede all’elenco e usa le sue procedure per gestirlo

9

Paradigma orientato agli oggetti

Es.: interfaccia grafica Icone: oggetti, con procedure che vengono attivate da

eventi (clic del mouse, ...) Ogni oggetto e’ un’entita’ autonoma

Costruzione modulare del software Comunicazione tra oggetti tramite messaggi Adatta al sistema client-server Ogni procedura: programma imperativo C++: C con funzionalita’ orientate agli oggetti

10

Cronologia dei paradigmi

11

Concetti dei programmi imperativi

Tre categorie di istruzioni: Istruzioni dichiarative: dichiarano i nomi usati

nel programma, di solito all’inizio Istruzioni imperative: passi dell’algoritmoCommenti: spiegano i passi del programma

12

Variabili e tipi

Nomi che indicano una cella di memoria Cambiando il valore in una posizione di

memoria, cambia il valore associato al nome variabile

Dichiarazione di una variabile e del tipo di dato che sara’ memorizzato nella posizione di memoria associata alla variabile

Es.: tipo intero (integer), reale (real o float), ... Operazioni diverse su tipi diversi (es. ADD e

FADD)

13

Variabili e tipi

Es.: LimitePeso variabile con valore interoC, C++, Java, C#: int LimitePeso;

Es.: FineDellaLista variabile con tipo booleano (vero o falso)

Tipi usati per selezionare le operazioni giuste e per scoprire erroriEs.: somma di due variabili di tipi carattere

14

15

Strutture dati Variabili come nomi per dati o strutture dati

vari dati organizzaties: una lista di numeri o una matrice di nomi

Array omogeneo: blocco di valori dello stesso tipo Lista monodimensionaleTabella bidimensionale con righe e colonneTabella multidimensionale

Per creare un array: nome, lunghezza delle dimensioni Es.: (C)

int Punteggio[2] [9]; In FORTRAN: INTEGER Punteggio(2,9)

16

Accesso ad un array Nome per l’intero array Nome + indici (tanti quante le dimensioni) per un singolo

elemento Linguaggi diversi hanno diversi valori iniziali degli indici Es.: per elemento in riga 2 e colonna 4:

In C: Punteggio[1][3] In FORTRAN: Punteggio(2,4)

Flessibilita’ nell’intervallo degli indici Es. (Pascal):

Punteggio: array [3..4,12..20] of integer;Elemento in seconda riga e quarta colonna: Punteggio[4,15]

17

Array eterogeneo (record)

Blocco di dati di tipo possibilmente diverso Es.: Dipendente

Nome, tipo carattere Eta, tipo intero Valutazione, tipo reale

Accesso tramite nome del campo e non indice Es.: Dipendente.Eta

18

19

Costanti

Nome associato ad un valore costante Es.:

Ada: Max constant Integer := 200; Java: final int Max = 200; C++ e C#: cost Max = 200;

Uso della costante: A < Max

Se si vuole modificare il massimo, basta cambiare la dichiarazione della costante

20

Istruzioni di assegnamento

Mette un valore nell’area di memoria associata ad una variabile

Es. (C, C++, C#, Java) Z = X + Y;

Ada, Pascal Z := X + Y;

APL Z X + Y

21

Espressione nell’assegnamento

Qualunque espressione algebrica, con +, -, *, / ES.: 2*4+6/2

7 se valutata da sinistra a destra, 14 se da destra a sinistra

Precedenza degli operatori (prima * e /, poi + e -) 11

Parentesi nei linguaggi Es.: 2*(4+6)/2 10

22

Istruzioni di controllo

Passi elementari dell’algoritmo Istruzione goto: salto incondizionato Pericolosa in un linguaggio ad altro livello Genera programmi difficili da capire,

modificare e correggere

23

Esempio di goto

goto 4020: Applica la procedure Scappa goto 7040: If (livello < max) then goto 60 goto 2060: Applica la procedura Salva70: ...

24

Esempio di goto

Programma equivalente:

If (livello < max)

then (applica la procedura Salva)

else (applica la procedura Scappa)

25

Strutture di controllo (C, C++, C#, Java)

26

Strutture di controllo (C, C++, C#, Java): case

27

For Il corpo del ciclo viene eseguito un numero

fissato di volte, per tutti i valori di una variabile intera (contatore) in un certo intervallo

28

Esempio di for in vari linguaggi

29

Procedure

Programma + nome, che puo’ essere eseguito in vari posti del programma

Chiamata o attivazione di procedura Programma chiamante e chiamato La chiamata fa iniziare l’esecuzione della

procedura chiamata e sospende l’esecuzione del programma chiamante

Alla fine, si ritorna all’esecuzione del programma chiamante

30

Programma chiamante e procedura chiamata

31

Procedure

Una procedura e’ fatta come un programma: dichiarazioni e istruzioni

Variabili dichiarate nella procedura: variabili locali Usabili solo all’interno di quella procedura

32

Parametri

Le procedure sono scritte usando parametri generici (formali)

Al momento della chiamata si dicono i dati su cui eseguire la procedura (parametri attuali)

Es.: procedure Ordina(Lista)Lista puo’ essere una lista di nomi, o un

elenco di numeri telefonici, ...

33

Esempio di procedura in C

Es. di chiamata: ProjectPopulation(0.03)

34

Passaggio dei parametri

Trasferimento dati tra parameri attuali e formali

Un modo (passaggio per valore): duplicato dei parametri attuali, passato alla procedura modifiche fatte dalla procedura non si riflettono sui dati del programma chiamante

35

36

Passaggio dei parametri

Parametri di grandi dimensioni non efficiente fare un duplicato accesso diretto ai dati del programma chiamante (passaggio per riferimento)

La procedura puo’ modificare i dati del programma chiamante

Es.: Ordina(Lista)

37

38

EsercizioProcedura: Procedure Modifica(Y) Y 7; Stampa(Y).Programma chiamante: X 5; Modifica(X); Stampa(X).

Parametro passato per valore: 7, 5 Parametro passato per riferimento: 7, 7

39

Funzioni Scopo di una procedura: eseguire vari comandi Scopo di una funzione: calcolare un valore Una funzione passa questo valore all’unita’ chiamante Es.: nel programma chiamante:

A = Somma(Lista);Somma calcola la somma dei valori nella listaOppure: if (A < Somma(Lista)) then ...

Dichiarazione: nome + parametri + tipo del risultato Istruzione che calcola il risultato (es.: return)

40

Esempio di funzione (C)

Float volumecilindro(float raggio, float altezza);{float volume;volume = 3.14 * raggio * raggio * altezza;return volume;}

Uso nel programma chiamante:Costo = costounitario * volumecilindro(3.45,12.7);

41

Input/output

Le procedure piu’ usate sono predefinite Ad esempio quelle di input/output Es. (Pascal)

Readln(Valore) legge dalla tastiera e lo assegna alla variabile Valore

Writeln(Valore) visualizza sullo schermo il valore della variabile Valore

In C: scanf e printf

42

Traduzione

Traduzione di un programma da un linguaggio ad un altro

Da programma sorgente a programma oggetto

Tre fasi: Analisi lessicaleAnalisi sintattica (parsing)Generazione di codice

43

Fasi della traduzione

44

Analisi lessicale

Da programma come stringa di caratteri a sequenza di entita’ (ognuna una stringa di caratteri)

Es.: 154 vano visti come una singola entita’, un numero

Unita’ singole (token): numeri, parole chiave, nomi di comandi, identificatori, ...

45

Analisi sintattica

Input: sequenza di token Raggruppa i token in istruzioni Aiuto: parole chiave per indicare l’inizio delle

istruzioni, punto e virgola per la fine, ... Regole per definire la sintassi di un linguaggio Diagrammi sintattici per definire le regole

46

Diagramma sintattico per if-then-else

47

Diagrammi sintattici per le espressioni

48

Albero sintattico per x+(y*z)

•Fa vedere come una stringa di tokens rispetta le regole•Analisi sintattica: costruisce l’albero sintattico del programma sorgente

49

Generazione del codice

Da istruzioni generate dall’analisi sintattica a istruzioni in linguaggio macchina

Anche ottimizzazione del codice

50

Programmazione orientata agli oggetti Oggetto: dato + procedure che agiscono

sul dato Esempi in C++, Java, C#

51

Esempio

Videogioco: dobbiamo proteggere la terra da alcune meteore sparando con un laser

Il laser ha una sorgente di alimentazione interna, limitata

Ogni volta che il laser spara, consuma parte della sua energia

Quando l’energia finisce, il laser non puo’ piu’ sparare Il laser deve poter rispondere a comandi per puntare

a destra, a sinistra, e per ativare il raggio laser

52

Esempio

Ogni laser e’ un oggetto con Valore della potenza rimasta Procedure per modificare la direzione e sparare

Classe per descrivere un laser generico Sintassi (C++, Java, C#):

Class Nome

{ ...}

53

Esempio

classe Laser{ int Potenzarimasta = 100; void puntadestra ( ) {...} void puntasinistra ( ) {...} void fuoco ( ) {...}}

54

Esempio

Qualsiasi oggetto creato secondo lo schema della classe Laser contiene:Una variabile intera PotenzarimastaTre procedure (metodi) puntadestra,

puntasinistra, fuoco Oggetto: istanza di una classe

55

Esempio

Nel programma, tre variabili L1, L2, L3 di tipo Laser

Sintassi: Laser L1, L2, L3; Vengono creati tre oggetti secondo lo schema

della classe Laser Per far sparare il laser 1: L1.fuoco(); Per far spostare a sinistra il laser 2:

L2.puntasinistra();

56

Programmazione dichiarativa

Algoritmo generale basato sulla logica formale

Es.: Carlo e’ al lavoro o e’ ammalatoCarlo non e’ al lavoro Carlo e’ ammalato

Risoluzione

57

Simboli A e not(A), OR, AND, (per implicazione): asserzioni Risoluzione:

P OR QR OR not(Q)P OR R

Se (P OR Q) e (P OR not(Q)) sono vere, allora (P OR R) veraQ vero not(Q) falso R veroQ falso P vero O R o P sono vere

58

Risoluzione

59

Clausole

Si applica solo ad asserzioni del tipo A OR B (clausole)

Qualunque formula della logica del primo ordine puo’ essere scritta come una clausolaEs.: P Q diventa not(P) OR Q

60

Consistenza

Un insieme di asserzioni e’ inconsistente se non e’ possibile che tutte le asserzioni siano vere

Es.: P e not(P) Usando la risoluzione ripetutamente,

posso scroprire se l’insieme e’ inconsistente: se produco la clausola vuota

61

Esempio di inconsistenza

62

Implicazione

Vogliamo provare che un insieme di asserzioni S implica P

Implicare P equivale a contraddire not(P), cioe’ far vedere che S unito a not(P) e’ inconsistente

Applico la risoluzione a S unito not(P), e vedo se genero la clausola vuota

63

Unificazione

Per applicare la risoluzione a(Carlo e’ un X) OR not(Paolo e’ un X)(Paolo e’ uno studente)

Devo solo fare l’associazione X=studente Il risultato e’ (Carlo e’ uno studente) Unificazione: assegnazione di valori a

variabili

64

Prolog

PROgramming in LOGic: linguaggio di programmazione dichiarativa il cui algoritmo generale e’ basato sull’uso ripetuto della risoluzione

Programma Prolog: insieme di asserzioni S Goal: asserzione P di cui provare l’implicazione Esecuzione del programma: risoluzione ripetuta

applicata a S unito not(P)

65

Asserzioni in Prolog Predicati e argomenti, con valore vero o falso

Es.: genitore(bruno, maria).Vero se bruno e’ genitore di maria

Fatto Prolog: singolo predicato Regola Prolog: implicazione

Es.: saggio(X) :- vecchio(X).Significa: se X e’ vecchio, allora X e’ saggio

Es. regole e fatti: piuveloce(X,Y) :- piuveloce(X,Y), piuveloce(y,z). piuveloce(coniglio, tartaruga).

Programma Prolog: fatti e regole

66

Esempiopiuveloce(tartaruga,lumaca).piuveloce(coniglio, tartaruga).piuveloce(X,Z) :- piuveloce(X,Y), piuveloce(Y,Z).

Goal1: piuveloce(tartaruga, lumaca). OK Goal2: piuveloce(coniglio, tartaruga). OK Goal3: piuveloce(consiglio, lumaca). OK Goal4: piuveloce(X, lumaca). OK se X=tartaruga o

X=coniglio Goal5: piuveloce(coniglio,Z) OK se Z=lumaca Goal6: piuveloce(V,W) Ok se ...

67

Esercizio

Insieme di asserzioni consistente?P OR Q OR Rnot(R) OR QR OR not(P)not(Q)

68

Esercizio

femmina(carla).femmina(susanna).maschio(bruno).maschio(giovanni).genitore(giovanni,carla).genitore(susanna, carla).mamma(X,Y) :- genitore(X,Y), femmina(X).papa(X,Y) :- genitore(X,Y), maschio(X).Goal1: mamma(susanna, carla).Goal2: papa(giovanni,bruno).

69

Esempi su linguaggi

70

1. Leggi n2. Inizializza S a 03. Inizializza I a 14. Esegui S = S+I5. Incrementa I (I=I+1)6. Se I<n torna a 4, altrimenti se I=n esegui 77. Stampa SRichiede n somme O(n)

Efficienza:somma dei primi n numeri 1, ..., n

71

Uso la proprieta’ S = n x (n+1) /21. Leggi n2. Calcola S = n x (n+1)/23. Stampa SUna sola somma, 1 prodotto, 1 divisione: solo 3 operazioni aritmetiche piu’ efficiente (tempo costante)

Secondo algoritmo

72

Main()

{

Int X=10, Y=25, Zero=0;

X=X+Y;

If (X > Zero) Y=X);

}

Esercizio: programma per somma (C++)

73

Esercizio: minimo esponente e tale che 2 alla e superi X (C++)

Main()

{

Int X=10, p=1, e=0;

While (X>p)

{

p=p*2;

esponente++;

}

}

74

main() { Int i; For (i=0;i<10;i++) Printf(“%d\n,i+1); }

Esempio: stampa dei numeri da 1 a 10

75

Function potenza (base: real, esponente: integer): real;Var risultato: real;begin risultato := 1; While (esponente >0) begin Risultato := risultato * base; Esponente := esponente –1; End; Potenza : = risultatoEnd;

Esempio: funzione per xy (in Pascal)

76

Float potenza (float base, int esponente){ Float risultato = 1.0; While (esponente >0) { Risultato = risultato * base; Esponente = esponente –1; } Return risultato;}

Esempio: funzione per xy (in C)

Es. di chiamata: z = potenza(x,3);

77

Esempio (C): inizializzazione a 0 degli elementi di una matrice 20x20

#define Max 20#define zero 0.0;main(){ int i,j; float A[Max][Max]; for (i=0;i<Max;i++) for j=0; j<Max; J++) A[i][j] = zero}

Macro: ogni occorrenza di Max e zero viene sostituita con 20 e 0.0 prima di iniziare a compilare (pre-processore)

78

Esempio (C++): determinare la posizione del massimo in un array di interi (while)

#include <iostream> il pre-processore include la libreria di funzioni iostream main(){ int a[]={10,0,5,-12,45,-9,23}; int i=1, max=A[0], pos_max=0; while (i<7) { if (A[i]>max) { max=A[i]; pos_max=i; } i++; } cout<<‘’Il massimo e’:’’<<max<<‘’ in posizione:’’ <<pos_max<<endI;}

Output standard (video)

Funzione << di scrittura

79

Esempio (C++): determinare la posizione del massimo in un array di interi (for)

#include <iostream>main(){ int a[]={10,0,5,-12,45,-9,23}; int max=A[0], pos_max=0; for (int i=1;i<7;i++) if (A[i]>max) { max=A[i]; pos_max=i; } cout<<‘’Il massimo e’:’’<<max<<‘’ in posizione:’’ <<pos_max<< endI;}

80

Esempio (C): prodotto degli elementi di un vettore di interi

main(){ int num[100]={10,0,5,-12,45,-9,23, ...}; float prod = 1.0; for (i=0;i<100;i++) prod= prod*num[i]; printf(“il Prodotto e’”,prod);}

81

Esempio (C): minimo e massimo di un vettore

main(){ int V[10]={10,0,5,-12,45,-9,23,8,10,9}; int min=max=V[0]; for (i=1;i<10;i++) { if (V[i]<min) min=V[i]; if (V[i]>max) max=V[i]; }}

82

Esempio (C): trovare la posizione di un elemento in un vettore

main(){ int val = 45, pos, i, T[10]={10,0,5,-12,45,-9,23,8,10,9}; pos=-1; i=0; do { if (val ==T[i]) pos=i; i++; }}

Numero di confronti O(n): 1 nel caso migliore, n nel caso pessimo (val non e’ contenuto in T)

83

Esempio (C): trovare la posizione di un elemento in un vettore ordinato – ricerca binariamain( ){ int sn, dx, ct, N=10, val = 45, pos, i, T[10]={10,0,5,-12,45, 9,23,8,10,9}; pos=-1; sn = 0; dx = N-1; do { ct = (sn+dx+1)/2; if (val ==T[ct]) pos = ct; if (val < T[ct]) dx = ct-1 else sn=ct+1; } while (sn<=dx);}

Numero di confronti O(log2(n))

84

Esempio (C++): numero di elementi <0 in un array

main(){ int num=0,T[10]={10,0,5,-12,45, 9,23,8,10,9}; for (i=0;i<10;i++) if (T[i] < 0) num=num+1;}

85

Esercizio: trovare il minimo e il massimo di una matrice

main(){ int V[10][20]={10,0,5, ...}; int min=max=V[0][0]; for (i=0;i<10;i++) for (j=0;j<20;j++) { if (V[i][j]<min) min=V[i][j]; if (V[i][j]>max) max=V[i][j]; }}

86

Esercizio: inizializzare una matrice a righe crescenti

main(){ int V[4][4]; for (i=0;i<4;i++) for (j=0;j<4;j++) { V[i][j] = j +1 + i*4; }}

9 10 11 12

5 6 7 8

1 2 3 4

13 14 15 16

87

Domande

Cos’e’ un algoritmo? Che differenza c’e’ tra un algoritmo e un programma?Come si misura l’efficienza di un algoritmo?Un algoritmo che ha complessita’ O(n) e’ piu’ o meno efficiente di uno che ha complessita’ O(logn)? E di uno che e’ O(n2) o O(2n)?Cosa sono le parole chiave di un linguaggio di programmazione?

88

Domande

Cos’e’ la sintassi di un linguaggio di programmazione? E la semantica?Cosa si intende per linguaggi imperativi?Cos’e’ una variabile?Cos’e’ un’espressione Booleana?Cos’e’ un assegnamento?

89

Domande

Descrivere il costrutto di selezione a uno, due o piu’ ramiDescrivere i tre costrutti per l’iterazione, specificando le loro differenzeA cosa servono le dichiarazioni in un programma?Cos’e’ un sottoprogramma?Che differenza c’e’ tra una procedura e una funzione?Cosa succede quando viene chiamato un sottoprogramma?Cosa si intende per sottoprogramma ricorsivo?

90

Domande

Qual e’ la funzione di un compilatore?Cosa succede durante la fase di analisi lessicale?E quella di analisi sintattica?Fare degli esempi di tipi di dati sempliciCosa sono i tipi di dati strutturati? Fare degli esempiQuali sono le principali caratteristiche di un array?Cosa contiene la dichiarazione di un array?Quali sono le principali differenze tra array e record?