Programmazione Introduzione. Tipi numerici. Samuel Rota Bulò DAIS Università Ca Foscari di Venezia
Outline Informazioni generali Introduzione alla programmazione Il linguaggio OCaML Numeri interi e reali
Il corso Docente : Samuel Rota Bulò (srotabul@dsi.unive.it) Ricevimento : da concordare via email Homepage : www.dsi.unive.it/ srotabul/programming.html
Testi di riferimento M. Hailperin, B. Kaiser, K. Knight. Concrete Abstractions. (http://gustavus.edu/+max/concrete-abstractionspdfs/index.html) J. Hickey. Introduction to Objective Caml. (http://files.metaprl.org/doc/ocaml-book.pdf) Emmanuel Chailloux, Pascal Manoury and Bruno Pagano. Developing Applications With Objective CaML. (http://caml.inria.fr/pub/docs/oreilly-book/ocaml-orabook.pdf)
Outline Informazioni generali Introduzione alla programmazione Il linguaggio OCaML Numeri interi e reali
You think you know when you can learn, are more sure when you can write, even more when you can teach, but certain when you can program. Alan J. Perlis, Epigrams in Programming
A good programmer is someone who looks both ways before crossing a one-way street. Doug Linder, systems administrator
When someone says - I want a programming language in which I need only say what I wish done -, give him a lollipop. Alan J. Perlis, Epigrams in Programming
The only way to learn a new programming language is by writing programs in it. B. Kernighan & D. Ritchie
Cosa significa programmare? Programmare significa estendere le capacità di una macchina con nuove funzionalità finalizzate a risolvere nuovi problemi. Il compito del programmatore è insegnare alla macchina il procedimento attraverso il quale un determinato problema può essere risolto. Il linguaggio con cui il programmatore comunica questo procedimento alla macchina è detto linguaggio di programmazione.
Problem-solving Un bravo programmatore deve essere in grado di: 1. analizzare un problema (generalmente espresso in linguaggio naturale); 2. esprimerlo in modo astratto e formale (magari, aiutandosi con esempi); 3. formalizzare un procedimento risolutivo in un linguaggio preciso (algoritmo); 4. verificare che il procedimento sia corretto ed eventualmente rivisitarlo; 5. fare attenzione ai dettagli con atteggiamento auto-critico.
Insegnante Programmatore Insegnante Programmatore Studente Macchina Linguaggio di programmazione Linguaggio naturale L insegnante insegna allo studente degli algoritmi espressi in linguaggio naturale affinchè quest ultimo possa risolva problemi. Un programmatore in genere ha a che fare con macchine molto più stupide!
Macchina alla von Neumann Le macchine con cui abbiamo (comunemente) a che fare presentano un architettura alla von Neumann. Memory Control Unit Arithmetic Logic Unit Accumulator Input Output
Programmazione imperativa Paradigma di programmazione in cui la computazione è descritta mediante comandi che modificano lo stato del programma. Lo stato viene tipicamente modificato con comandi di assegnamento del tipo v = E o v := E. I comandi sono scritti sequenzialmente, separati tra di loro. È possibile esprimere condizioni, ripetizioni o organizzare il codice in procedure o funzioni. È il paradigma più diffuso: C, C++, Java, Pascal e derivati, Basic e derivati,... Caratteristiche strettamente legate all architettura di von Neumann.
Paradigma funzionale Radicalmente diverso dal paradigma imperativo. Il paradigma è slegato dalla macchina di von Neumann Paradigma di programmazione in cui la computazione è descritta mediante valutazioni di funzioni. Il programma è un espressione e l esecuzione del programma è la valutazione di questa espressione. In senso puro, un linguaggio funzionale non ha variabili e non ha stato. Non ci sono assegnamenti. Non c è sequenzialità dei comandi. Le funzioni sono alla base di tutto. Possono essere interpretate come valori, e possono essere argomento o valore di ritorno di altre funzioni. Al posto di istruzioni di ciclo vi è la ricorsione di funzioni.
Programma in astratto Siano σ 0 e σ n stato iniziale e finale di un programma Programma in un linguaggio imperativo Descrive una sequenza di comandi ci, i = 0,, n 1 tale per cui c σ 0 c 0 1 c σ1 2 c n 1 σ2 σn. Programma in un linguaggio funzionale Descrive una funzione f che dato l argomento σ 0 ritorna σ n σ n = f (σ 0 ).
Un esempio concreto: calcolo del fattoriale Fattoriale di n n! = n (n 1) 1, 0! = 1 Imperativo funzione FATTORIALE (n) x <- 1 mentre n>0 x <- n*x n <- n-1 ritorna x Funzionale funzione FATTORIALE (n) ritorna se n=0 1 altrimenti n * FATTORIALE(n-1)
Outline Informazioni generali Introduzione alla programmazione Il linguaggio OCaML Numeri interi e reali
Il linguaggio OCaML Linguaggio funzionale (non puro) Dialetto di ML (Meta-Language) Progetto Open Source dell INRIA (Istituto nazionale francese di ricerca in informatica) interprete/compilatore reperibile all indirizzo http://caml.inria.fr/ disponibile per Windows, Linux, Unix e MacOSX.
Alcune caratteristiche di ML Linguaggio funzionale: funzioni sono gli oggetti principali del linguaggio. Fortemente tipato: il tipo di ogni variabile ed espressione è determinato al momento della compilazione. Inferenza di tipo: i tipi delle espressioni vengono inferite. Raramente il programmatore assegna tipo direttamente. Polimorfismo: si possono scrivere funzioni che sono indipendenti dai tipi degli argomenti. Semantica formale: hanno interpretazione matematica.
Perchè OCaML? Didatticamente altri linguaggi funzionali sarebbero preferibili ad OCaML, come per es. Scheme. Infatti, OCaML non è un linguaggio funzionale puro, ma è prevalentemente funzionale. Utilizzato nel mondo del lavoro, ed è molto compatibile con F# (linguaggio della famiglia.net di Microsoft). Open source
L interprete OCaML Avviamo l interprete invocando ocaml Objective Caml version 3.10.2 # L interprete rimane in attesa di espressioni da valutare. Le espressioni devono terminare con ;; per essere valutate. Per uscire digitare # exit 0;;
Outline Informazioni generali Introduzione alla programmazione Il linguaggio OCaML Numeri interi e reali
I numeri interi Il programma più semplice consiste in un numero: # 1;; - : int = 1 L interprete valuta l espressione ritornandone il valore 1 e il tipo int. Il tipo int rappresenta un sottoinsieme dei numeri interi Z. # 100000000000000000000;; Integer literal exceeds the range of representable integers of type int Il tipo int in OCaML ha una rappresentazione a 32/64 bit a seconda dell architettura.
Alcune espressioni sugli interi # - -2;; (* Negazione *) - : int = 2 # 2 + 3;; (* Addizione *) - : int = 5 # 2-3;; (* Sottrazione *) - : int = -1 # 2 * 3;; (* Moltiplicazione *) - : int = 6 # 7 / 3;; (* Divisione intera *) - : int = 2 # 7 mod 3;; (* Modulo *) - : int = 1
Eccezioni Alcune espressioni possono generare degli errori controllabili chiamate eccezioni. Verranno approfondite più avanti. # 1 / 0;; (* Eccezione! *) Exception: Division by zero.
Forme alternative per i numeri interi Accanto alla forma decimale, possiamo esprimere un intero in forma ottale... # 0o17;; (* Forma ottale *) - : int = 15... esadecimale... # 0x1F;; (* Forma esadecimale *) - : int = 31... e binaria. # 0b11110;; (* Forma binaria *) - : int = 30
I numeri reali Il tipo float rappresenta un sottoinsieme dei numeri reali R estesi con i simboli ± e Nan (Not a number). # 1.2;; - : float = 1.2 # -1.2e-10;; (* notazione scientifica *) - : float = -1.2e-10 # -1.2E-10;; - : float = -1.2E-10 # 1E400;; (* approssimato a +infinito *) - : float = infinity # -1E400;; (* approssimato a -infinito *) - : float = neg_infinity
Tipizzazione forte di ML Ogni espressione deve avere un tipo. Se non è possibile determinare il tipo di un espressione questa genera un errore. # 1.1 + 2;; (* Errore di tipo! *) ^^^ This expression has type float but is here used with type int # 1.1 * 0;; (* Errore di tipo! *) ^^^ This expression has type float but is here used with type int
Alcune espressioni sui reali # 2.0 +. 3.0;; (* Addizione *) - : float = 5. # 2. -. 3.;; (* Sottrazione *) - : float = -1. # 2. *. 3.;; (* Moltiplicazione *) - : float = 6. # 7. /. 3.;; (* Divisione *) - : float = 0.42857142857142854 # 2. ** 3.;; (* Potenza *) - : float = 8. # int of float 1.2;; (* Conversione float -> int *) - : int = 1 # float of int 1;; (* Conversioni int -> float *) - : float = 1. # -.(-2. +. 3.);; (* Negazione *) - : float = -1.
Aritmetica floating-point L aritmetica dei floating-point è estesa tenendo conto dei simboli di infinito e Nan. Alcuni esempi sono: # -1. /. 0.;; (* -Infinito *) - : float = neg infinity # 0. /. 0.;; (* Indefinito *) - : float = nan # 1. /. infinity;; (* Zero *) - : float = 0.
Attenzione agli errori di tipo! # 1.1 +. 2;; (* Errore di tipo! *) ^ This expression has type int but is here used with type float
Una calcolatrice poco tascabile! Per ora abbiamo solo visto che possiamo fare semplici operazioni! Se scriviamo espressioni più complicate le operazioni rispettano l ordine di precedenza standard. Possiamo forzare la precedenza mediante parentesi. # 1 + 2 * 3;; - : int = 7 # (1 + 2) * 3;; - : int = 9 # 1 + int_of_float (2.*.3.**2.**2.);; - : int = 163