NACIMIENTO
En la década de los 40 donde nació
el primer ordenador se comenzó a crear los primeros códigos numéricos, claves,
lenguaje ensamblador, etc. Pero el hombre buscaba la
creación de un lenguaje más sencillo donde no tocara solo trabajar con un
lenguaje maquina o de bajo nivel, entonces aparecieron los compiladores.
Un compilador es un traductor
avanzado que genera un archivo ejecutable optimizado. En otras palabras proceso
de traducción de un código fuente, escrito a través de un lenguaje de
programación de alto nivel y para que este código pueda ser ejecutada por la
computadora además tiene que ser procesada por un lenguaje de máquina.
Un compilador consta de dos
partes:
Front End: parte que analiza el
código fuente, comprueba su validez, genera el árbol de derivación y rellena
los valores de la tabla de símbolos.
Back End: parte en donde se
genera el código máquina exclusivo para una plataforma a partir de lo analizado
en el front end.
Por lo general el resultado del
back end no puede ser ejecutado directamente, se necesita pasar por un proceso
de enlazado (linker).
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 la forma de trabajo de las distintas instrucciones.
Instrucción Descripción
.CODE
Indica el comienzo del código
PUSHC
Coloca una constante en la pila. El operando
es una constante
PUSHA
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
LOAD
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
STORE
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
extraídos de la pila, dejándolos en el mismo
lugar. No tiene operando.
NEG
Cambia el signo del último valor introducido
en la pila, dejándolo en el mismo lugar. No
tiene operando
ADD
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.
MUL
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.
DIV
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.
MOD
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.
INPUT
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.
OUTPUT
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.
END
Indica el fin de programa.
Ejemplo 2
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;
}
Traduccion a ENSAMPOCO/0
.CODE
INPUT a
INPUT b
PUSHA z
PUSHA a
LOAD
PUSHA b
LOAD
ADD
STORE
OUTPUT z
END
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
• 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 a;
R b;
c = a + b;
W 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.
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 la forma de trabajo de las distintas instrucciones.
Instrucción Descripción
.CODE
Indica el comienzo del código
PUSHC
Coloca una constante en la pila. El operando
es una constante
PUSHA
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
LOAD
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
STORE
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
extraídos de la pila, dejándolos en el mismo
lugar. No tiene operando.
NEG
Cambia el signo del último valor introducido
en la pila, dejándolo en el mismo lugar. No
tiene operando
ADD
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.
MUL
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.
DIV
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.
MOD
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.
INPUT
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.
OUTPUT
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.
END
Indica el fin de programa.
Ejemplo 2
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;
}
Traduccion a ENSAMPOCO/0
.CODE
INPUT a
INPUT b
PUSHA z
PUSHA a
LOAD
PUSHA b
LOAD
ADD
STORE
OUTPUT z
END
0 Response to " "
Publicar un comentario