Nomi, binding e regole di scope
|
|
|
- Gioacchino Marchetti
- 7 anni fa
- Visualizzazioni
Transcript
1 Nomi, binding e regole di scope 1
2 Nomi Un nome in un linguaggio di programmazione è esa5amente quello che immaginate o la maggior parte dei nomi sono defini; dal programma (gli iden;ficatori) o ma anche i simboli speciali (come + o sqrt ) sono nomi Un nome è una sequenza di cara5eri usata per denotare simbolicamente un ogge5o
3 Nomi e astrazioni L uso dei nomi realizza un primo meccanismo elementare di astrazione Astrazione sui da. ü la dichiarazione di una variabile perme5e di introdurre un nome simbolico per una locazione di memoria, astraendo sui de5agli della ges;one della memoria Astrazione sul controllo ü la dichiarazione del nome di una funzione (procedura) perme5e di associare un nome simbolico a una sequenza di comandi. Questa possibilità è essenziale nel processo di astrazione procedurale
4 En;tà denotabili En;tà denotabili: elemen; di un linguaggio di programmazione a cui posso assegnare un nome En;tà i cui nomi sono defini2 dal linguaggio di programmazione (;pi primi;vi, operazioni primi;ve, ) En;tà i cui nomi sono defini2 dall utente (variabili, parametri, procedure, ;pi, costan; simboliche, classi, oggek, )
5 Binding e scope Un binding è una associazione tra un nome e un ogge5o Lo scope di un binding definisce quella parte del programma nella quale il binding è akvo
6 Binding ;me Il binding 2me definisce il momento temporale nel quale viene definita una associazione Più in generale, il binding ;me definisce il momento nel quale vengono prese le decisioni rela;ve alla ges;one delle associazioni
7 Esempi di binding ;me Language design time progettazione del linguaggio binding delle operazioni primitive, tipi, costanti Program writing time tempo di scrittura del programma binding dei sottoprogrammi, 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
8 Domanda In Java, qual è il binding ;me per l associazione tra il nome di un metodo e il codice effekvo del metodo? o program ;me? o compile ;me? o run ;me?
9 Sta;co & dinamico Il termine static (dynamic) binding è solitamente utilizzato per fare riferimento a una associazione attivata prima di mandare (dopo aver mandato) il programma in esecuzione Molte delle caratteristiche dei linguaggi di programmazione dipendono dalla scelta del binding time statico o dinamico I linguaggi compilati cercano di risolvere il binding staticamente I linguaggi interpretati devono risolvere il binding dinamicamente
10 Ambiente L ambiente è definito come l insieme delle associazioni nome-ogge5o esisten; a run ;me in uno specifico punto del programma e in uno specifico momento dell esecuzione Nella macchina astra7a del linguaggio, per ogni nome e per ogni sezione del programma l ambiente determina l associazione corre7a
11 Ambiente e dichiarazioni Le dichiarazioni sono il costru5o linguis;co che perme5e 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
12 Ambiente e dichiarazioni { int x; x = 22; { char x; x = 'a'; } } lo stesso nome, la variabile x, denota due oggek differen;
13 Ambiente e dichiarazioni Class A { } A a1 = new A( ); A a2 = new A( ); : a1 = a2; Aliasing: nomi diversi per lo stesso oggeqo
14 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
15 Blocchi A: { int avar; avar = 2; B: { char avar; avar = 'a'; } } blocco inline politica di accesso ai blocchi: LIFO apri blocco A; apri blocco B; chiudi blocco B; chiudi blocco A; I cambiamen. dell ambiente avvengono all entrata e all uscita dai blocchi (anche annida.)
16 Tipi di ambiente Ambiente locale: l insieme delle associazioni dichiarate localmente, compreso le eventuali associazioni rela;ve ai parametri Ambiente non locale: associazioni dei nomi che sono visibili all interno del blocco ma non dichiara; nel blocco stesso Ambiente globale: associazioni per i nomi usabili da tu5e le componen; che cos;tuiscono il programma
17 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 Ambiente non locale per C associazione per b ereditata da B associazione globale per a Ambiente Globale associazione per a Cosa stampa?
18 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; ^
19 Cambiamen; dell ambiente L ambiente può cambiare a run time, 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
20 Operazioni su ambien; 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
21 Implementazione dell ambiente 21
22 Ambiente (env) Tipo (polimorfo) u;lizzato nella seman;ca e nelle implementazioni per mantenere il binding tra nomi e valori di un opportuno ;po La specifica definisce il ;po come funzione L implementazione che vedremo u;lizza le liste 22
23 Ambiente: interfaccia # module type ENV = sig end 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 23
24 Ambiente: seman;ca # 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
25 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
26 Scope Lo scope di un binding definisce quella parte del programma nella quale il binding è akvo o scope sta2co o lessicale: è determinato dalla stru5ura sintakca del programma o scope dinamico: è determinato dalla stru5ura a tempo di esecuzione Come vedremo, differiscono solo per l ambiente non locale
27 Regole di scope (scoping sta;co) A: { int x = 0; void proc( ){ x = x + 1; } B: { int x = 5; proc( ); } } printf("%d\n", x); quale valore di x viene stampato? Ccope sta2co: la variabile x nel corpo di proc è legata alla dichiarazione che la precede sintakcamente, cioè quella in A
28 Regole di visibilità Una dichiarazione locale in un blocco è visibile o in quel blocco o in tuk i blocchi in esso annida; o salvo ri-dichiarazioni dello stesso nome (mascheramento, shadowing) La regola di visibilità (cioè l annidamento) è basata o sul testo del programma (scope sta2co) o sul flusso di esecuzione (scope dinamico)
29 Scope sta;co Le dichiarazioni locali in un blocco includono solo quelle presen; nel blocco, e non quelle dei blocchi in esso annida; 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 par;re 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)
30 Scope sta;co: esempio int main( ) { int x = 0; void proc(int n) { x = n+1; } proc(2); prink("%d\n", x); { int x = 0; proc(3); prink("%d\n", x); } prink("%d\n", x); } Cosa stampa? Stampa 3 Stampa 0 Stampa 4
31 Scope sta2co: discussione 31
32 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
33 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
34 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
35 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 akva quando il flusso di esecuzione arriva a P Come vedremo, lo scope dinamico ha una ges;one a run ;me semplice o vantaggi: flessibilità nei programmi o svantaggi: difficile comprensione delle chiamate delle procedure e controllo sta;co dei ;pi non possibile
Nomi e Ambiente. Nicola Fanizzi. Linguaggi di Programmazione [010194] 20 apr, 2016. Dipartimento di Informatica Università degli Studi di Bari
Nomi e Ambiente Nicola Fanizzi Dipartimento di Informatica Università degli Studi di Bari Linguaggi di Programmazione [010194] 20 apr, 2016 Sommario 1 Nomi Definizione Astrazione Elementare Progettazione
Funzioni, Stack e Visibilità delle Variabili in C
Funzioni, Stack e Visibilità delle Variabili in C Programmazione I e Laboratorio Corso di Laurea in Informatica A.A. 2016/2017 Calendario delle lezioni Lez. 1 Lez. 2 Lez. 3 Lez. 4 Lez. 5 Lez. 6 Lez. 7
INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica
Fondamenti di Informatica INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica - Programma Un programma è una formulazione
INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma
Fondamenti di Informatica INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica - Programma Un programma è una formulazione
Programmazione Orientata agli Oggetti in Linguaggio Java
Programmazione Orientata agli Oggetti in Linguaggio Java Classi e Oggetti: Metafora Parte a versione 2.2 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
Semantica statica e dinamica
Semantica statica e dinamica 1 Fasi di compilazione Programma sorgente Analisi lessicale front end Analisi sintattica Tabella dei simboli Analisi semantica Generatore di codice intermedio error handler
Corso sul linguaggio Java
Corso sul linguaggio Java Modulo JAVA2 2.1- Funzioni 1 Prerequisiti Programmazione elementare in Java Tecnica top-down Concetto matematico di funzione Compilazione e link di programmi Esecuzione di funzioni
PROGRAMMAZIONE 2 5. Dynamic dispatch
PROGRAMMAZIONE 2 5. Dynamic dispatch PR2 2017-2018 1 Cosa significa? La dichiarazione di una variabile non determina in maniera univoca il >po dell oggeao che la variabile riferisce Cerchiamo di capire
Le basi del linguaggio Java
Le basi del linguaggio Java Compilazione e interpretazione Quando si compila il codice sorgente scritto in Java, il compilatore genera il codice compilato, chiamato bytecode. È un codice generato per una
IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale
Fondamenti di Informatica IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale Fondamenti di Informatica - D. Talia - UNICAL 1 Lettura di dati da input In Java la lettura di dati da input
Programmazione con Java
Programmazione con Java Classi e istanze in Java Definizione di classe in Java A meno che non si usino classi già scritte da altri, prima di poter creare un qualsiasi oggetto devo creare la sua rappresentazione:
Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri
Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri
Scope, Memoria e Tabella dei Simboli
Scope, Memoria e Tabella dei Simboli La tabella dei simboli è uno strumento fondamentale attraverso il quale interpreti e compilatori implementano la traduzione da un programma scritto in un linguaggio
Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore
Programma del corso Introduzione agli algoritmi Rappresentazione delle Informazioni Architettura del calcolatore Reti di Calcolatori Elementi di Programmazione Algoritmi e programmi Algoritmo Sequenza
Corso di Linguaggi di Programmazione
Corso di Linguaggi di Programmazione Lezione 15 Alberto Ceselli [email protected] Dipartimento di Tecnologie dell Informazione Università degli Studi di Milano 05 Maggio 2009 Programming in the
Capitolo 5 - Funzioni
Capitolo 5 - Funzioni Divide and conquer Introduzione Costruire un programma da pezzi più piccoli o da singole componenti Questi pezzi più piccoli sono chiamati moduli Ogni singolo pezzo è più facilmente
Allocazione Dinamica della Memoria
Allocazione Dinamica della Memoria Elisa Marengo Università degli Studi di Torino Dipartimento di Informatica Elisa Marengo (UNITO) Allocazione Dinamica della Memoria 1 / 10 Scelta delle variabili Quando
Modulo 2: Strutture fondamentali della programmazione Java
Modulo 2: Strutture fondamentali della programmazione Java Argomenti Trattati: Un semplice programma Java: Presentazione di un primo Esempio; Introduzione alla struttura; Compilazione ed esecuzione. Argomenti
Lezione 6. Visibilità degli identificatori e tempo di vita degli oggetti
Lezione 6 Visibilità degli identificatori e tempo di vita degli oggetti Programmazione I Paolo Valente - 2009/2010 Ripasso dichiarazioni oggetti Finora abbiamo scritto le dichiarazioni di variabili e costanti
7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari
7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa
Linguaggi di Programmazione Corso C. Parte n.10 Gestione della Memoria. Nicola Fanizzi
Linguaggi di Programmazione Corso C Parte n.10 Gestione della Memoria Nicola Fanizzi ([email protected]) Dipartimento di Informatica Università degli Studi di Bari Gestione della Memoria I moderni linguaggi
<programma> ::= {<unità-di-traduzione>} <main> {<unità-di-traduzione>}
STRUTTURA DI UN PROGRAMMA C In prima battuta, la struttura di un programma C è definita nel modo seguente: ::= {} {} Intuitivamente un programma
Il linguaggio C. Puntatori e dintorni
Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;
Esempio 2: Subtyping
Esempio 2: Subtyping 22 Subclassing e subtyping Fino ad ora abbiamo trattato l ereditarietà come strumento che consente il riuso flessibile di classi già esistenti mediante l aggiunta o la ridefinizione
Visibilità e tempo di vita delle variabili. (più sintesi di alcuni concetti della prima parte del corso)
Visibilità e tempo di vita delle variabili (più sintesi di alcuni concetti della prima parte del corso) Struttura dei programmi C/C++ Un programma C/C++ deve essere contenuto in uno o più file (per ora
Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:
Le classi in java Un semplice programma java, formato da una sola classe, assume la seguente struttura: class Domanda static void main(string args[]) System.out.println( Quanti anni hai? ); La classe dichiarata
19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo
19 - Eccezioni Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso
Gestione della Memoria
Gestione della Memoria Nicola Fanizzi Dipartimento di Informatica Università degli Studi di Bari Linguaggi di Programmazione [010194] 27 apr, 2016 Sommario 1 Tecniche di gestione Progetto della gestione
