1 Implementazione di Linguaggi 2 Implementazione di Linguaggi 2 Federico Bernardi Type checking 2° parte Type checking 2° parte - Equivalenza di type expressions.

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

Strutture dati per insiemi disgiunti
INFORMATICA Algoritmi fondamentali
Le funzioni UD. 8 – Lorganizzazione dei programmi p. 309 LS Tron 4TC 06/07.
Traduzione guidata dalla sintassi
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Type Checking (1° parte)
Generazione di Codice Intermedio
Algoritmi e Programmazione
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
Grafi Algoritmi e Strutture Dati. Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati 2/ed 2 Copyright © The McGraw.
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
Alberi binari di ricerca
1 Istruzioni, algoritmi, linguaggi. 2 Algoritmo per il calcolo delle radici reali di unequazione di 2 o grado Data lequazione ax 2 +bx+c=0, quali sono.
Reaching Definitions. Tino CortesiTecniche di Analisi di Programmi 2 Reaching definitions Dato un punto del programma, quali sono i comandi di assegnamento.
Semantica Denotazionale
Semantiche dei linguaggi di programmazione
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Esercizi su alberi binari
Tail recursion: esempio
Informatica di base A.A. 2003/2004 Algoritmi e programmi
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Capitolo 9 Il problema della gestione di insiemi disgiunti (Union-find) Algoritmi e Strutture Dati.
Capitolo 7 Tavole hash Algoritmi e Strutture Dati.
1 Corso di Informatica (Programmazione) Lezione 10 (12 novembre 2008) Programmazione in Java: espressioni booleane e controllo del flusso (selezione)
Eliana minicozzi linguaggi L1 Lezione3.
eliana minicozzi linguaggi1a.a lezione2
1 2. Analisi degli Algoritmi. 2 Algoritmi e strutture dati - Definizioni Struttura dati: organizzazione sistematica dei dati e del loro accesso Algoritmo:
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
Il linguaggio Fortran 90: 2. Istruzioni di Controllo
Introduzione alla programmazione lll
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Semantica Operazionale Strutturata
Esercizi su pile Scrivere una funzione che restituisca una nuova pila che contiene i valori di una pila in ingresso in ordine inverso. La pila originale.
Esercizi su alberi binari
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
Unità Didattica 2 I Linguaggi di Programmazione
nome: sequenza di caratteri usata per denotare un oggetto
mosaic manipola oggetti primitivi (ruota e unisci) regole:
Strutture di controllo in C -- Flow Chart --
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Il Linguaggio C.
Espressioni condizionali
Algoritmi e Programmazione (in C) Stefano Cagnoni e Monica Mordonini
Elementi di Informatica di base
1.Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. 2.Scrivere.
Programmazione Mod. B - prof. Burattini - Cap 17 1.
CODIFICA Da flow-chart a C++.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
Unità Didattica 3 Linguaggio C
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Tail recursion: esempio
Esercizi su alberi binari di ricerca
Sistemi e Tecnologie Informatiche Ricorsione Umberto Ferraro Petrillo.
Il linguaggio Fortran 90: 3. Procedure e Funzioni
Il linguaggio C Puntatori e dintorni.
4/5/2015E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2010 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo – Algoritmi.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
1 Tipi di Dato §descrittori, tipi, controllo e inferenza dei tipi §specifica (semantica) e implementazione di tipi di dato l implementazioni “sequenziali”
Algoritmi e Strutture Dati Strutture Dati Elementari.
13 ottobre Decisioni F. Bombi 13 ottobre 2002.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
1 Tipi di dato modificabili §a livello semantico, riconduciamo la modificabilità alla nozione di variabile l lo stato “modificabile” corrispondente sarà.
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi su Alberi.
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Transcript della presentazione:

1 Implementazione di Linguaggi 2 Implementazione di Linguaggi 2 Federico Bernardi Type checking 2° parte Type checking 2° parte - Equivalenza di type expressions - Type conversion

2 Implementazione di Linguaggi 2 Implementazione di Linguaggi 2 Testi di riferimento: Compilers, Principles, Technique, and Tools Compilers, Principles, Technique, and Tools Lucidi Prof. Ancona Lucidi Prof. Ancona

3 Equivalenza di Type expressions I linguaggi di programmazione usano diversi modi e definizioni per stabilire che due tipi sono equivalenti.I linguaggi di programmazione usano diversi modi e definizioni per stabilire che due tipi sono equivalenti. I due approcci principali sono: I due approcci principali sono: Strutturale (Fortrand, C, C++,...)Strutturale (Fortrand, C, C++,...) Per nome (Modula, Oberon, Ada)Per nome (Modula, Oberon, Ada)

4 Equivalenza Strutturale Due espressioni sono strutturalmente equivalenti se sono lo stesso tipo di base o sono ottenute applicando lo stesso costruttore a tipi strutturalmente equivalenti. In altre parole due espressioni sono strutturalmente equivalenti se e solo se sono identiche.

5 Equivalenza Strutturale Algoritmo per definire in maniera ricorsiva se due tipi sono strutturalmente equivalenti: Function sequiv(s,t): boolean Begin if s and t are the same type then return true else if s = array(s 1,s 2 ) and t = array(t 1,t 2 ) then return sequiv(s 1,t 1 ) and sequiv(s 2,t 2 ) else if s = s 1 x s 2 and t = t 1 x t 2 then return sequiv(s 1,t 1 ) and sequiv(s 2,t 2 ) return sequiv(s 1,t 1 ) and sequiv(s 2,t 2 ) else if s = pointer (s 1 ) and t = pointer(t 1 ) then return sequiv(s 1,t 1 ) return sequiv(s 1,t 1 ) else if s = s 1 s 2 and t = t 1 t 2 then return sequiv(s 1,t 1 ) and sequiv(s 2,t 2 ) return sequiv(s 1,t 1 ) and sequiv(s 2,t 2 )else return false end

6 Codifica di una Type Expression Spesso è possibile rappresentare type expression in modo codificato (stringhe di bit o interi binari) in modo che lequivalenza possa essere verificata efficientemente anche con il confronto di bit. Spesso è possibile rappresentare type expression in modo codificato (stringhe di bit o interi binari) in modo che lequivalenza possa essere verificata efficientemente anche con il confronto di bit. Vediamo un esempio preso dal compilatore di C scritto da Ritchie. Vediamo un esempio preso dal compilatore di C scritto da Ritchie.

7 Codifica di una Type Expression Vogliamo confrontare: Vogliamo confrontare: char char freturns(char) freturns(char) pointer(freturns(char)) pointer(freturns(char)) array(pointer(freturns(char))) array(pointer(freturns(char))) Tutte queste espressioni possono essere rappresentate con una sequenza di bit usando un semplice schema. Tutte queste espressioni possono essere rappresentate con una sequenza di bit usando un semplice schema.

8 Codifica di una Type Expression Type Constructor Encoding pointerarrayFreturns Usiamo due bit per codificare il costruttore

9 Codifica di una Type Expression Type Constructor Encoding booleancharintegerreal Usiamo quattro bit per codificare i tipi base

10 Codifica di una Type Expression Le espressioni di tipo precedentemente descritte si possono codificare in questo modo: Type Constructor Encoding charfreturns(char)pointer(freturns(char))array(pointer(freturns(char)))

11 Codifica di una Type Expression Due differenti sequenze di bit non possono rappresentare lo stesso tipo perché i tipi base o i costruttori delle type expression sono differenti. Due differenti sequenze di bit non possono rappresentare lo stesso tipo perché i tipi base o i costruttori delle type expression sono differenti. Questo sistema è più efficiente dei quello che verifica lequivalenza ricorsivamente. Questo sistema è più efficiente dei quello che verifica lequivalenza ricorsivamente.

12 Equivalenza per nome Il problema dei nomi: Il problema dei nomi: Type link = ^cell; Var next : link; last : link; p : ^cell; q,r : ^cell; Le variabili next, last, p, q, r sono tutte dello stesso identico tipo? Le variabili next, last, p, q, r sono tutte dello stesso identico tipo? Dipende!!! Per esempio in Iso-Pascal NO! Dipende!!! Per esempio in Iso-Pascal NO!

13 Equivalenza per nome Quando si ammettono nomi nelle Type Expression, lequivalenza delle espressioni dipende da come vengono trattati i nomi. Quando si ammettono nomi nelle Type Expression, lequivalenza delle espressioni dipende da come vengono trattati i nomi. Abbiamo due alternative: variabile type expression Equiv. Strutt. Equiv. nome Pascal nextlastpqrlinklinkpointer(cell)pointer(cell)pointer(cell)StessoTipoStessoTipoStessoTipoTipoTipoTipo

14 Equivalenza per nome Il Pascal associa lo stesso nome per difetto a tutte le dichiarazioni di variabile associate allo stesso tipo. Il Pascal associa lo stesso nome per difetto a tutte le dichiarazioni di variabile associate allo stesso tipo. I tipi vengono descritti, nell implementazione, da un type graph. I tipi vengono descritti, nell implementazione, da un type graph. Ogni volta che viene scandito un nuovo tipo costruttore o tipo base viene aggiunto un nuovo nodo. Ogni volta che viene scandito un nuovo tipo costruttore o tipo base viene aggiunto un nuovo nodo. Ogni volta che viene scandito un nome di tipo viene creata una nuova foglia tenendo traccia della type expression cui si riferisce. Ogni volta che viene scandito un nome di tipo viene creata una nuova foglia tenendo traccia della type expression cui si riferisce.

15 Equivalenza per nome Con questa rappresentazione due type expression sono equivalenti se esse sono rappresentate dallo stesso nodo del grafo. Con questa rappresentazione due type expression sono equivalenti se esse sono rappresentate dallo stesso nodo del grafo. cell Link = pointerpointer nextlastp q r = associazioni tra variabili e nodi nel grafo

16 Trattamento dei cicli nelle definizioni di tipo Strutture di dati basi come liste lincate e alberi sono definiti spesso ricorsivamente. Strutture di dati basi come liste lincate e alberi sono definiti spesso ricorsivamente. Queste strutture di dati sono solitamente implementate usando record che contengono puntatori a record simili Queste strutture di dati sono solitamente implementate usando record che contengono puntatori a record simili

17 Trattamento dei cicli nelle definizioni di tipo Consideriamo un esempio con una lista lincata contenente un valore intero ed un puntatore alla cella successiva della lista. Consideriamo un esempio con una lista lincata contenente un valore intero ed un puntatore alla cella successiva della lista. Pichiarazione del tipo alla Pascal: Pichiarazione del tipo alla Pascal: Type link = ^cell; cell = record cell = record info : integer; next : link; end; end; Link è definito usando cell e cell è definito usando link (definizione ricirsiva). Link è definito usando cell e cell è definito usando link (definizione ricirsiva).

18 Trattamento dei cicli nelle definizioni di tipo I nomi di tipo definiti ricorsivamente possono essere sostituiti se introduciamo un ciclo nel grafo dei tipi. I nomi di tipo definiti ricorsivamente possono essere sostituiti se introduciamo un ciclo nel grafo dei tipi. Cell = record x xx infointegernextpointer Cell Cell = record x xx infointegernextpointer Usando un cicli possiamo eliminare la menzione a cell

19 Trattamento dei cicli nelle definizioni di tipo Il C risolve i cicli nel grafo dei tipi usando lequivalenza strutturale per tutti i tipi eccetto che per i record. Una dichirazione di cell i C sarebbe: Il C risolve i cicli nel grafo dei tipi usando lequivalenza strutturale per tutti i tipi eccetto che per i record. Una dichirazione di cell i C sarebbe: Struct cell{ int info; struct cell *next; } Il C usa una rappresentazione aciclica come nella prima figura. Il C usa una rappresentazione aciclica come nella prima figura. C e Pascal richiedono che i nomi dei tipi vengano dichiarati pima di essere usati, con leccezione di puntatori a tipi non dichiarati. C e Pascal richiedono che i nomi dei tipi vengano dichiarati pima di essere usati, con leccezione di puntatori a tipi non dichiarati.

20 Type conversion Consideriamo unespressione come x+i dove x è un reale ed ì è un intero. Consideriamo unespressione come x+i dove x è un reale ed ì è un intero. Poiché la loro rappresentazione interna è differente, sono differenti anche gli algoritmi per le operazioni aritmetiche. Poiché la loro rappresentazione interna è differente, sono differenti anche gli algoritmi per le operazioni aritmetiche. Il compilatore sa che è necessaria una conversione di tipo, usualmente la conversione è verso lelemento alla sinistra Il compilatore sa che è necessaria una conversione di tipo, usualmente la conversione è verso lelemento alla sinistra

21 Type conversion Il type checker può essere usato allo scopo introducendo una notazione postfissa come la seguente: Il type checker può essere usato allo scopo introducendo una notazione postfissa come la seguente: x i inttoreal real+ x i inttoreal real+ Quando la conversione viene automaticamente fatta dal compilatore si chiama Coercions. Quando la conversione viene automaticamente fatta dal compilatore si chiama Coercions.

22 Overloading E possibile, in molti linguaggi, attribuire ad un entità significati diversi a seconda del contesto in cui compare. E possibile, in molti linguaggi, attribuire ad un entità significati diversi a seconda del contesto in cui compare. Ad esempio A+B può significare: Somma tra interi Somma tra interi Somma tra reali Somma tra reali Somma tra complessi Somma tra complessi Somma di matrici Somma di matrici Somma di insiemi Somma di insiemi ………………. ……………….

23 Overloading Loverload si dice risolvibile quando è possibile dedurre un unico significato di un simbolo in unistanza di un programma. Loverload si dice risolvibile quando è possibile dedurre un unico significato di un simbolo in unistanza di un programma. NON è sempre possibile risolvere loverload dallanalisi del contesto. NON è sempre possibile risolvere loverload dallanalisi del contesto.