1 Implementazione di Linguaggi 2 PARTE 6 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
2 TYPE CHECKING TYPE CHECKING Si divide in statico se eseguito durante la compilazione e dinamico se eseguito durante lesecuzione 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;
3 RUOLO del TYPE CHECKER Sostanzialmente controllare che le operazioni vengano applicate a tipi compatibili.
4 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 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 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:Un costruttore di tipo applicato ad una type expression produce una type expression nel modo seguente:
5 TYPE EXPRESSIONS 1.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 2.Prodotti Cartesiani: se T 1 e T 2 sono TE allora T 1 T 2 è una TE che denota linsieme delle coppie (t 1,t 2 ) con t 1 T 1 e t 2 T 2 ( associa a sinistra) 3.Record: è il prodotto del tipo dei suoi campi, differisce dal prodotto per la commutatività degli elementi dovuta alla selezione mediante il nome 4.Puntatori: se T è una TE allora pointer(T) è una TE che denota un riferimento (puntatore) ad un oggetto di tipo T 5.Funzioni: è il tipo di una funzione che mappa un tipo dominio D in un tipo rango R e denotato D R.
6 TYPE EXPRESSIONS NEW 6.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.
7 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 tipo type- error ad ogni dato del programma, allora nessun errore di tipo si può verificare durante lesecuzione.
8 TYPE CHECKING: UNO SCHEMA di TRADUZIONE DS Un semplice type checker P D;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: integer; key mod 1999 key mod 1999 Aggiunto il tipo base type_error si ha
9 Uno SdT di un semplice Type Checker P D;E D D;D D id:T addtype(id.entry,T.type) D id:T addtype(id.entry,T.type) T char T.type:=char T char T.type:=char T integer T.type:=integer T integer T.type:=integer T array[num] of T 1 T.type:=array(num.val,T 1 ) T array[num] of T 1 T.type:=array(num.val,T 1 ) T ^T 1 T.type:=pointer(T 1.type) T ^T 1 T.type:=pointer(T 1.type)
10 Type Checking di Espressioni E literal E.type:=char E literal E.type:=char E id E.type:=lookup(id.entry) E id E.type:=lookup(id.entry) E num E.type:=integer E num E.type:=integer E E 1 mod E 2 E.type:=if E1.type=integer & E2.type=integer then integer else type_error E E 1 mod E 2 E.type:=if E1.type=integer & E2.type=integer then integer else type_error E E 1 [E 2 ] E.type:=if E 2.type=integer & E 1.type=array(s,t) then t else type_error type_error E E 1 ^ E.type:=if E 1.type=pointer(t) then t else type_error E E 1 ^ E.type:=if E 1.type=pointer(t) then t else type_error
11 Type Checking di Istruzioni S id:=E S.type:=if id.type=E.type then void else type_error S id:=E S.type:=if id.type=E.type then void else type_error S if E then S 1 S.type:= if E.type =boolean then S 1.type else type_error S if E then S 1 S.type:= if E.type =boolean then S 1.type else type_error S while E do S 1 S.type:=if E.type=boolean then S 1.type else type_error S while E do S 1 S.type:=if E.type=boolean then S 1.type else type_error S S 1 ;S 2 S.type:=if S 1.type=void & S2.type=void then S.type=void S2.type=void then S.type=void else type_error else type_error
12 Type Checking di Funzioni T T 1 T 2 T.type:=T 1.type T 2.type T T 1 T 2 T.type:=T 1.type T 2.type E E 1 (E 2 ) E.type:=if E 2.type=s & E1.type=s t then t else type_error E E 1 (E 2 ) E.type:=if E 2.type=s & E1.type=s t then t else type_error
13 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 strutturale (Fortran, C, C++...) Equivalenza per nome (Modula, Oberon, Ada)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.
14 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: 1.VAR a,b:ARRAY[1..n] OF REAL; (* a,b equiv. primo tipo*) 2.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: 3.TYPE T=T; Altri linguaggi (PL/M) che adottano lequivalenza per nome considerano I tipi T e T definiti in 3. non equivalenti.
15 Fine Type checking Proseguire con gli argomenti del seminario sul type checking