1 / 15

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. TYPE CHECKING.

willow
Télécharger la présentation

Implementazione di Linguaggi 2 PARTE 6

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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;

  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 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:

  5. 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 T1T2 è una TE che denota l’insieme delle coppie (t1,t2) con t1T1 e t2T2 ( 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 DR.

  6. 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.

  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 l’esecuzione.

  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 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) T char T.type:=char Tinteger T.type:=integer Tarray[num] of T1 T.type:=array(num.val,T1) T^T1 T.type:=pointer(T1.type)

  10. Type Checking di Espressioni E literal E.type:=char E id E.type:=lookup(id.entry) Enum E.type:=integer EE1 mod E2 E.type:=if E1.type=integer & E2.type=integer then integer else type_error EE1[E2] E.type:=if E2.type=integer & E1.type=array(s,t) then t else type_error EE1^ E.type:=if E1.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if E then S1 S.type:= if E.type =boolean then S1.type else type_error Swhile E do S1 S.type:=if E.type=boolean then S1.type else type_error SS1;S2 S.type:=if S1.type=void & S2.type=void then S.type=void else type_error

  12. Type Checking di Funzioni TT1””T2T.type:=T1.typeT2.type EE1(E2) E.type:=if E2.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 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: • 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.

  15. Fine Type checking Proseguire con gli argomenti del seminario sul type checking

More Related