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

Documenti analoghi
Nomi, binding e regole di scope

Nomi, binding e regole di scope

PROGRAMMAZIONE Nomi, binding

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

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

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

AA Nomi, binding

Nomi e ambiente. Blocchi e regole di scoping. Blocchi e regole di scoping Nomi e ambiente 1 / 39

Nomi. Nomi e ambiente. Nomi e oggetti denotabili. Sintassi

Nomi. Nomi e ambiente. Nomi e oggetti denotabili. Esempio

Linguaggi di Programmazione

Programmazione II. Lezione 6. Daniele Sgandurra 5/11/2010.

Nomi e Ambiente. Nicola Fanizzi. Linguaggi di Programmazione [010194] 20 apr, Dipartimento di Informatica Università degli Studi di Bari

Corso di Laurea in Informatica Applicata Prima Prova di Verifica Intermedia di Programmazione II 1 Dicembre 2010

Funzioni, Stack e Visibilità delle Variabili in C

Funzioni, Stack e Visibilità delle Variabili in C

Informatica 3. LEZIONE 2: Sintassi e semantica

Informatica 3. Informatica 3. LEZIONE 2: Sintassi e semantica. Lezione 2- Modulo 1. Le componenti di un linguaggio di programmazione

Paolo Bison. Fondamenti di Informatica Ingegneria Meccanica Università di Padova A.A. 2008/09

Programmazione II. Lezione 5. Daniele Sgandurra 2/11/2010.

Paolo Bison. Fondamenti di Informatica A.A. 2006/07 Università di Padova

Informatica 3. LEZIONE 4: Semantica operazionale. Modulo 1: Strutture a blocchi Modulo 2: Comportamenti dinamici

Semantica statica e dinamica

Corso di Linguaggi di Programmazione. Organizzazione di un processo in memoria (1)

! Intro metodi/sottoprogrammi. ! Definizione (intestazione e corpo) e uso. ! Parametri formali e attuali, associazione

Strutture dati nel supporto a run time

Corso di Linguaggi di Programmazione

Tecniche per il passaggio dei parametri

IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Struttura di un programma Java

Programmazione II. Lezione 9. Daniele Sgandurra 16/11/2010.

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Programmazione Orientata agli Oggetti in Linguaggio Java

Le basi del linguaggio Java

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

Il linguaggio C. Istruzioni, funzioni, dati strutturati

IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Primo esempio di un programma Java

Espressioni. Espressioni logiche: sintassi astratta. type BoolExp = True False Not of BoolExp And of BoolExp * BoolExp 15/11/18. INTERPRETE in OCAML

Java vs Ocaml. Una prima analisi

passaggio di vettori come parametri di funzioni/procedure. I Quando si passa un vettore come parametro ad una funzione, in

ASTRAZIONE. Sono indipendenti dalla macchina hardware sottostante ASTRAZIONE 1

JAVA. import java.util.*; #include <stdio.h> public static class test { int variable; private int variable; int main (int argc, char *argv[]) {

Comunicazioni di servizio. I metodi - II. Dove siamo. Struttura programma Java. Visibilità (scope) Oggi. Stefano Mizzaro 1

LINGUAGGI DI PROGRAMMAZIONE

3) Descrivere l architettura di un elaboratore tramite astrazione a livelli

Scope, Memoria e Tabella dei Simboli

Esonero di Informatica I. Ingegneria Medica

Autore: Prof. Agostino Sorbara ITIS "M. M. Milano" Polistena (RC)

Programmare. Compilatori e interpreti. Editor :: vi. Hello1.c. #include <stdio.h> >> cc Hello1.c. main() { printf( \n Hello World!

Introduzione a Java. Riferimenti

Le istruzioni corrispondono univocamente a quelle macchina, ma vengono espresse tramite nomi simbolici i (parole chiave)

PROGRAMMAZIONE Funzioni e procedure

Programmazione II. Lezione 7. Daniele Sgandurra 9/11/2010.

Passaggio dei parametri

Corso sul linguaggio Java

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Contenuti. Elementi di semantica denotazionale ed operazionale. Sintassi astratta. Sintassi e semantica. ! sintassi astratta e domini sintattici

ASTRAZIONE ASTRAZIONE

Lezione 6. Visibilità degli identificatori e tempo di vita degli oggetti

Programmazione con Java

PROGRAMMAZIONE Tipi di dato, implementazione

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

Linguaggi di Programmazione I Lezione 1

Il linguaggio C. Notate che...

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Linguaggi di programmazione

Corso di Linguaggi di Programmazione

Scelte. Costrutto condizionale. Il costrutto if. Il costrutto if. Rappresentazione con diagramma a blocchi. Il costrutto if

Programmazione I - corso B a.a prof. Viviana Bono

Corso di Linguaggi di Programmazione

Pr ogramming Languages. Sottoprogrammi

10. Visibilità e tempo di vita delle variabili. Andrea Marongiu Paolo Valente

Macchine astratte, linguaggi, interpretazione, compilazione

Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri

Capitolo 5. Array e collezioni. c 2005 Pearson Education Italia Capitolo 5-1 / 61

Macchine astratte, linguaggi, interpretazione, compilazione

Tipi di dato personalizzati Array di struct. Tipi di dato utente. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Gli oggetti. Ogni oggetto ha un interfaccia e ogni oggetto ha un tipo. Incapsulamento. Oggetti. Contatore. Invio di Messaggi

Laboratorio di Programmazione(corso A) Laurea in Informatica - A.A. 2000/2001 Docente: A. Lanza

Implementazione dell interprete di un nucleo di linguaggio funzionale

Corso di Laurea in Informatica Applicata Prima Prova di Verifica Intermedia di Programmazione II 1 Dicembre 2010

La Programmazione. Cos è la programmazione? Concetti preliminari

Lezione 6 Introduzione al C++ Mauro Piccolo

Esercitazioni di Informatica 3

Sommario Linguaggi, messaggi e comunicazione. Introduzione ai Linguaggi di Programmazione. Linguaggio. Messaggio

Politecnico di Milano. Strutture dati dinamiche

Progettazione Object-Oriented

Visibilità e tempo di vita delle variabili. (più sintesi di alcuni concetti della prima parte del corso)

IL CONCETTO DI PACKAGE

Dati due punti sul piano calcolare la loro distanza

Corso di Linguaggi di Programmazione

Java Gli array. Array

Variabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free

Capitolo 5 - Funzioni

POLITECNICO DI TORINO. Laboratorio di Compilatori Corso di Linguaggi e Traduttori. Esercitazione 5. a.a 2010 / Controllo dei tipi

METODI in Java. Prof.Angela Bonifati. Metodi e Sottoprogrammi

Transcript:

PROGRAMMAZIONE 2 19. Nomi, binding, regole di visibilità (scope) PR2 2017-2018 1

Nomi Un nome in un linguaggio di programmazione è esattamente quello che immaginate o la maggior parte dei nomi sono definiti dal programma (gli identificatori) o ma anche i simboli speciali (come + o sqrt ) sono nomi Un nome è una sequenza di caratteri usata per denotare simbolicamente un oggetto PR2 2017-2018 2

Nomi e astrazioni L uso dei nomi realizza un primo meccanismo elementare di astrazione Astrazione sui dati! la dichiarazione di una variabile permette di introdurre un nome simbolico per una locazione di memoria, astraendo sui dettagli della gestione della memoria Astrazione sul controllo! la dichiarazione del nome di una funzione (procedura) è l aspetto essenziale nel processo di astrazione procedurale PR2 2017-2018 3

Entità denotabili Entità denotabili: elementi di un linguaggio di programmazione a cui posso assegnare un nome Entità i cui nomi sono definiti dal linguaggio di programmazione (tipi e operatori primitivi, ) Entità i cui nomi sono definiti dall utente (variabili, parametri, procedure, tipi, costanti simboliche, classi, oggetti, ) PR2 2017-2018 4

Binding e scope Un binding è una associazione tra un nome e l oggetto denotato Lo scope di un binding definisce quella parte del programma nella quale il binding è attivo PR2 2017-2018 5

Binding time Il binding time definisce il momento temporale nel quale viene definita una associazione Più in generale, il binding time definisce il momento nel quale vengono prese le decisioni relative alla gestione delle associazioni PR2 2017-2018 6

Esempi di binding time Language design time- progettazione del linguaggio binding delle operazioni primitive, tipi, costanti Program writing time tempo di scrittura del programma binding dei sotto-programmi, delle classi, Compile time tempo di compilazione associazioni per le variabili globali Run time tempo di esecuzione associazioni tra variabili e locazioni, associazioni per le entità dinamiche PR2 2017-2018 7

Domanda In Java, qual è il binding time per l associazione tra il nome di un metodo e il codice effettivo del metodo? o program time? o compile time? o run time? PR2 2017-2018 8

Binding statico & dinamico Il termine static (dynamic) binding è utilizzato per fare riferimento a una associazione attivata prima di mandare (dopo aver mandato) il programma in esecuzione Molte caratteristiche dei linguaggi di programmazione dipendono dalla scelta del binding statico o dinamico I linguaggi compilati cercano di risolvere il binding staticamente I linguaggi interpretati devono risolvere il binding dinamicamente PR2 2017-2018 9

Ambiente Nella macchina astratta del linguaggio, per ogni nome e per ogni sezione del programma l ambiente determina l associazione corretta L ambiente è definito come l insieme delle associazioni nome-oggetto esistenti a runtime in uno specifico punto del programma e in uno specifico momento dell esecuzione PR2 2017-2018 10

Ambiente e dichiarazioni Le dichiarazioni sono il costrutto linguistico che permette di introdurre associazioni nell ambiente int x; int f( ) { return 0; } Dichiarazione di una variabile Dichiarazione di una funzione Dichiarazione di tipo type BoolExp = True False Not of BoolExp And of BoolExp*BoolExp PR2 2017-2018 11

Ambiente e dichiarazioni { int x; x = 22; { char x; x = 'a'; } } lo stesso nome, la variabile x, denota due oggetti differenti PR2 2017-2018 12

Ambiente e dichiarazioni Class A {... } A a1 = new A( ); A a2 = new A( ); : a1 = a2; Aliasing: nomi diversi per lo stesso oggetto PR2 2017-2018 13

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 PR2 2017-2018 14

Blocco in-line A: { int avar; avar = 2; B: { char avar; avar = 'a'; } } apri blocco A; apri blocco B; chiudi blocco B; chiudi blocco A; politica di accesso ai blocchi: LIFO I cambiamenti dell ambiente avvengono all entrata e all uscita dai blocchi (anche annidati) PR2 2017-2018 15

Tipi di ambiente Ambiente locale: l insieme delle associazioni dichiarate localmente, compreso le eventuali associazioni relative ai parametri Ambiente non locale: associazioni dei nomi che sono visibili all interno del blocco ma non dichiarati nel blocco stesso Ambiente globale: associazioni per i nomi usabili da tutte le componenti che costituiscono il programma PR2 2017-2018 16

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 disattiva 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? PR2 2017-2018 17

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 ridichiarare 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; ^

Cambiamenti dell ambiente L ambiente può cambiare a runtime, ma i cambiamenti avvengono di norma in precisi momenti entrando in un blocco creazione delle associazioni fra i nomi locali al blocco e gli oggetti denotati disattivazione delle associazioni per i nomi ridefiniti uscendo dal blocco distruzione delle associazioni fra i nomi locali al blocco e gli oggetti denotati riattivazione delle associazioni per i nomi che erano stati ridefiniti PR2 2017-2018 19

Operazioni su ambienti Naming: creazione di associazione fra nome e oggetto denotato (dichiarazione locale al blocco o parametro) Referencing: riferimento a un oggetto denotato mediante il suo nome (uso del nome per accedere all oggetto denotato) Disattivazione di associazione fra nome e oggetto denotato (la nuova associazione per un nome maschera la vecchia associazione, che rimane disattivata fino all uscita dal blocco) Riattivazione di associazione fra nome e oggetto denotato (una vecchia associazione che era mascherata è riattivata all uscita da un blocco) Unnaming: distruzione di associazione fra nome e oggetto denotato (esempio: ambiente locale all uscita di un blocco) NB. il tempo di vita degli oggetti denotati non è necessariamente uguale al tempo di vita di un associazione PR2 2017-2018 20

Implementazione dell ambiente PR2 2017-2018 21

Ambiente (env) Tipo (polimorfo) utilizzato nella semantica e nelle implementazioni per mantenere il binding tra nomi e valori di un opportuno tipo La specifica definisce il tipo come funzione L implementazione che vedremo utilizza le liste PR2 2017-2018 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 end exception WrongBindlist PR2 2017-2018 23

Ambiente: specifica # 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 PR2 2017-2018 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 PR2 2017-2018 25

Regole di scope Lo scope di un binding definisce quella parte del programma nella quale il binding è attivo o scope statico o lessicale: è determinato dalla struttura sintattica del programma o scope dinamico: è determinato dalla struttura a tempo di esecuzione Come vedremo, differiscono solo per l ambiente non locale PR2 2017-2018 26

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 statico, quindi la variabile x nel corpo di proc è legata alla dichiarazione che la precede sintatticamente, cioè quella in A 27

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

Scope statico Le dichiarazioni locali in un blocco includono solo quelle presenti nel blocco, e non quelle dei blocchi in esso annidati 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 partire 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) PR2 2017-2018 29

Scope statico: esempio in C int main( ) { } int x = 0; void proc(int n) { x = n+1; } proc(2); printf("%d\n", x); { int x = 0; proc(3); printf("%d\n", x); } printf("%d\n", x); Cosa stampa? Stampa 3 Stampa 0 Stampa 4 PR2 2017-2018 30

Scope statico: discussione PR2 2017-2018 31

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

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 PR2 2017-2018 33

Discussione Lo scope statico permette di determinare tutti gli ambienti di un programma staticamente, osservando la struttura sintattica del programma controlli di correttezza a compile time ottimizzazione del codice a compile time possibile il controllo statico dei tipi Gestione a run time articolata gli ambienti non locali di funzioni e procedure evolvono diversamente dal flusso di attivazione e disattivazione dei blocchi (LIFO) PR2 2017-2018 34

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 attiva quando il flusso di esecuzione arriva a P Come vedremo, lo scope dinamico ha una gestione a run time semplice o vantaggi: flessibilità nei programmi o svantaggi: difficile comprensione delle chiamate delle procedure e controllo statico dei tipi non possibile PR2 2017-2018 35