Tema: Introducción a Compiladores y al Lenguaje

Anuncio
Compiladores. Guía 1
1
Facultad:
Ingeniería
Escuela:
Computación
Asignatura: Compiladores
Tema:
Introducción
Lenguaje Micro C
a
Compiladores
y
al
Contenido
En esta guía se presenta una breve introducción a los
conceptos básicos que se utilizan en el ámbito de los
compiladores y se familiarizara al alumno con los
lenguajes que se utilizaran en el curso.
Objetivos Específicos
•
•
Entender los conceptos básicos de compiladores
Conocer los lenguajes que se utilizaran en las siguientes
prácticas
Material y Equipo
•
Guía No 1
Introducción Teórica
Lenguajes de Programación
La
programación
de
computadoras
se
realiza
en
los
llamados
lenguajes
de programación,
éstos
posibilitan
la
comunicación
entre
el
programador
y
la computadora,
a
través
de
un
conjunto
de
instrucciones u órdenes especificadas por el lenguaje.
Un lenguaje de programación puede definirse como “una
notación formal para describir algoritmos o funciones que
serán ejecutados por el ordenador”
Según su grado de independencia de la maquina, los lenguajes
de programación se clasifican en:
• Lenguaje maquina: Es la notación que entiende directamente
el ordenador, por eso sus instrucciones están escritas con
código binario. El repertorio de sus instrucciones, así
2
•
•
•
•
Compiladores. Guía 1
como la estructura de estas, están ligadas directamente a
la arquitectura de la maquina.
Lenguaje
ensamblador:
es
esencialmente
una
versión
simbólica de un lenguaje maquina. Cada código de operación
se indica por un código simbólico. Por ejemplo ADD para
adición y MUL para multiplicación.
Lenguajes
de
nivel
medio:
tienen
algunas
de
las
características de los lenguajes de bajo nivel (por
ejemplo acceso directo a posiciones de memoria), añadidas
a posibilidades de manejo de estructuras de control y de
datos de lenguajes de alto nivel.
Lenguajes de alto nivel: facilitan la escritura de
programas
con
estructuras
de
datos
complejas,
la
utilización de bloques, y procedimientos o subrutinas.
Dentro de estos lenguajes destacan un tipo de lenguajes,
denominados lenguajes orientados a objetos, que permiten
definir tipos abstractos de datos.
Lenguajes de orientados a problemas concretos: se utilizan
para la resolución de problemas en un campo específico.
Procesadores de lenguaje
Procesadores de lenguajes es el nombre genérico que reciben
todas las aplicaciones informáticas en las cuales uno de los
datos fundamentales de entrada es un lenguaje. La definición
anterior afecta una gran variedad de herramientas software,
entre las cuales tenemos:
• Traductores: Es un programa que procesa un texto fuente y
genera un texto objeto
• Ensamblador: Si el lenguaje fuente es el lenguaje
ensamblador y el lenguaje objeto es el lenguaje maquina,
entonces al traductor se le llama ensamblador.
• Compiladores: Un traductor que transforma texto fuente de
lenguajes de alto nivel a lenguajes de bajo nivel se le
denomina compilador.
• Intérprete: Son programas que simplemente ejecutan las
instrucciones que se encuentran en el texto fuente.
Traductores
Como ya se menciono, un traductor es un programa que procesa
un texto fuente y genera un texto objeto. El traductor está
escrito en lenguaje de implementación (LI) o también
denominado lenguaje host. El texto fuente está escrito en
lenguaje fuente (LF), por ejemplo un lenguaje de alto nivel.
El texto objeto está escrito en lenguaje objeto (LO), por
Compiladores. Guía 1 3
ejemplo un lenguaje de máquina, ensamblador u otro lenguaje
de alto nivel. Se suele utilizar la notación T, la cual se
muestra en la siguiente figura
LF
LO
LI
La notación T también se puede representar de forma abreviada
como: LFLILO.
Estructura general de un traductor
Todas las fases de un traductor se pueden agrupar en dos
áreas: el análisis del programa fuente y su síntesis en el
correspondiente programa objeto.
El análisis consiste en verificar la corrección del programa
fuente, para lo cual se descompone el programa fuente en
trozos elementales o unidades mínimas sintácticas denominadas
componentes léxicos o tokens. Los tokens se pueden agrupar
para comprobar su disposición correcta en las distintas
construcciones y sentencias del lenguaje a analizar (análisis
sintáctico y semántico). Comprobándose de esta forma la
validez sintáctica y semántica del programa fuente. En caso
contrario se emiten los errores oportunos (manejo de
errores). La información también se utiliza durante la fase
de análisis (por ejemplo ara comprobar si una variable se
intentó declarar dos veces).
La tarea de síntesis tiene por objeto la generación del
código del lenguaje objeto. En el caso particular de los
compiladores suele incluirse también la generación de código
intermedio,
como
un
medio
para
garantizar
la
transportabilidad entre distintas maquina objeto o como
método
para
poder
utiliza
el
mismo
back-end,
entre
compiladores de lenguajes diferentes.
La generación de código intermedia se apoya directamente en
la información recogida en la tabla de símbolos durante la
fase de análisis. La generación de cogió para la máquina
objeto definitiva tan solo se apoya en el código intermedio.
También es necesario un tratamiento de errores para la fase
de síntesis.
La siguiente figura muestra las fases de un traductor
4
Compiladores. Guía 1
Procedimiento
MUSIM/0
Los componentes léxicos o tokens que conforman el lenguaje
son los siguientes:
• Identificadores, que solo son nombres de variables y están
compuestos por una única letra minúscula de rango a-z.
• Constantes numéricas de un solo digito, de rango 0-9.
• Operadores: +,-,*,/, y %.
Compiladores. Guía 1 5
•
•
•
•
•
Símbolo de asignación: = (igual).
Paréntesis: ( y ).
Separador de sentencias: ; (punto y coma).
Indicadores de principio y fin de bloque: { y }.
Palabras reservadas que están formadas por una letra
mayúscula. Tan solo son tres: R (lectura), W(escritura) y
M(programa principal).
Puede observarse que este lenguaje solo permite tres tipos de
sentencias: lectura, asignación y escritura. Tiene un solo
tipo de datos: entero. Las variables están formadas por una
única letra minúscula, y las constantes son de un dígito.
Tiene
cinco
operadores
+(adición),
-(diferencia),
*(producto), /(división entera), y %(modulo). Se permite el
uso de paréntesis.
Ejemplo 1:
M
{
R
R
c
W
}
a;
b;
= a + b;
c;
Analicemos lo que hace este programa.
“R a” y “R b” indica que le leen las variables a y b.
“c = a + b” indica que en la variable c se asignara el
resultado de la suma de a y b.
“W c” indica que se escribirá la variable c.
En pocas palabras, este programa leerá dos variables, las
sumara y finalmente mostrará el resultado en pantalla.
Ejercicio 1
M
{
R a; R b; R c;
p = (a + b + c)/3;
W p;
}
Describa lo que hace el programa anterior según las
definiciones del lenguaje:
_____________________________________________________________
_____________________________________________________________
6
Compiladores. Guía 1
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
Ejercicio 2
M
{
R a;
R b;
r = (a * a) + (b * b);
W r;
}
Describa lo que hace el programa anterior:
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
Ejercicio 3
Escriba un programa en MUSIM/0 que lea un número, calcule y
muestre en pantalla cuanto es ese número elevado al cubo.
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
Ejercicio 4
Escriba un programa en MUSIM/0 que lea 5 números, calcule y
muestre en pantalla: la sumatoria, promedio y multiplicatoria
de los 5 números.
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
Compiladores. Guía 1 7
Ejercicio 5
Escriba un programa en MUSIM/0 que lea un número y determine
si este es par o impar. Si es par deberá mostrar 0 en
pantalla, mientras que si es impar deberá mostrar 1
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
ENSAMPOCO/0
Como lenguaje objeto se utiliza un lenguaje intermedio que es
un pequeño ensamblador, que se denomina ENSAMPOCO/0. Este
ensamblador trabaja sobre una maquina abstracta, en este caso
particular es una máquina de pila. La maquina tendrá una
memoria de 26 celdas cuyas direcciones se nombrarán con las
letras de la ‘a’ a la ‘z’, y una pila LIFO donde se
realizarán las operaciones aritméticas.
A continuación se describe
distintas instrucciones.
Instrucción
.CODE
PUSHC
PUSHA
LOAD
STORE
la
forma
de
trabajo
de
las
Descripción
Indica el comienzo del código
Coloca una constante en la pila. El operando
es una constante
Coloca en la pila la dirección de una
variable. El operando es una variable, dado
que las direcciones se denominan con el
nombre de las variables
Asume que el último valor insertado en la
pila es una dirección. Esta dirección es
extraída de la pila y en su lugar se pone el
valor ubicado en dicha dirección. No tiene
operando
Usa los dos últimos elementos de la pila. Uno
es la dirección de una celda y memoria y el
otro el valor a almacenar en dicha celda. El
último elemento de la pila es el valor y el
otro la dirección. Después de ejecutada la
instrucción, los dos elementos implicados son
8
Compiladores. Guía 1
NEG
ADD
MUL
DIV
MOD
INPUT
OUTPUT
END
extraídos de la pila, dejándolos en el mismo
lugar. No tiene operando.
Cambia el signo del último valor introducido
en la pila, dejándolo en el mismo lugar. No
tiene operando
Opera
con
los
dos
últimos
elementos
introducidos en la pila, extrayéndolos y
dejando en su lugar el resultado. Por lo
tanto
la
pila
habrá
disminuido
en
un
elemento. No tiene operando.
Opera
con
los
dos
últimos
elementos
introducidos en la pila, extrayéndolos y
dejando en su lugar el producto. Por tanto la
pila habrá disminuido en un elemento. No
tiene operando.
Opera
con
los
dos
últimos
elementos
introducidos en la pila, extrayéndolos y
dejando en su lugar el producto. Por lo tanto
la pila habrá disminuido en un elemento. No
tiene operando.
Opera
con
los
dos
últimos
elementos
introducidos en la pila, extrayendo primero
el denominador y después el numerador y
dejando en su lugar el modulo. Por tanto, la
pila habrá disminuido en un elemento. No
tiene operando.
Toma el valor del buffer de entrada, en este
caso el teclado, y lo coloca en la dirección
asignada a la variable. La pila no sufre
cambios.
Toma el valor de la dirección indicada y lo
lleva al buffer de salida, en este caso la
pantalla. La pila no sufre cambios.
Indica el fin de programa.
Ejemplo 3
A continuación se muestran un programa fuente en MUSIM/0, y
su traducción al código intermedio ENSAMPOCO/0
Código en MUSIM/0
M
{
R a;
R b;
z = a + b;
W z;
}
Compiladores. Guía 1 9
Traduccion a ENSAMPOCO/0
.CODE
INPUT a
INPUT b
PUSHA z
PUSHA a
LOAD
PUSHA b
LOAD
ADD
STORE
OUTPUT z
END
Ejercicio 6
Traducir el siguiente código en MUSIM/0 A ENSAMPOCO/0
M
{
R a;
R b;
z = a + b - 2;
W z;
}
Traducción a ENSAMPOCO/0
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
10 Compiladores. Guía 1
Ejercicio 7
Traducir el siguiente código en MUSIM/0 a ENSAMPOCO/0
M{ R a; R b; R c;
q = (a * a) + (b * b) + (c * c);
W q; }
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
Compiladores. Guía 1 11
Lenguaje Micro C o C-:
El lenguaje Micro C es un subconjunto pequeño del lenguaje de
programación C. Como referencia utilice el Apéndice A
“Proyecto
de
Compilador”
del
libro
Construcción
de
Compiladores de Kenneth C. Louden, el cual define al lenguaje
de programación denominado C Minus o C-.
Micro-C es un lenguaje case sensitive, es decir que el
compilador de este lenguaje trata a las letras mayúsculas y
minúsculas como caracteres diferentes.
Los comentarios y caracteres ignorados.
Los comentarios son secuencias de carácter incluido dentro de
par de secuencias de /*…*/ pareados. Los comentarios pueden
extender sobre varias líneas, pero los comentarios anidados
no se reconocen, es decir que el primer encontrado */ dentro
de un comentario lo cierra. Otros
caracteres
ignorados
incluyen el newline, la tabulación horizontal, el CR,
y el espacio blanco.
Tokens
Las secuencias de caracteres encerrados dentro de dos
apóstrofes (') son símbolos
terminales.
Cualquier
otra
secuencia de caracteres denota el nombre de una clase léxica,
por ejemplo:
En secciones posteriores
léxicas siguientes:
utilizaremos
las
definiciones
• letra = ' _ ' | ' a ' | ' b ' |... | ' z ' | ' A ' | ' B '
|... | ' Z '
• dígito = ' 0 ' | ' 1 ' |... | ' 9 '
Observe que el carácter underscore (_) es tratando como una
letra.
Identificadores:
Un identificador es una secuencia finita de letras y de
dígitos que comienzan con una letra. Los identificadores
pueden
ser
de
cualquier
longitud,
sin
embargo,
los
12 Compiladores. Guía 1
identificadores sin diferencia en sus primeros 8 caracteres
correspondientes se consideran iguales.
• Identificador = (letra) (letra | dígito) *.
Constantes numéricas.
Un integer_constant es una secuencia de dígitos
comenzar con un 0, a menos que sea el número 0).
(no debe
• integer_constant = digit+
Una constante numérica se debe separar de un identificador o
de una palabra clave.
Constantes de carácter.
Un chat_constant se define como una comilla simple de
apertura (“”), un carácter ASCII extendido imprimible y una
comilla simple de cierre.
Strings Constantes.
Una constante de string es una secuencia de los caracteres
incluidos dentro de dos comillas dobles ("). Una constante de
string puede incluir la secuencia \” que representa un
carácter de
comillas doble en la secuencia en la cual
ocurre, tal que no termina el string. La secuencia \n
representa el carácter del NEWLINE, mientras que la secuencia
\ \ representa el carácter del backslash y se puede
incluir en un string también. Una secuencia consistente
de un backslash seguido por cualquier carácter a excepción de
'n', '\ ', o ' " ' es ilegal. Por consiguiente, un string
constante no debe extenderse más allá del extremo
de la
línea. Un par de /*…*/ dentro de un string constante no se
trata como comentario.
Operadores
•
•
•
•
add_op = ' + ' | ' - '
mul_op = ' * ' | '/'
eq_op = ' = = ' | '! = '
rel_op = ' < ' | ' < = ' | ' > = ' | ' > '
Compiladores. Guía 1 13
Investigación complementaria.
1) Investigar que es léxico y en qué consiste el análisis
léxico de un traductor.
2) Investigar que es MICRO C, cuáles son sus definiciones
léxicas (Identificadores, constantes numéricas, constantes
de carácter, operadores, otros símbolos, entre otros).
3) Escribir un programa fuente en MICRO C que lea una
temperatura en grados Celsius, lo convierta a temperatura
absoluta y este resultado lo muestre en pantalla.
4) Escribir un programa en MICRO C que calcule el factorial
de un número.
5) Investigar con el tutorial de Jflap como implementar
Autómatas Finitos Deterministas (AFD).
14 Compiladores. Guía 1
Hoja de cotejo:
Guía 1: Introducción a Compiladores
y al Lenguaje Micro C
Alumno:
Máquina No:
Docente:
GL:
1
1
Fecha:
EVALUACION
%
CONOCIMIENTO
Del 20
al 30%
APLICACIÓN
DEL
CONOCIMIENTO
Del 40%
al 60%
1-4
5-7
8-10
Conocimie
nto
deficient
e de los
fundament
os
teóricos
Conocimiento
y explicación
incompleta de
los
fundamentos
teóricos
Conocimiento
completo y
explicación
clara de los
fundamentos
teóricos
No tiene
actitud
proactiva
.
Actitud
propositiva y
con
propuestas no
aplicables al
contenido de
la guía.
Tiene actitud
proactiva y sus
propuestas son
concretas.
ACTITUD
Del 15%
al 30%
TOTAL
100%
Nota
Descargar