Está en la página 1de 32

INTRODUCCIÓN A LOS

COMPILADORES
ANÁLISIS LÉXICO,
SINTÁCTICO Y SEMÁNTICO
Universidad de Caldas
Estructuras de Lenguajes

1/05/22 Ing. Rubén Darío García Guzmán


Agenda
• Introducción a los • Sintaxis
compiladores – Procesamiento de lenguajes
– Definición de compilador naturales y métodos formales
– Tipos de compiladores – Análisis sintáctico
– Análisis del programa fuente • Sistema de tipos y
– Fases de un compilador semántica
– El agrupamiento de fases – Sistemas de tipos
– Herramientas para la – Dominios semánticos y
construcción de compiladores transformación de estado
– Semántica operacional
– Semántica axiomática
– Semántica denotativa

1/05/22 Ing. Rubén Darío García Guzmán


Introducción a los compiladores
Definición
• Un compilador es un
programa que lee un
programa escrito en un
lenguaje (código fuente) y
lo traduce a un programa
equivalente en otro
lenguaje (código objeto).
En el proceso se informa
al usuario sobre la
presencia de errores en el
código fuente.

1/05/22 Ing. Rubén Darío García Guzmán


Introducción a los compiladores
Tipos de compiladores
• Compiladores de una pasada: Generan el código
• máquina a partir de una única lectura del código fuente.
• Compiladores de múltiples pasadas: Necesitan leer el código
fuente varias veces antes de poder producir el código de máquina.
• Compiladores de carga y ejecución: Permiten enlazar varios
módulos, cargarlos a la memoria y ejecutarlos directamente.
• Compiladores de depuración o de optimación: Realizan cambios
en el código para mejorar su eficiencia, pero manteniendo la
funcionalidad del programa original.
• Compiladores cruzados: Se ejecutan en una máquina pero el
código objeto que producen es para otra máquina.
• Compiladores JIT (Just-In-Time): Forman parte de un intérprete y
compilan partes del código según se necesitan.

1/05/22 Ing. Rubén Darío García Guzmán


Introducción a los compiladores
Fases de un compilador
• Modelo de análisis y síntesis en la
compilación
• En la compilación hay 2 partes, análisis
y síntesis.
• El análisis divide el programa fuente en
sus elementos componentes y crea una
representación intermedia de este.
• De las dos partes, la síntesis requiere
las técnicas más especializadas.
• La síntesis construye el programa objeto
deseado a partir de la representación
intermedia.
• En el análisis se determinan las
operaciones que implica el programa
fuente y se registran en una estructura
de árbol, llamado árbol sintáctico.
• Por ejemplo, para la expresión
vf:=vi+v*60 el árbol sintáctico podría
ser:

1/05/22 Ing. Rubén Darío García Guzmán


Introducción a los compiladores
El contexto de un compilador
• Además del compilador, se pueden
necesitar otros programas para crear
un programa objeto ejecutable.
• El preprocesador: Programa
encargado de reunir diferentes
módulos que conforman el programa
fuente. Este puede también expandir
abreviaturas llamadas macros a
proposiciones del lenguaje fuente.
• En la figura, el compilador crea
código en lenguaje ensamblador, el
cual es traducido por un ensamblador
a código de máquina.
• Luego se enlaza a algunas rutinas de
biblioteca para producir el código
ejecutable.

1/05/22 Ing. Rubén Darío García Guzmán


Introducción a los compiladores
Análisis del programa fuente
• En la compilación el análisis consta de
tres fases
• Análisis léxico: También llamado
Análisis lineal. En este se lee la Para la expresión de pascal vf := vi + v * 60
cadena de caracteres que constituye se agruparían los componentes léxicos así:
el programa de izquierda a derecha, y • el identificador vf
se agrupa en componentes léxicos, • el símbolo de asignación :=
que son secuencias de caracteres con • el identificador vi
significado colectivo. • el signo de suma +
• En esta etapa el compilador revisa que • el identificador v
los tokens contengan los símbolos • el signo de multiplicación *
adecuados del lenguaje. • el número 60
• Requiere por parte del diseñador del Los espacios en blanco se eliminan
lenguaje, una adecuada clasificación durante el análisis léxico.
de componentes léxicos (tokens).
• Dentro de las categorías léxicas se
tienen: identificadores, números,
separadores, operadores,
comentarios, espacios en blanco.

1/05/22 Ing. Rubén Darío García Guzmán


Introducción a los compiladores
Análisis del programa fuente
• Análisis Sintáctico: Conocido
igualmente como Análisis
jerárquico, se encarga de agrupar
los componentes léxicos
jerárquicamente en colecciones
anidadas con un significado
colectivo.
• Se usan árboles sintácticos para
representar esas agrupaciones.
• La estructura jerárquica de un
programa normalmente se expresa
utilizando reglas recursivas.
• De igual forma, muchos lenguajes 1. Cualquier identificador es una expresión.
definen recursivamente las
proposiciones mediante reglas 2. Cualquier número es una expresión.
como: 3. Si expresión1 y expresión2 son
Si identificador1 es un expresiones,
identificador y expresión2 es entonces también lo son:
una expresión, entonces:
expresión1 + expresión2
Identificador1 := expresión2 es
una proposición. expresión1 * expresión2
(expresión1)
1/05/22 Ing. Rubén Darío García Guzmán
Introducción a los compiladores
Análisis del programa fuente
• Análisis semántico: Se realizan
revisiones que aseguran que los
componentes de un programa se
ajustan de un modo significativo.
• La fase de análisis semántico revisa el
programa fuente para tratar de
encontrar errores semánticos
• Reúne la información sobre los tipos
para la fase posterior de generación de
código.
• Utiliza la estructura jerárquica
determinada por la fase de análisis
sintáctico para identificar los operadores
y operandos de expresiones y
proposiciones.
• Se encarga además de la verificación
de tipos.
• El compilador verifica si cada operador
tiene operandos permitidos por la
especificación del lenguaje fuente.

1/05/22 Ing. Rubén Darío García Guzmán


Introducción a los compiladores
Las fases de un compilador
• Un compilador opera en fases.
• Cada una transforma el programa fuente de
una representación en otra.
• En la práctica se pueden agrupar algunas
fases.
• Administración de la tabla de símbolos:
Registra los identificadores utilizados en el
programa fuente y reúne información sobre los
distintos atributos de cada identificador.
• Una tabla de símbolos es una estructura de
datos que contiene un registro por cada
identificador, con los campos para los atributos
del identificador.
• Detección e información de errores: Cada
fase puede encontrar errores, después de
detectar un error, cada fase debe tratar de
alguna manera ese error, para poder continuar
con la compilación, permitiendo la detección de
más errores en el programa fuente.
• Las fases de análisis sintáctico y semántico
generalmente manejan la mayor cantidad de
los errores detectables por el compilador.

1/05/22 Ing. Rubén Darío García Guzmán


Introducción a los compiladores
Las fases de un compilador
• Las fases de análisis: Conforme avanza
la traducción, la representación interna
del programa fuente que tiene el
compilador se modifica. Estas fases se
refieren a las de análisis léxico, sintáctico
y semántico ya definidas.
• Generación de código interno: Algunos
compiladores generan una
representación intermedia explicita del
programa fuente.
• Se puede considerar esta como un
programa para una máquina abstracta.
• Debe ser fácil de producir y fácil de
traducir al programa objeto.
• Por ejemplo el “código de tres
direcciones”, que traduce el código en
una secuencia de instrucciones, cada
una de las cuales tiene como máximo
tres operandos.

1/05/22 Ing. Rubén Darío García Guzmán


Introducción a los compiladores
Las fases de un compilador
• Optimación de código: Trata de
mejorar el código intermedio, de modo
que resulte un código de máquina
rápido de ejecutar.
• Generación de código: Por lo general
consiste en código de máquina
relocalizable o código ensamblador.
• Las posiciones de memoria se
seleccionan para cada una de las
variables usadas por el programa.
• Cada instrucción intermedia se traduce
en una secuencia de instrucciones de
máquina que ejecuta la misma tarea.

1/05/22 Ing. Rubén Darío García Guzmán


Introducción a los compiladores
El agrupamiento de las fases
• Las actividades de compilación se • Pasadas: Se acostumbra aplicar
agrupan normalmente en dos o varias fases de un compilador en
mas fases. una sola pasada.
• Etapa inicial: Recoge aquellas que • Una pasada es la lectura de un
dependen principalmente del archivo de entrada y en la escritura
lenguaje fuente. de un archivo de salida.
• análisis léxico y sintáctico, creación • Es mejor agrupar los proceso de
de tabla de símbolos, análisis compilación por pasadas y no por
semántico y la generación de fases.
código intermedio, con su • El análisis léxico, el análisis
respectivo manejo de errores. sintáctico, el análisis semántico y la
• Etapa final: Incluye las partes que generación de código intermedio
dependen de la máquina objeto y pueden agruparse en una pasada
del lenguaje intermedio. • Reducción del número de pasadas:
• Fase de optimación de código, la Es recomendable tener pocas
generación de código, el manejo de pasadas.
errores y las operaciones que • La lectura y escritura de archivos
involucran la tabla de símbolos. toma tiempo e implica la carga de
todo el programa en memoria.

1/05/22 Ing. Rubén Darío García Guzmán


Introducción a los compiladores
Herramientas para la construcción
• Existen herramientas ya definidas que se pueden usar para el desarrollo de un
compilador.
• Las mejores herramientas son las que ocultan los detalles del algoritmo de
generación y producen componentes que se pueden integrar fácilmente al
resto del compilador.
– Generadores de analizadores sintácticos: Producen analizadores sintácticos a
partir de una entrada fundamental en una gramática independiente del contexto.
– Generadores de analizadores léxicos: Generan automáticamente analizadores
léxicos a partir de una especificación basada en expresiones regulares. La
organización del analizador léxico es en esencia un autómata finito.
– Dispositivos de traducción dirigida por la sintaxis: Producen grupos de rutinas que
recorren el árbol de análisis sintáctico, generando código intermedio.
– Generadores automáticos de código: Toman un conjunto de reglas que definen la
traducción de cada operación del lenguaje intermedio al lenguaje de máquina
objeto.
– Dispositivos para análisis de flujo de datos: Consiste en la recolección de
información sobre la forma en que se transmiten valores de una parte del
programa a cada una de las otras partes.

1/05/22 Ing. Rubén Darío García Guzmán


Sintaxis
Definición y generalidades

• La sintaxis de un lenguaje de programación


es una definición de lo que constituye un
programa gramaticalmente válido en dicho
lenguaje.
• La sintaxis queda especificada por un
conjunto de reglas.
• Una definición de la sintaxis clara, concisa y
formal es especialmente importante en los
lenguajes de programación.
1/05/22 Ing. Rubén Darío García Guzmán
Sintaxis
Procesamiento de lenguajes y métodos formales
• Un Metalenguaje es un lenguaje usado para definir otros
lenguajes.
• Backus-Naur Form o BNF es uno de ellos.
• BNF desarrollado por Noam Chomsky, es altamente usada
en la definición de lenguajes de programación.
• Es útil para describir de forma precisa las cadenas que
son programas legítimos y aislar todas las demás (las que
tienen errores sintácticos de varios tipos)
• Las expresiones regulares también es un Metalenguaje

1/05/22 Ing. Rubén Darío García Guzmán


Sintaxis
BNF y el análisis léxico
• una sintaxis BNF sencilla es mostrada en la
figura.

1/05/22 Ing. Rubén Darío García Guzmán


Sintaxis
El Análisis Léxico y el proceso de compilación
• Todos los programas deben ser
analizados para comprobar su
corrección sintáctica antes de ser
interpretados o traducidos a
código máquina.
• Al nivel más elemental, el
proceso de análisis léxico separa
los caracteres individuales del
programa en una cadena de
tokens que se analiza
sintácticamente, de uno en uno,
hasta un nivel de análisis
superior.
• Las etapas de análisis semántico y de optimización analizan la consistencia semántica
(comprobando, por ejemplo, la utilización consistente de operadores y tipos de datos) y
transforman el texto de forma que pueda utilizar de forma eficiente la arquitectura en la
que se ejecutará el programa.
• Para terminar, la etapa de generación de código utiliza la representación abstracta
resultante como base para la generación de código máquina ejecutable.

1/05/22 Ing. Rubén Darío García Guzmán


Sintaxis
Las expresiones regulares y el análisis léxico
• Las Expresiones regulares son una
herramienta muy utilizada en el diseño
de lenguajes para especificar
formalmente cada clase de token.
• Estas permiten conceptos como «una o
más apariciones de un dígito». Es más,
se puede crear de forma similar una
expresión regular para definir el
significado de un ldentificador:
[a-zA-Z] [a-zA-Z0-9]*
• lo que significa «una letra seguida por
una o más apariciones de una letra o un
dígito».
• Las expresiones regulares se han
convertido en una herramienta muy
popular del diseño de lenguajes, porque
admiten la generación automática de
analizadores léxicos sin problemas.
• Dos generadores bastante utilizados
son el «Lex» (que genera código de C)
y el «JLex» (que genera código de
Java).

1/05/22 Ing. Rubén Darío García Guzmán


Sintaxis
El Análisis sintáctico
• La sintaxis completa de un lenguaje de programación utiliza el resultado del análisis
léxico como base para la definición de la estructura de todas las partes diferentes de
programa que aparecen por encima del nivel léxico
• La sintaxis de un lenguaje utiliza BNF como herramienta principal para proporcionar una
definición precisa y una guía estricta para que la fase de análisis sintáctico detecte
errores sintácticos y desarrolle una interpretación abstracta a partir de un flujo de
tokens.
• Consideremos las categorías sintácticas Asignación y Expresión, que definen todas las
secuencias de Pasos de testigo que describen los cálculos aritméticos y asignaciones
de resultados a una variable.
• la Figura 2.8 muestra una derivación de la Expresión x+2*y.

1/05/22 Ing. Rubén Darío García Guzmán


Sintaxis
Ambigüedad
• Una gramática es ambigua si
permite que una cadena se
convierta en uno o más árboles
sintácticos diferentes.
• Por ejemplo, la gramática ambigua,
AmbExp, para expresiones con
enteros y sustracciones.
AmbEx  Integer | AmbExp – AmbExp
• Esta gramática permite que una
expresión tenga dos
interpretaciones distintas en tiempo
de ejecución.
• Por ejemplo, consideremos el
fragmento de programa 2 - 3 - 4.

1/05/22 Ing. Rubén Darío García Guzmán


Sintaxis
Variaciones de BNF para el análisis sintáctico
• El BNF extendido (EBNF) fue introducido • para
(*) significa «cerolaoespecificación
simplificar más aparicionesdede
los símbolos que están entre llaves { }
la recursividad en las reglas de gramática yinmediatamente
para introducirantes
la idea de una
de él».
• regla
parte opcional en la parte derecha de una .
Los corchetes [ y ] encierran una serie
Expression Term | Expression + Term | Expression -Term
de alternativas, de las que debemos
elegir una.
Term Factor | Term * Factor | Term / Factor • Para terminar, el asterisco (*) indica que
• Se puede representar como la multiplicación está entre comillas ('),
para distinguirla de la utilización
– Expression Term{[+| –] Term}* metalingüística del asterisco como un
– Term Factor{ ['*' | /] Factor} * operador EBNF.
• Los diagramas sintácticos se usan
para clarificar el significado de
varias construcciones de lenguajes
cuando se enseñan a los
programadores noveles.

1/05/22 Ing. Rubén Darío García Guzmán


Sistema de tipos y semántica
Introducción
• Una sistemas
Los idea intuitiva
de sencilla
tipos sedelusan
significado
en el diseño
de unde
programa
lenguajes es: para
«lo que
formalizar
sucede la
definición
en un computador
de los tipos
cuando
de datos
se ejecuta
de unellenguaje
programa».
y susemántica
utilización correcta
operacional.
en los
• programas.
Otro modo de ver el significado de un programa es: empezar con una
• La definición de
especificación formal
un de
lenguaje
lo que de tiene
programación
que hacer el programa
está completay después
sólo cuando
están completamente
demostrar que lo hace, definidos
utilizando su unasemántica,
serie sistemática
su sintaxis
de pasosy sulógicos.
sistema de
tipos.
semántica axiomática.
• La semántica
Un tercer modode undelenguaje
ver la semántica
de programación
de un eslenguaje
una definición
de programación
del significado
es:
de cualquier
definir el significado
programade cada
que seatipo sintácticamente
de instrucción que válido
se produce
desde losen puntos
la sintaxis
de
vista de la sintaxis
(abstracta) como concreta
una función
y de la matemática
revisión de de
tipostransformación
estática. de estado.
semántica denotativa.

1/05/22 Ing. Rubén Darío García Guzmán


Sistema de tipos y semántica
Introducción
• La semántica
Los tres métodos axiomática
de definición semántica tienen ventajas e inconvenientes.
• – semántica
La Es particularmente útil en la exploración de las propiedades formales de los programas.
operacional
– A los programadores
Tiene que debenelescribir
la ventaja de representar programas
significado correctos
del programa a partir de un
directamente en conjunto
el códigodede una
especificaciones preciso, les resulta particularmente útil este estilo semántico.
máquina real (o simulada).
• La
– semántica
Esto es también denotativa
una debilidad, debido a que la definición de la semántica de un lenguaje de
programación
– Es con su
valiosa porque base a una
estilo arquitectura
funcional lleva en particular, restringe
la definición semánticaladeutilidad de esaadefinición
un lenguaje un nivel
aalto
losde
escritores-compiladores
precisión matemática. y programadores que trabajen con arquitecturas diferentes.
– Además,
– A través deel equipo
ella, losvirtual en el que
diseñadores se ejecutan
de lenguajes las instrucciones
obtienen también
una definición necesita
funcional deluna
descripción
significado desemántica, lo quede
la elaboración añade
cadacomplejidad
lenguaje queyes puede lleva a definiciones
independiente viciadas.
de cualquier arquitectura
de equipo en particular.

1/05/22 Ing. Rubén Darío García Guzmán


Sistema de tipos y semántica
Sistemas de tipos
• Un lenguaje
tipo es undeconjunto
programación
bien definido
es de tipos
de valores
estrictos
y de sioperaciones
su sistema en de esos
tipos valores.
permite la
• detección
Un sistema dede
todos
tiposloseserrores de tipo
un sistema de definido
bien los programas, ya seatipos
para asociar en tiempo de
con variables y
compilación
otros objetoscomo en tiempo
definidos en un de ejecución, antes de que la instrucción en la que se
programa.
• pueden producir
Los lenguajes quesepermiten
ejecute. asociar
(El hecho deun
sólo quetipouna lenguaje tenga
una variable setipos
llamanestáticos
lenguajeso de
dinámicos no evita
tipos estáticos, losque
quetenga tiposasociar
permiten estrictos.).
una Java es un
variable lenguaje
a varios tipos con
setipos
llamanestrictos,
de tipos
mientras
dinámicos. que C no lo es.
•• Generalmente,
Un lenguaje delos tipos
tipos estrictos permite
estáticos fomentan queprogramas
las reglasmásde sufiables
tipo sey se consideran
definan
como una virtudcon
completamente en el diseño
base a sude lenguajes
sintaxis de programación.
abstracta. Se llama a esta definición semántica
• Un programa
estática. es de tipo seguro si sabemos que no tiene errores de tipo.
•• Por definición,
Un error todos
de tipo es unloserror
programas
en tiempode un
de lenguaje
ejecucióncon quetipos estrictoscuando
se produce son dese tipo
intenta
seguro.
una operación en un valor para el que no está bien definida.
• Un lenguaje es de tipo seguro si todos sus programas lo son.

1/05/22 Ing. Rubén Darío García Guzmán


Sistema de tipos y semántica
Sistemas de tipos
• Un lenguaje
tipo es undeconjunto
programación
bien definido
es de tipos
de valores
estrictos
y de sioperaciones
su sistema en de esos
tipos valores.
permite la
• detección
Un sistema dede
todos
tiposloseserrores de tipo
un sistema de definido
bien los programas, ya seatipos
para asociar en tiempo de
con variables y
compilación
otros objetoscomo en tiempo
definidos en un de ejecución, antes de que la instrucción en la que se
programa.
• pueden producir
Los lenguajes quesepermiten
ejecute. asociar
(El hecho deun
sólo quetipouna lenguaje tenga
una variable setipos
llamanestáticos
lenguajeso de
dinámicos no evita
tipos estáticos, losque
quetenga tiposasociar
permiten estrictos.).
una Java es un
variable lenguaje
a varios tipos con
setipos
llamanestrictos,
de tipos
mientras
dinámicos. que C no lo es.
•• Generalmente,
Un lenguaje delos tipos
tipos estrictos permite
estáticos fomentan queprogramas
las reglasmásde sufiables
tipo sey se consideran
definan
como una virtudcon
completamente en el diseño
base a sude lenguajes
sintaxis de programación.
abstracta. Se llama a esta definición semántica
• Un programa
estática. es de tipo seguro si sabemos que no tiene errores de tipo.
•• Por definición,
Un error todos
de tipo es unloserror
programas
en tiempode un
de lenguaje
ejecucióncon quetipos estrictoscuando
se produce son dese tipo
intenta
seguro.
una operación en un valor para el que no está bien definida.
• Un lenguaje es de tipo seguro si todos sus programas lo son.

1/05/22 Ing. Rubén Darío García Guzmán


Sistema de tipos y semántica
¿Cómo formalizar un sistema de tipos?
• Una manera de definir el sistema de tipos de• un Un
lenguaje es escribir
trato formal un conjunto
de comprobación de
de tipos
especificaciones de funciones que defina lo que significa para un programa ser delatipo
estáticos de un programa se basa en
seguro. existencia de un mapa de tipos que se haya
extraído de las Declaraciones que aparecen
• Se pueden escribir estas reglas como funcionesen delavalor
partebooleano
superior del y programa.
se pueden
expresar ideas como «todas las variables declaradas
• Se puedetienen nombres
expresar únicos» o «todas
la comprobación de tipos
las variables utilizadas en el programa deben declararse».
estáticos de un lenguaje en notación
• La base de esta definición funcional es un mapafuncional,
de tipos, enque
la que
escada regla quede
un conjunto ayuda a
definir el
parejas que representa las variables declaradas y sus tipos.sistema de tipos es una función con
– valor booleano V.
tm = {〈v1, t1〉, 〈v2, t2〉, ... , 〈vn, tn〉} • V devuelve true o false dependiendo de si un
• Donde cada vi indica una Variable y cada ti indica su Tipo
miembro en declarado.
particular de una clase sintáctica
• Un ejemplo de mapa de tipos para un programa que tiene tres
abstracta es variables
válido o no, endeclaradas; iyj
relación a estas
con tipo int y p con tipo boolean: reglas. Es decir,
– tm = {〈i, int〉, 〈j, int〉, ... , 〈p, boolean〉} – V: Class → B
• Por ejemplo, supongamos que queremos
definir la idea de que «una lista de
declaraciones es válida si todas sus variables
tienen identificadores únicos entre sí».
Podemos expresar esta idea de manera
precisa del siguiente modo:

1/05/22 Ing. Rubén Darío García Guzmán


Sistema de tipos y semántica
Dominios semánticos y transformación de estado
• Los números naturales, enteros, números • reales
El entorno
y losbooleanos
es un conjuntoy susde
propiedades matemáticas proporcionan unparescontexto
quefundamental
une variables para
específicas
el
diseño de lenguajes de programación. con ubicaciones de memoria.
• Estos conjuntos son ejemplos de dominios• Lasemánticos
memoria,  de es lenguajes
un conjunto dede
programación. pares que une ubicaciones
• Un dominio semántico es cualquier conjunto específicas con valores.y
cuyas propiedades
• Las ubicaciones,
operaciones son bien entendidas independientemente y sobre
en el
cada
quecaso,
se son
basan, en última instancia, las funciones que
losdefinen
números la naturales
semánticaN.de un
lenguaje. • Por ejemplo, supongamos que
• Tres dominios semánticos útiles de los lenguajes
tenemosdevariables
programación
i y j con
sonvalores
el
entorno, la memoria y las ubicaciones. 13 y -1.
• Supongamos que las ubicaciones
de memoria están numeradas en
serie comenzando por el 0 y que,
las variables i y j están asociadas
con las ubicaciones de memoria
154 y 155.

1/05/22 Ing. Rubén Darío García Guzmán


Sistema de tipos y semántica
Dominios semánticos y transformación de estado
• El estado de un programa es el producto de su entorno y su memoria.
• Define sencillamente el estado  de un programa como un conjunto de pares
(v, val) que representa todas las variables activas y sus valores asignados
actualmente en alguna etapa durante la ejecución del programa.

• Aquí, cada vi indica una variable y cada vali indica su valor asignado
actualmente.
• Antes de que el programa comience su ejecución,
σ = {〈v1, undef〉, 〈v2, undef〉, ..., 〈vm, undef〉}.
• También utilizamos la expresión σ (v) para indicar la función que recupera el
valor de la variable v del estado actual.

1/05/22 Ing. Rubén Darío García Guzmán


Sistema de tipos y semántica
Semántica operacional
• La semántica operacional de un programa• proporciona una definición
Si e es una constante, σ (e) esdel significado
sencillamente
el valor de esa constante
del programa simulando el comportamiento del mismo en un modelo de equipo que en el dominio
tenga una organización de memoria y un conjunto semántico desubyacente.
instrucciones muy sencillos
(aunque no necesariamente realistas). • Si e es una variable, σ (e) es el valor de esa
variable en el estado actual σ.
• Uno de los primeros modelos de semántica • operacional fue el «equipo
La segunda convención SECD»,
de notación de laque
ofrecía una base para definir formalmente la semántica
semántica deoperacional
Lisp. es una regla de
• ejecución.
Los modelos de semántica operacional estructurados utilizan un método basado en
reglas y unas cuantas suposiciones sencillas• sobre
Una regla de ejecución
la capacidad tieneylaaritmética
lógica forma del
equipo subyacente.
• Un modelo de semántica operacional puede utilizar la notación σ (e) => v para
representar la computación de un valor v de •la expresión
Se lee: “si elaen
premisa es σ.
estado
la conclusión es verdadera”.
verdadera, entonces

1/05/22 Ing. Rubén Darío García Guzmán


Sistema de tipos y semántica
Semántica Axiomática
• Aunque es importante que los programadores • yLalossemántica
escritoresaxiomática
de compiladores
se basa en la
comprendan lo que hace un programa en todasnoción
las circunstancias,
de asertos, quetambién
es unespredicado
importante que los programadores puedan confirmar,
que describe
o probar,
el estado
que hace de lo
unque
programa
se
supone que tiene que hacer bajo todas las circunstancias.
en cualquier momento de su ejecución.
• Es decir, que el programa es «correcto» de •unaEl
manera
aserto convincente.
Q≡m ≡max(a,b) define el
• La semántica axiomática nos ofrece un mediosignificado de la función
para desarrollar max(a,b).
dichas pruebas.
• La semántica axiomática nos ofrece un medio• para
Pararazonar
demostrar quelos
sobre la programas
el programay sus
cálculos. calcula realmente la función max, hay
• que demostrar que
Esto permite a los programadores predecir el comportamiento de un la programa
expresión delógica
un Q
es equivalente
modo más convincente y circunspecto que ejecutando al significado
el programa de ese
varias veces.
programa. Q es la poscondición del
programa max.
• La semántica axiomática permite derivar
lógicamente una serie de predicados
razonando sobre el comportamiento de
cada instrucción individual en el
programa. Comenzando por la
postcondición Q y trabajando hacia
atrás.

1/05/22 Ing. Rubén Darío García Guzmán


Sistema de tipos y semántica
Semántica Denotativa
• La semántica denotativa de un lenguaje• define
La utilización
los significados
de la semántica
de los elementos
denotativa
abstractos de dicho lenguaje como un grupo depara
funciones
la definición
de transformación
del significado
del entorno
tiene
y del estado. ventajas y desventajas.
• • objetos
El entorno de un programa es el conjunto de Una ventaja
y tiposesque
queestán
podemos
activos
utilizar
en cada las
paso de su ejecución. denotaciones funcionales del significado
• El estado de un programa es el conjunto de de unlosprograma
todos como y sus
objetos activos basevalores
para
actuales. especificar un intérprete para el
lenguaje.
• Estas funciones de transformación de estado dependen de la suposición de algunos
tipos y transformaciones primitivas. • la semántica denotativa es muy utilizada
y permite definir el significado de un
• Mientras que la semántica axiomática es valiosa para la abstracto
programa claridad del significado
como una serie de unde
programa como un texto abstracto, la semántica operacional (o denotativa) se
transformaciones de estado resultantecentra en
el significado de un programa como un de objeto activo dentro
la aplicación de deunaunserie
entorno de
computacional (o funcional). funciones M.
• Estas funciones definen individualmente
el significado de cada clase de
elementos que nos podemos encontrar
en el árbol de sintaxis abstracta de un
programa (Program, Block, Conditional,
Loop, Assignment, etc.).

1/05/22 Ing. Rubén Darío García Guzmán

También podría gustarte