Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2022
Video 1
Compiladores
Análisis léxico
Analizando
Análisis semántico
Primero
Segundo
Se verificarán las relaciones de herencia entre las clases para ver si tienen sentido
No queremos que se redefinan las clases; solo queremos una clase definición por
clase. De manera similar, los métodos solo deben definirse una vez dentro de una
clase
Cool tiene una serie de identificadores reservados y se tiene que tener cuidado de
como usarlos.
En este video se habla sobre un tema que es las tablas simples una estructura de
datos importante en muchos compiladores antes de hablar de lo que es una tabla
simple quiero hablar de un algoritmo genérico que vamos a ver una y otra vez
durante el resto del curso. Por lo tanto, una gran cantidad de análisis semántico y
de hecho, una gran cantidad de generación de código puede expresarse como un
descenso recursivo de un árbol sintáctico abstracta. Y la idea básica es que en cada
paso hacemos las siguientes tres cosas. siempre estamos procesando un nodo
particular en el árbol, así que si hago un dibujo del árbol de sintaxis abstracta árbol
de sintaxis abstracta puede tener un nodo y algunos sub-árboles que cuelgan de él.
Y podemos hacer algún procesamiento del nodo antes de hacer cualquier otra cosa.
Llegamos al nodo al nodo digamos desde los padres, venimos aquí por el padre,
hacemos algún procesamiento en el nodo y sólo estoy indicando que por el color
azul para indicar que hicimos algo aquí. Y luego salimos y procesamos los hijos.
Bien. Y después procesamos los hijos, después de volver al nodo, hacemos algo
más
Esto se llama un recursivo de un árbol. Hay algunos casos en los que sólo
procesaremos cada nota antes de procesar los hijos. Otros en los que sólo
procesamos cada nota después de procesar todos los hijos. Algunos en los que
hacemos ambas cosas como se ilustra aquí en este pequeño Y volviendo al tema
principal de este video en particular. Cuando estamos realizando un análisis
semántico en una porción del árbol de sintaxis abstracta necesitamos saber qué
identificadores están definidos. ¿Qué identificadores están en alcance? Un ejemplo
de este tipo de estrategia de descenso recursivo es cómo podemos procesar los
enlaces let para rastrear el conjunto de variables que están en el ámbito. Así,
tenemos nuestro nodo let en el árbol de sintaxis fx y en un subárbol tenemos la
inicialización, y en el otro subárbol tenemos e, el cuerpo del let, y luego es un let
para alguna variable en particular, y vamos a escribir esa dentro del nodo padre.
Entonces vamos a recurrir vamos a procesar todas. del árbol de sintaxis abstracta
no des en el cuerpo de la inaudible dentro de E, y después de terminar de procesar
E, vamos a eliminar la definición de X y restaurar la antigua definición de X que
teníamos. Y una tabla de símbolos es sólo una estructura de datos que logra estas
cosas. Rastrea los enlaces actuales de los identificadores en cada punto del árbol
sintáctico abstracto. Para una tabla muy simple, simple tabla, podríamos usar una
pila, y tendría sólo digamos la después de tres operaciones, podríamos añadir un
símbolo a la tabla de símbolos y eso simplemente empuja el símbolo, empuja la
variable a la pila y cualquier otra información que queramos, como su tipo.
Compiladores
¿Qué es un tipo?
Un sistema de tipos de idiomas especifica qué operaciones son válidas para qué
tipos.
Categorías
lenguajes tipeados, donde casi toda la verificación de tipos se realiza como parte de
ejecución del programa. Y la familia de lenguajes Lisp, como Scheme y Lisp, están
en esta categoría, al igual que lenguajes como Python y Pearl.
Creo que la idea aquí está que, si estás creando prototipos de algo, si estás
explorando alguna idea es posible que en realidad no sepa exactamente cuáles son
todos los tipos en ese momento y tener que comprometerse con algo que va a
funcionar en todos los casos. ya sabes, a tener un programa de tipo correcto cuando
solo estás tratando de juguetear y descifrar qué es lo que estás tratando de hacer.
Eso es muy restrictivo y hace que el trabajo funcione bastante más lento.
Now Cool es un lenguaje tipificado estáticamente y los tipos que están disponibles
en Cool son los nombres de las clases, por lo que cada vez que defines una clase,
definesun nuevo tipo, y el símbolo de reserva especial.
Y la forma en que funciona genial es que el usuario declara los tipos para
identificadores.
Para cada identificador tiene que decir cuál es su tipo, pero, entonces el compilador
hace el resto del trabajo. El compilador hace referencia al tipo de las expresiones.
Y en particular, el compilador asigna un tipo a cada expresión en el programa. Por
lo tanto, recorrerá toda la cadena de sintaxis abstracta y usará el tipo declarado para
identificar, calcular un tipo para cada expresión y subexpresión.
En realidad, hay muchos idiomas que en realidad son muy, muy diferentes, pero la
gente a menudo usa los términos indistintamente, y no tendré especial cuidado en
mis videos sobre qué término estoy usando tampoco.
Video 4
Entonces, las reglas if-else son enunciados de implicación que alguna hipótesis
implica alguna conclusión Y en el caso particular de verificación de tipos ejemplo o
tipo típico de razonamiento que vemos en la verificación de tipos es que, si un un
par de expresiones tienen ciertos tipos, entonces se garantiza alguna otra expresión
tener un cierto tipo. Y tan claramente que la declaración de verificación de tipo aquí
es un ejemplo de una regla de inferencia. Una notación de regla de inferencia es
solo una compacta forma de codificar este tipo de declaraciones if then.
Así que ahora considere la siguiente regla de tipo muy simple. Y fíjate que, esa
declaración que acabamos de escribir out es un caso especial de una regla de
inferencia. Es un montón de hipótesis unidas juntos e implica alguna conclusión.
Estas son todas las hipótesis, luego lo de abajo.
Este es el torniquete que se utilizan para las hipótesis y la conclusión. Que algo es
demostrable en el sistema de reglas que estamos definiendo Entonces, la forma en
que leerías esto es que si es demostrable que todos estos las hipótesis son
verdaderas. Entonces, si es demostrable que la primera hipótesis es cierta, todas
las hipótesis intermedias, y si es mejorable, si es demostrable la última hipótesis es
verdadera. Los siguientes tipos de hipótesis y conclusiones que vamos a probar,
dentro del sistema, que alguna expresión tiene un tipo particular.
Así que con esas definiciones fuera del camino, en realidad tenemos suficiente para
escribir al menos unas pocas reglas de tipos simples. Y aquí está la regla para
agregar escrita ahora en la notación de la regla de inferencia. La regla para
constantes enteras solo usa un genérico entero i. No dio una regla separada para
cada número entero posible, y la regla para más expresiones usadas e uno y e dos.