Examen

Mencione las principales tareas que conforman la etapa de análisis semántico en el proceso de compilación

El análisis semántico es una fase del procesamiento del lenguaje que verifica y da significado desde el AST del análisis sintáctico por lo que es altamente dependiente de las específicaciones del lenguaje que es lo significante. Sin embargo, podemos decir que algunos lenguajes tienen como requerimento: contextos («scoping» o alcance), resolución de nombre, tipos y puntos de entrada que deben ser verificados o dados, los cuales son tareas propias de la fase de la análisis semántico.

Proporcione ejemplo de código en Cool para un error de scope y otro para un error de tipos

Un error de «scope» es:

class Main {
  scan(): Object {
    let x: String <- "1" in {true}
  };
  main() : Object {
     x
  };
};

x está definido en scan, pero en main.

Un error de tipos es:

class Main {
  main(): Bool {
     5/5
  };
};

El método main en su firma afirma regresar un Bool, mientras que la expresión que regresa realmente es de tipo Int. El error sucede porque Int no es un subtipo de Bool.

Explique con sus propias palabras qué es el Sistema de Tipos

«Sistema de tipos» es un sistema lógico que específica un conjunto de reglas que asignan tipo a cada expresión en un contexto dado (ambiente de tipos).

Donde tipo es un conjunto de valores y operaciones permitidas.

Describa la diferencia entre un Sistema de Tipos estático y uno dinámico. Mencione las ventajas y desventajas para cada uno de ellos.

En un sistema de tipos estático los tipos son determinados en tiempo de compilación, mientras que en los dinámicos los tipos son determinados en tiempo de ejecución.

Sistema de tipos VentajasDesventajas
EstáticoPermite detectar errores lo antes posible.
Aumenta el tiempo de ejecución.
Permite encontrar más rápido los errores.
Aumenta el tiempo de compilación.
Restrictivo.
DinámicoPermite el prototipado rápido.
Permisivo.
A veces resulta díficil cual es el error.
Disminuye el tiempo de ejecución.

¿Qué significa que un Sistema de Tipos sea «sound»?

En lógica, un argumento deductivo es sólido («sound») cuando es válido y todas sus premisas son verdaderas.

Analógamente, un sistema de tipos cuando todas su reglas son sólidas y una regla es sólida cuando es demostrable que cada expresión con su tipo refleja el mismo tipo que dicha expresión evaluada.

Ejemplo de regla sólida:

e1:T1isvoid e1:Bool\dfrac{\vdash e_1:T_1\\ }{\vdash \text{isvoid } e_1 : Bool}

Ejemplo de regla no sólida:

e1:Int e2:Inte1<e2:Int\dfrac{\vdash e_1:Int \text{ } \vdash e_2:Int}{ \vdash e_1 <e_2 : Int}

¿Qué implicaciones tiene aplicar la regla de subtipos en el análisis semántico?

La regla de subtipos habilita a los lenguajes manejar relaciones de herencia y el polimorfismo, añadiendo flexibilidad por que los subtipos pueden extender al tipo sin tener que empezar de cero.

Además que los subtipos no podían manejar en fases previas porque no contaba con la información suficiente ni con las herramientas propias del análisis semántico.

Muestre la derivación completa de tipos para lo siguiente

Ilustre el árbol con sus tres capas, AST, Type env. y Types:

O[Int/a][Int/b][Int/c]ac+{ if a<b then a else b fi;}:IntO[Int/a][Int/b][Int/c] ⊢ a ← c + \{ \text{ if } a < b \text{ then } a \text{ else } b \text{ fi}; \} : Int
Basado en el diapositiva 60 de «lecture11type.pdf».

La asunción O (ambiente de tipos) es trasmitida a los nodos hoja porque debe mantenerse el mismo «scope» que el nodo padre.