150 likes | 259 Views
Implementazione di Linguaggi 2 PARTE 6. Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman Compilers Principles,Techniques and Tools, Addison Wesley. TYPE CHECKING.
E N D
Implementazione di Linguaggi 2PARTE 6 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman Compilers Principles,Techniques and Tools, Addison Wesley
TYPE CHECKING • Si divide in statico se eseguito durante la compilazione e dinamico se eseguito durante l’esecuzione del programma. • È affiancato da altri controlli: • flow-of-control: (goto return exit …) • unicità di definizione: identificatori nello stesso scope, label dei switch/case • controlli contestuali dei nomi es. (Modula) • PROCEDURE P;…END P;
RUOLO del TYPE CHECKER Sostanzialmente controllare che le operazioni vengano applicate a tipi compatibili.
TYPE EXPRESSIONS Denotano i tipi di un linguaggio e sono quindi fortemente dipendenti da esso. Qui ci si attiene alla definizione seguente: • Un tipo base (int,float, integer, real, complex...) è una type expression; • Un tipo può avere un nome, per cui il nome di un tipo è una type expression; • Un costruttore di tipo applicato ad una type expression produce una type expression nel modo seguente:
TYPE EXPRESSIONS • Array : se T è una TE allora array(I,T) è una TE che denota un il tipo di un array di tipo base T e tipo indice I • Prodotti Cartesiani: se T1 e T2 sono TE allora T1T2 è una TE che denota l’insieme delle coppie (t1,t2) con t1T1 e t2T2 ( associa a sinistra) • Record: è il prodotto del tipo dei suoi campi, differisce dal prodotto per la commutatività degli elementi dovuta alla selezione mediante il nome • Puntatori: se T è una TE allora pointer(T) è una TE che denota un riferimento (puntatore) ad un oggetto di tipo T • Funzioni: è il tipo di una funzione che mappa un tipo dominio D in un tipo rango R e denotato DR.
TYPE EXPRESSIONS NEW • Class : è un incrocio tra il concetto di modulo e di tipo. È modellabile come un record con campi di tipo procedura e funzione detti i metodi.
TYPE SYSTEM Collezione di regole per assegnare Type Expression alle parti di un programma. Un Type Checker (TC) è un programma che implementa un Type Sysytem. È interessante implementare type system con DGDS. Ogni TC può essere applicato a run time purchè il codice oggetto contenga informazioni che specificano il tipo di ogni dato. Un type system è detto sound se elimina la necessità di type checking a run time, cioè, se il TC assegna un tipotype-error ad ogni dato del programma, allora nessun errore di tipo si può verificare durante l’esecuzione.
TYPE CHECKING: UNO SCHEMA di TRADUZIONE DS Un semplice type checker PD;E D D;D | id: T T char|integer|array[num] of T| ^T E literal | num | id | E mod E | E[E] | E^ Esempio key: integer; key mod 1999 Aggiunto il tipo base type_error si ha
Uno SdT di un semplice Type Checker PD;E DD;D Did:T addtype(id.entry,T.type) T char T.type:=char Tinteger T.type:=integer Tarray[num] of T1 T.type:=array(num.val,T1) T^T1 T.type:=pointer(T1.type)
Type Checking di Espressioni E literal E.type:=char E id E.type:=lookup(id.entry) Enum E.type:=integer EE1 mod E2 E.type:=if E1.type=integer & E2.type=integer then integer else type_error EE1[E2] E.type:=if E2.type=integer & E1.type=array(s,t) then t else type_error EE1^ E.type:=if E1.type=pointer(t) then t else type_error
Type Checking di Istruzioni Sid:=E S.type:=if id.type=E.type then void else type_error Sif E then S1 S.type:= if E.type =boolean then S1.type else type_error Swhile E do S1 S.type:=if E.type=boolean then S1.type else type_error SS1;S2 S.type:=if S1.type=void & S2.type=void then S.type=void else type_error
Type Checking di Funzioni TT1””T2T.type:=T1.typeT2.type EE1(E2) E.type:=if E2.type=s & E1.type=st then t else type_error
Equivalenza di Tipo I linguaggi usano diversi modi e definizioni per stabilire che due tipi sono equivalenti. Vi sono due approcci principali: • Equivalenza strutturale (Fortran, C, C++...) • Equivalenza per nome (Modula, Oberon, Ada) Le illustriamo con un esempio. In Modula-2 le definizioni seguenti: TYPE A=ARRAY[0..n] OF REAL;B=ARRAY[0..n] OF REAL; Definiscono due tipi non equivalenti, perchè dotati di nome diverso (equivalenza per nome). Tuttavia, A e B sono identici e quindi strutturalmente equivalenti.
Equivalenza per Nome Due variabili hanno tipi equivalenti (per nome) se sono dichiarate insieme con la stessa dichiarazione o se dichiarate in parti diverse del programma usano lo stesso identificatore di tipo: • VAR a,b:ARRAY[1..n] OF REAL; (* a,b equiv. primo tipo*) • PROCEDURE Q(a: T): (* a,b equiv. secondo tipo*) VAR b: T; (* a,b equiv. secondo tipo*) I linguaggi Pascal like adottano una regola ulteriore: due nomi di tipo T e T’ dichiarati come segue denotano tipi equivalenti: • TYPE T’=T; Altri linguaggi (PL/M) che adottano l’equivalenza per nome considerano I tipi T e T’ definiti in 3. non equivalenti.
Fine Type checking Proseguire con gli argomenti del seminario sul type checking