AA 2014-2015. 20. Nomi, binding

Documenti analoghi
NOMI, BINDING. Nomi. ! Un nome in un linguaggio di programmazione è. esa:amente quello che immaginate

PROGRAMMAZIONE Nomi, binding

Nomi. ! Un nome in un linguaggio di programmazione è. esa9amente quello che immaginate

PROGRAMMAZIONE Nomi, binding, regole di visibilità (scope)

Nomi, binding e regole di scope

Nomi. 20. Nomi, binding. Un nome in un linguaggio di programmazione è esa=amente quello che immaginate

Nomi, binding e regole di scope

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:

3. La sintassi di Java

Inizializzazione, Assegnamento e Distruzione di Classi

Concetto di Funzione e Procedura METODI in Java

GESTIONE INFORMATICA DEI DATI AZIENDALI

Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 17 Dicembre 2005

Le variabili. Olga Scotti

Programmazione a Oggetti Lezione 10. Ereditarieta

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

Elementi di semantica operazionale

Java: Compilatore e Interprete

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

Java Virtual Machine

Funzioni. Il modello console. Interfaccia in modalità console

Programmazione I - Laboratorio

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

I puntatori e l allocazione dinamica di memoria

Elementi di semantica denotazionale ed operazionale

Informatica 3. LEZIONE 7: Fondamenti di programmazione orientata agli oggetti (1)

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

costruttori e distruttori

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

Tipicamente un elaboratore è capace di trattare domini di dati di tipi primitivi

INFORMATICA 1 L. Mezzalira

Introduzione alla programmazione in C

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Esercizi Java. class somma2 { static int somma(int a,int b) {return a+b; }

FONDAMENTI di INFORMATICA L. Mezzalira

Oggetti Lezione 3. aspetti generali e definizione di classi I

Struttura di un programma Java

Introduzione alla programmazione Java. Dott. Ing. M. Banci, PhD

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Introduzione al MATLAB c Parte 2

Sottoprogrammi: astrazione procedurale

Programmare in Java. Olga Scotti

LINGUAGGI DI PROGRAMMAZIONE

Funzioni in C. Violetta Lonati

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Algoritmi di Ricerca. Esempi di programmi Java

Definizione di nuovi tipi in C

Corso di Informatica

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Allocazione dinamica della memoria - riepilogo

GESTIONE DEI PROCESSI

La struttura dati ad albero binario

Laboratorio di Algoritmi e Strutture Dati

Come trattare il risultato di un comando SQL (relazioni) che

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

Il software e la programmazione

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Le command line di Java

Telematica II 17. Esercitazione/Laboratorio 6

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

10 - Programmare con gli Array

Relazioni tra oggetti e classi : Composizione. Relazioni tra oggetti e classi : esempio di Aggregazione. classe contenitore

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Tipi di Dato Ricorsivi

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

EVOLUZIONE DEI LINGUAGGI DI ALTO LIVELLO

Linguaggio C - Funzioni

Parola chiave extends

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Fondamenti di Programmazione

Modulo 4: Ereditarietà, interfacce e clonazione

JNDI. Massimo Merro Programmazione di Rete 214 / 229

Visibilità dei Membri di una Classe

7 Esercitazione (svolta): Callback. Polling. Java RMI: callback. Server. Server. Client. Client. due possibilità:

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Dispensa di database Access

Laboratorio di programmazione

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

puntatori Lab. Calc. AA 2007/08 1

ISTITUTO TECNICO INDUSTRIALE STATALE LA GESTIONE DEI FILE DI TESTO IN C++

Progetto Automi e Linguaggi Parser svliluppato con JLex e cup

dall argomento argomento della malloc()

Progettazione : Design Pattern Creazionali

Programmazione in Java (I modulo) Lezione 3: Prime nozioni

I file di dati. Unità didattica D1 1

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

Definizione di nuovi tipi

15 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

IL SOFTWARE SECONDO LA NORMA UNI EN ISO :2008 (IIA PARTE) 1

Arduino: Programmazione

Codifica: dal diagramma a blocchi al linguaggio C++

Esercizi della lezione 5 di Java

Programmi e Oggetti Software

APPUNTI SUL LINGUAGGIO DI PROGRAMMAZIONE PASCAL

Transcript:

AA 2014-2015 20. Nomi, binding 1

Nomi Un nome in un linguaggio di programmazione è esa;amente quello che immaginate o la maggior parte dei nomi sono definia dal programma (gli idenaficatori) o ma anche i simboli speciali (come + o sqrt ) sono nomi Un nome è una sequenza di cara;eri usata per denotare simbolicamente un ogge;o

Nomi e astrazioni L uso dei nomi realizza un primo meccanismo elementare di astrazione Astrazione sui daa! la dichiarazione di una variabile perme;e di introdurre un nome simbolico per una locazione di memoria, astraendo sui de;agli della gesaone della memoria Astrazione sul controllo! la dichiarazione del nome di una funzione (procedura) è l aspe;o essenziale nel processo di astrazione procedurale

EnAtà denotabili EnAtà denotabili: elemena di un linguaggio di programmazione a cui posso assegnare un nome EnAtà i cui nomi sono defini0 dal linguaggio di programmazione (Api primiavi, operazioni primiave, ) EnAtà i cui nomi sono defini0 dall utente (variabili, parametri, procedure, Api, costana simboliche, classi, oggeo, )

Binding e scope Un binding è una associazione tra un nome e un ogge;o Lo scope di un binding definisce quella parte del programma nella quale il binding è aovo

Binding Ame Il binding 0me definisce il momento temporale nel quale viene definita una associazione Più in generale, il binding Ame definisce il momento nel quale vengono prese le decisioni relaave alla gesaone delle associazioni

Esempi di binding Ame o Language design 0me proge;azione del linguaggio! binding delle operazioni primiave, Api, costana o Program wri0ng 0me tempo di scri;ura del programma! binding dei so;oprogrammi, delle classi, o Compile 0me tempo di compilazione! associazioni per le variabili globali o Run 0me tempo di esecuzione! associazioni tra variabili e locazioni, associazioni per le enatà dinamiche

Domanda In Java, qual è il binding Ame per l associazione tra il nome di un metodo e il codice effeovo del metodo? o program Ame? o compile Ame? o run Ame?

StaAco & dinamico Il termine sta0c (dynamic) binding è solitamente ualizzato per fare riferimento ad una associazione aovata prima di mandare (dopo aver mandato) il programma in esecuzione Molte delle cara;erisache dei linguaggi di programmazione dipendono dalla scelta del binding Ame staaco o dinamico I linguaggi compilaa cercano di risolvere il binding staacamente I linguaggi interpretaa devono risolvere il binding dinamicamente

Ambiente L ambiente è definito come l insieme delle associazioni nome- ogge;o esistena a run Ame in uno specifico punto del programma e in uno specifico momento dell esecuzione Nella macchina astra.a del linguaggio, per ogni nome e per ogni sezione del programma l ambiente determina l associazione corre.a

Ambiente e dichiarazioni Le dichiarazioni sono il costru;o linguisaco che perme;e di introdurre associazioni nell ambiente int x; int f( ) { return 0; } Dichiarazione di una variabile Dichiarazione di una funzione Dichiarazione di 0po Type BoolExp = True False Not of BoolExp And of BoolExp*BoolExp

Ambiente e dichiarazioni { int x; x = 22; { char x; x = 'a'; } } lo stesso nome, la variabile x, denota due oggeo differena

Ambiente e dichiarazioni Class A { } A a1 = new A( ); A a2 = new A( ); : a1 = a2; Aliasing: nomi diversi per lo stesso oggewo

Blocchi Un blocco è una regione testuale del programma che può contenere dichiarazioni o C, Java: { } o OCaml: let in Blocco associato a una procedura: corpo della procedura con le dichiarazioni dei parametri formali Blocco in- line: meccanismo per raggruppare comandi

Blocchi A: { int avar; blocco in- line avar = 2; B: { char avar; avar = 'a'; } } poli0ca di accesso ai blocchi: LIFO apri blocco A; apri blocco B; chiudi blocco B; chiudi blocco A; I cambiamen9 dell ambiente avvengono all entrata e all uscita dai blocchi (anche annida9)

Tipi di ambiente Ambiente locale: l insieme delle associazioni dichiarate localmente, compreso le eventuali associazioni relaave ai parametri Ambiente non locale: associazioni dei nomi che sono visibili all interno del blocco ma non dichiaraa nel blocco stesso Ambiente globale: associazioni per i nomi usabili da tu;e le componena che cosatuiscono il programma

Tipi di ambiente: esempio in C #include <stdio.h> int main( ){ A:{ int a = 1 ; B:{ int b = 2; int c = 2; C:{ int c = 3; int d; d = a + b + c; printf("%d\n", d); } D:{ int e; e = a + b + c; printf("%d\n", e); } } } } Ambiente locale di C associazioni per c e d quella per c disaova quella di B Ambiente non locale per C associazione per b ereditata da B associazione globale per a Ambiente Globale associazione per a Cosa stampa?

Tipi di ambiente: esempio in Java public class Prova { public static void main(string[ ] args) { A:{ int a =1 ; B:{ int b = 2; int c = 2; C:{ int c = 3; int d; d = a + b + c; System.out.println(d); } D:{ int e; e = a + b + c; System.out.println(e); } } } } NB. in Java non è possibile ri- dichiarare una variabile già dichiarata in un blocco più esterno $ javac Prova.java Prova.java:7: c is already defined in main(java.lang.string[]) C:{ int c = 3; ^

CambiamenA dell ambiente L ambiente può cambiare a run Ame, ma i cambiamena avvengono di norma in precisi momena o entrando in un blocco! creazione delle associazioni fra i nomi locali al blocco e gli oggeo denotaa! disaovazione delle associazioni per i nomi ridefinia o uscendo dal blocco! distruzione delle associazioni fra i nomi locali al blocco e gli oggeo denotaa! riaovazione delle associazioni per i nomi che erano staa ridefinia

Operazioni su ambiena Naming: creazione di associazione fra nome e ogge;o denotato (dichiarazione locale al blocco o parametro) Referencing: riferimento ad un ogge;o denotato mediante il suo nome (uso del nome per accedere all ogge;o denotato) Disa^vazione di associazione fra nome e ogge;o denotato (la nuova associazione per un nome maschera la vecchia associazione, che rimane disaovata fino all uscita dal blocco) Ria^vazione di associazione fra nome e ogge;o denotato (una vecchia associazione che era mascherata è riaovata all uscita da un blocco) Unnaming: distruzione di associazione fra nome e ogge;o denotato (esempio: ambiente locale all uscita di un blocco) NB. il tempo di vita degli oggeo denotaa non è necessariamente uguale al tempo di vita di un associazione

Implementazione dell ambiente 21

Ambiente (env) Tipo (polimorfo) ualizzato nella semanaca e nelle implementazioni per mantenere il binding tra nomi e valori di un opportuno Apo La specifica definisce il Apo come funzione L implementazione che vedremo ualizza le liste 22

Ambiente: interfaccia # module type ENV = sig type 't env val emptyenv : 't -> 't env val bind : 't env * string * 't -> 't env val bindlist : 't env * (string list) * ('t list) -> 't env val applyenv : 't env * string -> 't exception WrongBindlist end 23

Ambiente: semanaca # module Funenv:ENV = struct end type 't env = string -> 't exception WrongBindlist let emptyenv(x) = function (y: string) -> x (* x: valore default *) let applyenv(x,y) = x y let bind(r, l, e) = function lu -> if lu = l then e else applyenv(r,lu) let rec bindlist(r, il, el) = match (il,el) with ([],[]) -> r i::il1, e::el1 -> bindlist (bind(r, i, e), il1, el1) _ -> raise WrongBindlist 24

Ambiente: implementazione # module Listenv:ENV = struct end type 't env = (string * 't) list exception WrongBindlist let emptyenv(x) = [("", x)] let rec applyenv(x,y) = match x with [(_, e)] -> e (i1, e1) :: x1 -> if y = i1 then e1 [] -> failwith("wrong env") let bind(r, l, e) = (l, e) :: r else applyenv(x1, y) let rec bindlist(r, il, el) = match (il, el) with ([],[]) -> r i::il1, e::el1 -> bindlist (bind(r, i, e), il1, el1) _ -> raise WrongBindlist 25

Scope Lo scope di un binding definisce quella parte del programma nella quale il binding è aovo o scope sta0co o lessicale: è determinato dalla stru;ura sintaoca del programma o scope dinamico: è determinato dalla stru;ura a tempo di esecuzione Come vedremo, differiscono solo per l ambiente non locale

Regole di scope (C) A: { int x = 0; void proc( ){ x = 1; } } B: { int x; proc( ); } printf("%d\n", x); quale valore di x viene stampato? Il C ha scope sta0co, quindi la variabile x nel corpo di proc è legata alla dichiarazione che la precede sintaocamente, cioè quella in A

Regole di visibilità Una dichiarazione locale in un blocco è visibile o in quel blocco o in tuo i blocchi in esso annidaa o salvo ri- dichiarazioni dello stesso nome (mascheramento, shadowing) La regola di visibilità (cioè l annidamento) è basata o sul testo del programma (scope sta0co) o sul flusso di esecuzione (scope dinamico)

Scope staaco Le dichiarazioni locali in un blocco includono solo quelle presena nel blocco, e non quelle dei blocchi in esso annidaa Se si usa un nome in un blocco, l associazione valida è quella locale al blocco; se non esiste, si prende la prima associazione valida a parare dal blocco immediatamente esterno, dal più vicino al più lontano; se non esiste, si considera l ambiente predefinito del linguaggio; se non esiste, errore Se il blocco ha un nome, allora il nome fa parte dell ambiente locale del blocco immediatamente esterno (come per le procedure)

Scope staaco: esempio in C int main( ) { int x = 0; void proc(int n) { x = n+1; } proc(2); prinm("%d\n",x); { int x = 0; proc(3); prinm("%d\n",x); } prinm("%d\n",x); } Cosa stampa? Stampa 3 Stampa 0 Stampa 4

Scope sta0co: discussione 31

Due esempi type lista = ptr^elemento; type elemento = record informazione: intero; successivo: lista end errore: elemento è usato prima di essere definito; in Pascal si può fare, ma solo con i puntatori type elemento; type lista = access elemento; type elemento is record informazione: intero; successivo: lista end in ADA si usano dichiarazioni incomplete

più uno! procedure pippo (A: integer); forward; procedure pluto (B: integer) begin pippo(3); end procedure pippo begin pluto(4) end in Pascal si usano definizioni incomplete per le funzioni mutuamente ricorsive; in C si può fare liberamente

Discussione Lo scope staaco perme;e di determinare tuo gli ambiena di un programma staacamente, osservando la stru;ura sintaoca del programma o controlli di corre;ezza a compile Ame o oomizzazione del codice a compile Ame o possibile il controllo staaco dei Api GesAone a run Ame aracolata o gli ambiena non locali di funzioni e procedure evolvono diversamente dal flusso di aovazione e disaovazione dei blocchi

Scope dinamico L associazione valida per un nome x, in un punto P di un programma, è la più recente associazione creata (in senso temporale) per x che sia ancora aova quando il flusso di esecuzione arriva a P Come vedremo, lo scope dinamico ha una gesaone a run Ame semplice o vantaggi: flessibilità nei programmi o svantaggi: difficile comprensione delle chiamate delle procedure e controllo staaco dei Api non possibile