Corso di Linguaggi di Programmazione



Documenti analoghi
Corso di Linguaggi di Programmazione

Corso di Linguaggi di Programmazione

EVOLUZIONE DEI LINGUAGGI DI ALTO LIVELLO

LINGUAGGI DI PROGRAMMAZIONE

Programmazione Funzionale

+ / operatori di confronto (espressioni logiche/predicati) / = > < Pseudo codice. Pseudo codice

Funzioni in C. Violetta Lonati

FONDAMENTI di INFORMATICA L. Mezzalira

INFORMATICA 1 L. Mezzalira

Matematica generale CTF

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

Programmazione I - Laboratorio

Testi di Esercizi e Quesiti 1

Metodologie di programmazione in Fortran 90

Alcune nozioni di base di Logica Matematica

Laboratorio di Informatica

Brevissima introduzione al Lisp

Nozione di algoritmo. Gabriella Trucco

DI D AGRA R MM M I M A BLOCC C H C I TEORI R A E D D E SERC R I C ZI 1 1

Risolvere un problema significa individuare un procedimento che permetta di arrivare al risultato partendo dai dati

Linguaggi di programmazione

I Problemi e la loro Soluzione. Il Concetto Intuitivo di Calcolatore. Risoluzione di un Problema. Esempio

Algoritmo. I dati su cui opera un'istruzione sono forniti all'algoritmo dall'esterno oppure sono il risultato di istruzioni eseguite precedentemente.

Informatica 3. Informatica 3. LEZIONE 10: Introduzione agli algoritmi e alle strutture dati. Lezione 10 - Modulo 1. Importanza delle strutture dati

LE SUCCESSIONI 1. COS E UNA SUCCESSIONE

Calcolatori Elettronici A a.a. 2008/2009

Elementi di semantica operazionale

Introduzione ai tipi di dato astratti: applicazione alle liste

Fondamenti dei linguaggi di programmazione

Fasi di creazione di un programma

Scopo della lezione. Informatica. Informatica - def. 1. Informatica

LE FUNZIONI A DUE VARIABILI

Appunti del corso di Informatica 1 (IN110 Fondamenti) 4 Linguaggi di programmazione

Corso di Linguaggi di Programmazione

Il documento rappresenta una guida sintetica per descrivere sia la filosofia che il modulo software per l implementazione dei workflow in recuper@2.

Alcune regole di base per scrivere un programma in linguaggio C

Fondamenti di Informatica Ingegneria Clinica Lezione 19/10/2009. Prof. Raffaele Nicolussi

4 3 4 = 4 x x x 10 0 aaa

Introduzione al MATLAB c Parte 2

Anno 3. Funzioni: dominio, codominio e campo di esistenza

Corso di Informatica

INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI

CONCETTO DI LIMITE DI UNA FUNZIONE REALE

u 1 u k che rappresenta formalmente la somma degli infiniti numeri (14.1), ordinati al crescere del loro indice. I numeri u k

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Gian Luca Marcialis studio degli algoritmi programma linguaggi LINGUAGGIO C

Algoritmi e diagrammi di flusso

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

ALGORITMI e PROGRAMMI Programmazione: Lavoro che si fa per costruire sequenze di istruzioni (operazioni) adatte a svolgere un dato calcolo

Concetto di Funzione e Procedura METODI in Java

I sistemi di numerazione

FORMULE: Operatori matematici

TECNICHE DI SIMULAZIONE

Variabili e tipi di dato

Logica e codifica binaria dell informazione

Semantica dei programmi. La semantica dei programmi è la caratterizzazione matematica dei possibili comportamenti di un programma.

Equilibrio bayesiano perfetto. Giochi di segnalazione

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Appunti di Sistemi Elettronici

Lezione 8. La macchina universale

Descrizione di un algoritmo

Elementi di semantica denotazionale ed operazionale

Dispensa di Informatica I.1

Le variabili. Olga Scotti

Dispensa di database Access

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

APPUNTI SUL LINGUAGGIO DI PROGRAMMAZIONE PASCAL

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Introduzione. Informatica B. Daniele Loiacono

AA LA RICORSIONE

Strutture di controllo del flusso di esecuzione

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

IL TEST DI ACCESSO AI CORSI DI STUDIO TRIENNALI DI PSICOLOGIA

Appunti del corso di Informatica 1 (IN110 Fondamenti) 2 Algoritmi e diagrammi di flusso

SPC e distribuzione normale con Access

Organizzazione degli archivi

Elementi di Algebra Relazionale

Esempi di algoritmi. Lezione III

Esercitazioni di Calcolo Numerico 23-30/03/2009, Laboratorio 2

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

Informatica. Rappresentazione dei numeri Numerazione binaria

Prestazioni CPU Corso di Calcolatori Elettronici A 2007/2008 Sito Web: Prof. G. Quarella prof@quarella.

Fondamenti di Informatica Ingegneria Clinica Lezione 16/10/2009. Prof. Raffaele Nicolussi

PROGRAMMA SVOLTO DI INFORMATICA ANNO SCOLASTICO 2013/2014. DOCENTE: Villani Chiara

Algebra Booleana ed Espressioni Booleane

GESTIONE INFORMATICA DEI DATI AZIENDALI

Linguaggi e Paradigmi di Programmazione

Ottimizzazione delle interrogazioni (parte I)

Ricorsione. (da lucidi di Marco Benedetti)

PROCEDURA PER LA GESTIONE ESAMI DI STATO AREA ALUNNI AXIOS

Uso di base delle funzioni in Microsoft Excel

Linguaggio C. Fondamenti. Struttura di un programma.

1. Che cos è la multiprogrammazione? Si può realizzare su un sistema monoprocessore? 2. Quali sono i servizi offerti dai sistemi operativi?

Corso di Analisi Matematica Serie numeriche

5.3 TABELLE RECORD Inserire, eliminare record in una tabella Aggiungere record Eliminare record

CONCETTO DI ANNIDAMENTO

I Sistemi Informativi

APPUNTI DI MATEMATICA ALGEBRA \ INSIEMISTICA \ TEORIA DEGLI INSIEMI (1)

Introduzione all Information Retrieval

Transcript:

Corso di Linguaggi di Programmazione Lezione 3 Alberto Ceselli (thanks C. Braghin) ceselli@dti.unimi.it Dipartimento di Tecnologie dell Informazione Università degli Studi di Milano 09 Marzo 2009 Storicamemente 1977: ACM Turing Award a John Backus per lo sviluppo del Fortran 1978, Seminario per l Award: Backus afferma che i linguaggi funzionali sono meglio degli imperativi! Piu facili da capire, sia durante che dopo lo sviluppo significato delle espressioni indipendenti dal contesto propone anche un linguaggio puramente funzionale (FP).... seguito da numerosi scienziati.

Imperativo VS Funzionale Programmazione imperativa: Abbiamo una macchina alla Von Neumann da comandare questa ha uno stato (valore di registri e celle di memoria) realizziamo calcoli modificando lo stato della macchina forniamo istruzioni (o comandi) da interpretare in modo sequenziale secondo un flusso di controllo, e gestiamo questo flusso con costrutti di iterazione, selezione ecc. per modificare i valori nelle celle di memoria (e quindi lo stato della macchina), modifichiamo valori di variabili Imperativo VS Funzionale Programmazione funzionale: Consiste nel definire funzioni che producono quanto desiderato, a partire dai loro argomenti - la computazione avviene applicando le funzioni ai loro argomenti Le funzioni sono definite come quelle matematiche, basandosi più su condizioni e ricorsione, che su sequenze di istruzioni Una funzione inoltre non ha effetti collaterali, né assegnamenti Es.: data la funzione f (x) = x + 1, valutare f (x) non cambia nulla: f non cambia il suo stato interno, f (3) è sempre 4 f non modifica lo stato esterno, non apre un socket o salva un file su disco

Imperativo VS Funzionale niente stato... niente cicli: uso la ricorsione per sostituire qualsiasi costrutto di iterazione niente assegnamenti e niente variabili, niente gestione della memoria solo definizioni di funzioni ed applicazioni di funzioni a dati (niente effetti collaterali ). Ricorsione (ripasso) Dal punto di vista formale un sottoprogramma è ricorsivo quando richiama se stesso (nel corpo del sottoprogramma presente una chiamata al sottoprogramma stesso). le relazioni di ricorrenza sono delle funzioni definite in maniera ricorsiva (es n! = n (n 1)!). Ogni definizione ricorsiva deve essere caratterizzata da: Caso Base (condizione di terminazione): condizione per cui la relazione non è pi u funzione di se stessa (non chiama più se stessa); Passo Induttivo (chiamata ricorsiva): la relazione è funzione di se stessa ( chiama se stessa), relativamente ad un problema pi piccolo ; la soluzione al problema più piccolo viene combinata con altra informazione per produrre la soluzione al problema originale.

Ricorsione: nota bene N.B. senza caso base la funzione richiamerebbe sempre se stessa (loop infinito). N.B. i concetti di ricorsione ed induzione matematica sono strettamente legati. Pensare ricorsivo... Esempi (alla lavagna): fattoriale numeri di Fibonacci somma e potenza

Programmazione funzionale e linguaggi funzionali Perchè progettare linguaggi dedicati appositamente alla programmazione funzionale? mimare la definizione di funzioni matematiche il più possibile... anche nella sintassi permettere di scrivere codice per ogni tipo di funzione... senza restrizioni su forma, tipo e numero dei parametri (es. in molti linguaggi imperativi non e possibile definire funzioni che restituiscano altre funzioni)... con funzioni che possano restituire una tupla di valori (anziché un singolo valore) Linguaggi funzionali Applicazioni Dominano nell area dell intelligenza artificiale Rappresentazione della conoscenza Trattamento di linguaggio naturale Utilizzati nei sistemi esperti Alcune applicazioni: - Emacs, editor di testo, scritto in LISP - AutoCAD, programma per disegno tecnico, scritto in LISP, AutoLISP e VisualLISP - Macsyma, programma di matematica simbolica, scritto in LISP

Linguaggi funzionali Linguaggi funzionali principali: - LISP, Common LISP: core puramente funzionale + feature imperative - Scheme: piccolo, statically scoped - ML, Haskell: fortemente tipati, con una sintassi più convenzionale Caratteristiche comuni: - comprendono un insieme di funzioni predefinite e alcune forme funzionali per costruire funzioni più complesse - molti introducono funzioni per permettere anche la programmazione imperativa (e.g., PROG in LISP), le iterazioni e gli assegnamenti alle variabili (es. SET in Scheme) Scheme - Storia Ideato da Sussman e Steele nel 1975, al MIT Dialetto di LISP (LISt Processing) [McCarthy 1960] Specifiche del linguaggio: Standard IEEE (ufficiale) The Revised n th Report on the Algorithmic Language Scheme (R6RS) (standard de facto) http://www.schemers.org/documents/standards

Perchè Scheme? È un linguaggio facile, adatto ai neofiti È un linguaggio che può essere facilmente immerso (embedded) ed esteso - La Free Software Foundation ha scelto i linguaggi C e Scheme come base per il sistema operativo GNU - Il numero degli applicativi e dei sistemi basati sullo Scheme cresce di mese in mese (e.g. Gimp) È un linguaggio potente e flessible con un semantica pulita - molti ricercatori lo usano da più di vent anni per implementare e sperimentare le loro idee Offre supporto diretto a molti stili di programmazione Molte delle obiezioni mosse contro Scheme sono oggi superate - esistono compilatori molto efficienti (Stalin, Chicken) - esistono raffinati strumenti di analisi statica (MrSpider) Scheme in una slide Scoping statico - per ogni occorrenza di una variabile vincolata è possibile determinare staticamente l espressione che la definisce - questa caratteristica lo differenzia dal LISP Le funzioni sono oggetti di prima classe - le funzioni sono valori che possono essere assegnati a variabili, passati come argomenti ad altre funzioni o ritornati come valori da una funzione Le funzioni possono ritornare valori multipli Pochi tipi predefiniti Case-insensitive Poco tipato (davvero?)

Materiale su Scheme Dove ottenere un interprete: - Dr. Scheme (GUI + MzScheme) http://www.drscheme.org/, ambiente che utilizzaremo a lezione, disponibile per molte piattaforme - Molti altri: MIT Scheme, Bigloo, Kawa, etc - Generalmente non del tutto compatibili!! Manuali: - Teach Yourself Scheme in Fixnum Days, di Dorai Sitaram http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-yscheme.html - How to Design Programs, An Introduction to Programming and Computing, AA.VV. http://www.htdp.org/ - The Scheme Programming Language, 2nd Edition, http://www.scheme.com/tspl2d/ Altro: - il portale di Scheme http://www.schemers.org/ Scheme - L interprete Tutti gli interpreti Scheme sono basati sul seguente loop (Read-Eval-Print): 1. Leggi un espressione inserita dall utente 2. Valuta l espressione per generare un risultato valido 3. Stampa a video l eventuale risultato 4. Ripeti all infinito. Scheme è tipicamente interattivo - reagisce immediatamente a quanto inserito - esisono anche compilatori, ma più di frequente interpreti

Esempio di utilizzo di DrScheme Esempio di utilizzo di DrScheme (finestra a parte). Come viene chiamata una funzione in Scheme? (nome-funzione lista-argomenti) - sintassi prefissa - Es. (+ 1 2 3 4) - le funzioni possono venire composte: (+ (* 3 2) 1) Valutazione di una funzione: 1. recupera il primo simbolo dopo la parentesi 2. cerca la funzione corrispondente 3. valuta gli argomenti - NB: l ordine di valutazione è volutamente non specificato 4. applica la funzione ai valori risultanti

Scheme - Elementi di base Atomi: numeri e simboli (associati a valori) Liste: sequenze, anche non omogenee, di dati Funzioni: oggetti di prima classe Forme speciali: assomigliano ad una funzione, ma l interprete le valuta in modo diverso Operazioni di I/O Tipi di dato (elementari) Numerici: - interi (Es. 15) - reali (Es. 1.5) - razionali (Es. 1/5) - complessi (Es. 1 + 5i) Simboli: - utilizzati come identificatori di variabili (Es. xyz) Booleani: - #f - #t (ogni valore diverso da #f viene considerato vero) Valutazione di un tipo numerico o booleano: - Restituisce il valore numerico o booleano Valutazione di un simbolo: - Restituisce il valore associato, altrimenti errore - Per non ricevere messaggio d errore, commentare il simbolo non associato usando la forma speciale quote

Funzioni aritmetiche fun # arg valore di ritorno + 0 o più somma degli argomenti 1 o più differenza degli argomenti (da sx a dx) 0 o più prodotto degli argomenti / 1 o più quoziente degli argomenti (da sx a dx) max 1 o più massimo min 1 o più minimo truncate num la parte intera di num sqrt num la radice quadrata di num abs num il valore assoluto di num expt num pwr num alla exp quotient num-1 num-2 il quoziente di num-1 diviso num-2 remainder num-1 num-2 il resto di num-1 diviso num-2 - + e possono avere un qualsiasi numero di argomenti, nel caso non ce ne siano viene restituita l identità (0 e 1) - nel caso / abbia un solo argomento n, viene restituito 1/n Predicati Tipi Primitivi fun # arg ritorna #t sse not arg arg è #f < num-1... num-n num-1 < num-2... < num-n > num-1... num-n num-1 > num-2... > num-n = num-1... num-n num-1 = num-2... = num-n <= num-1... num-n num-1 <= num-2... <= num-n >= num-1... num-n num-1 >= num-2... >= num-n zero? num num = 0 positive? num num > 0 negative? num num < 0 even? num num pari odd? num num dispari number? num num è un numero real? num num è un reale integer? num num è un intero symbol? num num è un simbolo

Come associare un valore ad un simbolo? (define identificatore valore) - al simbolo identificatore viene associato valore - analogo alla definizione di una variabile globale - Es. (define pi 3.14) (set! identificatore valore) - viene modificato il valore associato al simbolo identificatore - potrebbe essere di tipo diverso - restituisce errore se non è mai stato associato prima un valore tramite forma speciale define Programmazione Funzionale Vantaggi, svantaggi e luoghi comuni Permettono uno sviluppo molto rapido di prototipi La sintassi e la semantica sono più semplici - più facile scrivere programmi corretti in assenza di side-effect Sono meno efficienti dei linguaggi imperativi? - i linguaggi funzionali generalmente basati su un interprete, ma esistono anche compilatori - i linguaggi imperativi costituiscono un modello molto preciso dell HW attuale (è piu facile scrivere compilatori ottimizzanti) Sono adatti a progetti software di grandi dimensioni?

Esercizi: Esercizi: Installare un interprete Scheme (es. DrScheme), e provare a valutare semplici espressioni numeriche. Scrivere un programma C che calcoli il massimo comun divisore tra due numeri, sia in modo iterativo che in modo ricorsivo ( ripassate l algoritmo di Euclide ;) ).