You are on page 1of 38

Semntica

La semntica describe el significado de


los smbolos, palabras y frases de un
lenguaje ya sea lenguaje natural o
lenguaje informtico

Ejemplos:

int vector [10];


if (a<b) max=a; else max=b;

Tipos de semntica:

Semntica esttica
Semntica dinmica

Semntica

Semntica esttica

No est relacionado con el significado del


programa, est relacionado con las formas
validas.
Se las llama as porque el anlisis para el
chequeo puede hacerse en compilacin.
Para describir la sintaxis y la semntica esttica
formalmente sirven las denominadas gramticas
de atributos, inventadas por Knuth en 1968.
Generalmente las gramticas sensibles al
contexto resuelven los aspectos de la semntica
esttica.

Semntica

Semntica esttica - Gramtica de atributos


A las construcciones del lenguaje se le asocia
informacin a travs de los llamados atributos
asociados a los smbolos de la gramtica
correspondiente
Los valores de los atributos se calculan mediante
las llamadas ecuaciones o reglas semnticas
asociadas a las producciones gramaticales.
La evaluacin de las reglas semnticas puede:

Generar Cdigo.
Insertar informacin en la Tabla de Smbolos.
Realizar el Chequeo Semntico.
Dar mensajes de error, etc.

Semntica

Los atributos estn directamente relacionados


con los smbolos gramaticales (terminales y no
terminales)
La forma, general de expresar las gramticas con
atributos se escriben en forma tabular. Ej:
Regla gramatical
Regla 1
.
.
Regla n

Reglas semnticas
Ecuaciones de atributo asociadas
.
.
Ecuaciones de atributo asociadas

Semntica

Semntica esttica - Gramtica de atributos

Ej. Gramtica simple para una declaracin de


variable en C. Atributo at

Regla gramatical

Reglas semnticas

decl tipo lista-var


tipo int
tipo float

lista-var.at = tipo.at
tipo.at = int
tipo.at = float
id.at = lista-var.at
Aadetipo(id.entrada, lista-var.at)
id.at = lista-var.at
Aadetipo(id.entrada, lista-var1.at)
lista-var2 .at = lista-var.at

lista-var id
lista-var1 id, lista-var2

El rbol sintctico que muestra los clculos de


atributo para la declaracin: float z,t
decl

tipo
(at = float)
float

lista-var
(at = float)
id
,
(Aadetipo(z, float))
z

lista-var
(at = float)
id
(Aadetipo(t, float))
t

Semntica

Semntica dinmica.

Es la que describe el efecto de ejecutar las


diferentes construcciones en el lenguaje de
programacin.
Su efecto se describe durante la ejecucin del
programa.
Los programas solo se pueden ejecutar si son
correctos para la sintxis y para la semntica
esttica.

Semntica

Cmo se describe la semntica?

No es fcil
No existen herramientas estndar como en el
caso de la sintxis (diagramas sintcticos y
BNF)
Hay diferentes soluciones formales:

Semntica axiomtica
Semntica denotacional

Semntica operacional

Semntica

Semntica axiomtica

Considera al programa como una mquina


de estados.
La notacin empleada es el clculo de
predicados.
Se desarroll para probar la correccin de los
programas.
Los constructores de un lenguajes de
programacin se formalizan describiendo
como su ejecucin provoca un cambio de
estado.

Semntica

Semntica axiomtica

Un estado se describe con un predicado que describe


los valores de las variables en ese estado
Existe un estado anterior y un estado posterior a la
ejecucin del constructor.
Cada sentencia se precede y se contina con una
expresin lgica que describe las restricciones y
relaciones entre los datos.
Precondicin
Poscondicin
Ejemplo: a/b

a
b
r
c
Precondicin: {b distinto de cero}
Sentencia: expresin que divide a por b
Postcondicin: {a=b*c+r y r<b}

Semntica

Semntica denotacional

Se basa en la teora de funciones recursivas


Se diferencia de la axiomtica por la forma que
describe los estados, la axiomtica lo describe a
travs de los predicados, la denotacional a
travs de funciones.
Se define una correspondencia entre los
constructores sintcticos y sus significados
Produccin: <Nbin>::=0|1|<Nbin> 0 | <Nbin> 1

FNbin(0)=0

FNbin(<Nbin> 0)= 2 * FNbin(<Nbin>)

FNbin(1)=1

FNbin(<Nbin> 1)= 2 * FNbin(<Nbin>) + 1

Semntica

Semntica Operacional

El significado de un programa se describe


mediante otro lenguaje de bajo nivel
implementado sobre una mquina abstracta
Los cambios que se producen en el estado de la
mquina cuando se ejecuta una sentencia del
lenguaje
de
programacin
definen
su
significado
Es un mtodo informal
Es el ms utilizado en los libros de texto
PL/1 fue el primero que la utiliz

Semntica

Semntica Operacional
Ejemplo:
Lenguajes

for i := pri to ul do
begin
........
end

Mquina abstracta

i := pri
lazo if i > ul goto sal
............
i := i +1
goto lazo
sal ..........

Procesamiento de un lenguaje
Traduccin

Las computadoras ejecutan lenguajes


de bajo nivel llamado lenguaje de
mquina.
Un poco de historia

Programar en cdigo de mquina

Uso de cdigo mnemotcnico (abreviatura con


el propsito de la instruccin). Lenguaje
Ensamblador y Programa Ensamblador

SUM #10, #1, #13

Aparicin
de #12,
los Lenguajes
de alto nivel
SUM #13,
#13
DIV #13, 3, #13
FIN

Procesamiento de un lenguaje
Interpretacin y compilacin

Cmo los programas escritos en


lenguajes de alto nivel pueden ser
ejecutados sobre una computadora
cuyo lenguaje es muy diferente y de
muy bajo nivel?.
Alternativas de traduccin:

Interpretacin
Compilacin

Interpretacin

Intrprete:

Lee,
Analiza
Decodifica y
Ejecuta una a una las sentencias de un programa
escrito en un lenguaje de programacin.

Ej: Lisp, Smalltalk, Basic, Python, etc.)


Por cada posible accin hay un subprograma
que ejecuta esa accin.
La interpretacin se realiza llamando a estos
subprogramas en la secuencia adecuada.

Interpretacin
E

Programa

INTRPRET
E

Resultados

Un intrprete ejecuta repetidamente la


siguiente secuencia de acciones:

Obtiene la prxima sentencia


Determina la accin a ejecutar
Ejecuta la accin

Compilacin

Los programas escritos en un lenguaje


de alto nivel se traducen a una versin
en lenguaje de mquina antes de ser
ejecutados.

Lenguaje
fuente

Lenguaje
objeto

COMPILACIN

Traduccin
La traduccin lleva varios pasos.
Ej: Pasos que prodra realizarse en una
traduccin:

Compilado a assembler
Ensamblado a cdigo
reubicable
Linkeditado
Cargado en la memoria

Compilador

Assembler
Link-editor
Loader

Traduccin

Tipos de traductores:

Compilador

Lenguaje fuente: Lenguaje de alto nivel


Lenguaje objeto: Cualquier lenguaje de mquina
de una mquina real, o lenguaje assembler, o
algn lenguaje cercano a ellos

Assembler

Lenguaje fuente: Lenguaje assembler


Lenguaje objeto: Alguna variedad de lenguaje
de mquina

Traduccin

Link-editor

Lenguaje fuente: Mdulos en lenguaje de


mquina en forma reubicable
Lenguaje objeto: Una simple unidad en forma
reubicable con todos los mdulos linkeditados
juntos.

Loader

Lenguaje fuente: Programa en forma reubicable


con la tabla de datos
Lenguaje objeto: Lenguaje de mquina (cdigo
ejecutable)

Traduccin

En ciertos lenguajes como C, se ejecuta


antes del compilador otro traductor
llamada Macro-Procesador o Pre
Procesador

Macro: fragmento de texto fuente que lleva


un nombre

En el programa se utiliza el nombre de la macro


El nombre de la macro ser reemplazada por su
cdigo cuando se procesen las macros

Traduccin

Ejemplo lenguaje C:

Contiene directivas que deben resolverse antes


de pasar a la compilacin
#include: Inclusin de archivos de texto, Ej:
#include <stdio.h>
#define: Remplaza smbolos por texto,
Ej:
#define PI 3.1416
Macros: Funciones en-lnea,
Ej: # define max(x,y) ((x)>(y)?(x):(y))
#ifdef: Compilacin condicional.

Traduccin

El preprocesador de C frente a una


macro:
Si se tiene la definicin siguiente
#define max(x,y) x>y?x:y

Y en el cdigo aparece:

r = max(s,5);
.

El preprocesador
hara:
Preprocesador
o macro-procesador:
. fuente: Forma extendida de algn lenguaje de
Lenguaje
alto nivelr =
(Cs>5?s:5;
con macros)
Lenguaje objeto: Forma estndar del mismo lenguaje.

Traduccin

Comparacin entre Traductor e


Intrprete:

Forma en cmo ejecuta:

Intrprete:

Compilador:

Ejecuta el programa de entrada directamente


Produce un programa equivalente en lenguaje objeto

Forma en qu orden ejecuta:

Intrprete:

Sigue el orden lgico de ejecucin

Compilador:

Sigue el orden fsico de las sentencias

Traduccin

Tiempo de ejecucin:

Intrprete:

Compilador:

Por cada sentencia se realiza el proceso de


decodificacin para determinar las operaciones a
ejecutar y sus operandos.
Si la sentencia est en un proceso iterativo, se realizar
la tarea tantas veces como sea requerido
La velocidad de proceso se puede ver afectada
No repetir lazos, se decodifica una sola vez

Eficiencia:

Intrprete:

Ms lento en ejecucin

Compilador:

Ms rpido desde el punto de vista del hard

Traduccin

Espacio ocupado:

Intrprete:

Compilador:

Ocupa menos espacio, cada sentencia se deja en la forma


original
Una sentencia puede ocupar cientos de sentencias de
mquina

Deteccin de errores:

Intrprete:

Las sentencias del cdigo fuente pueden ser relacionadas


directamente con la que se esta ejecutando.

Compilador:

Cualquier referencia al cdigo fuente se pierde en el cdigo


objeto

Traduccin

Combinacin de ambas tcnicas:

Los compiladores y los interpretes se


diferencian en la forma que ellos reportan
los errores de ejecucin.
Algunos ambientes de programacin contienen
las dos versiones interpretacin y
compilacin.

Utilizan el intrprete en la etapa de desarrollo,


facilitando el diagnstico de errores.
Luego que el programa ha sido validado se
compila para generar cdigo mas eficiente.

Traduccin

Combinacin de ambas tcnicas

Otro
forma
de
combinarlos:
traduccin a un cdigo intermedio
que luego se interpretar.

Sirve para generar cdigo portable, es decir,


cdigo fcil de transferir a diferentes
mquinas.
Ejemplos: Java, genera un cdigo intermedio
llamado bytecodes, que luego es interpretado
por la mquina cliente.

Traduccin

Combinacin de ambas tcnicas:


FUENTE
Traduccin

INTERMEDIO
Interpretacin

EJECUTABLE

Compiladores

Al compilar los programas la ejecucin de los


mismos es ms rpida. Ej. de programas que se
compilan: C, Ada, Pascal, etc.
Los compiladores pueden ejecutare en un solo
paso o en dos pasos.
En ambos casos cumplen con varias etapas, las
principales son

Anlisis

Anlisis lxico (Scanner)


Anlisis sintctico ( Parser)
Anlisis semntico (Semntica esttica)

Sntesis

Optimizacin del cdigo


Generacin del cdigo

Generacin de
cdigo intermedio

Compiladores

Anlisis del programa fuente

Anlisis lxico (Scanner):

Es el que lleva mas tiempo


Hace el anlisis a nivel de palabra
Divide el programa es sus elementos constitutivos: identificadores,
delimitadores, smbolos especiales, nmeros, palabras clave,
delimitadores, comentarios, etc.
Analiza el tipo de cada token
Filtra comentarios y separadores como: espacios en blanco,
tabulaciones, etc.
Genera errores si la entrada no coincide con ninguna categora
lxica
Convierte a representacin interna los nmeros en punto fijo o
punto flotante
Poner los identificadores en la tabla de smbolos
Reemplaza cada smbolo por su entrada en la tabla
El resultado de este paso ser el descubrimiento de los items
lxicos o tokens.

Compiladores

Anlisis sintctico (Parser):

El anlisis se realiza a nivel de sentencia.


Se
identifican
las
estructuras;
sentencias,
declaraciones, expresiones, etc. ayudndose con los
tokens.
El analizador sintctico se alterna con el anlisis
semntico. Usualmente se utilizan tcnicas basadas en
gramticas formales.
Aplica una gramtica para construir el rbol sintctico
del programa.

Compiladores

Anlisis semntica (semntica esttica):

Es la fase medular
Es la mas importante
Las estructuras sintcticas reconocidas por el analizador
sintctico son procesadas y la estructura del cdigo
ejecutable toma forma.
Se realiza la comprobacin de tipos
Se agrega la informacin implcita (variables no
declaradas)
Se agrega a la tabla de smbolos los descriptores de
tipos, etc. a la vez que se hacen consultas para realizar
comprobaciones.
Se hacen las comprobaciones de nombres. Ej: toda
variable debe estar declarada.
Es el nexo entre el anlisis y la sntesis

Compiladores

Generacin de cdigo intermedio:

Caractersticas de esta representacin

Debe ser fcil de producir


Debe ser fcil de traducir al programa objeto

Ejemplo: Un formato de cdigo intermedio es el cdigo de tres


direcciones.
Forma: A:= B op C, donde A,B,C son operandos y op es un operador binario
Se permiten condicionales simples simples y saltos.
while (a >0) and (b<(a*4-5)) do a:=b*a-10;
L1: if (a>0) goto L2
goto L3
L2: t1:=a*4
t2:=t1-5
if (b < t2) goto L4
goto L3

L4: t1:=b*a
t2:=t1-10
a:=t2
goto L1
L3: .

Compiladores

Sntesis:

En esta etapa se construye el programa


ejecutable.
Se genera el cdigo necesario y se optimiza el
programa generado.
Si hay traduccin separada de mdulos, es en
esta etapa cuando se linkedita.
Se realiza el proceso de optimizacin. Optativo

Compiladores

Optimizacin (ejemplo):
Posibles optimizaciones locales:

Cuando hay dos saltos seguidos se puede quedar uno solo


P/E El ejemplo anterior quedara as:
L1: if (a<=0) goto L3

t1:=b*a

t1:=a*4

t2:=t1-10

t2:=t1-5

a:=t2

if (b >= t2) goto L3

goto L1
L3: .

L1: if (a>0) goto L2


goto L3
L2: t1:=a*4
t2:=t1-5
if (b < t2) goto L4
goto L3
L4: t1:=b*a
t2:=t1-10
a:=t2
goto L1
L3: .

Eliminar expresiones comunes en favor de una sola expresin


a:=b+c+d
b:=b+c+e

Quedara t1:=b+c
a:=t1+d

b:=t1+e

Compiladores
PROGRMA FUENTE
ANALIZADOR LEXICO
ANALIZADOR SINTACTICO
SEMNTICA ESTATICA
CODIGO INTERMEDIO
CODIGO DE MAQUINA
E

COMPUTADORA

OPTIMIZACION

You might also like