Está en la página 1de 23

Generación de código Objeto

YAQUELIN RAMÍREZ ORTEGA


ELSA VAZQUEZ RAMIREZ
JONATHAN MINORS SÁNCHEZ
ALEJANDRO HERNÁNDEZ PATRICIO
ÁNGEL GALINDO CAMACHO
HAIRO ARMANDO BAUTISTA
Introduccion.

La fase final de nuestro modelo de


compilador es el generador de código
Toma por entrada una RI del fuente y
produce su equivalente en código objeto
Las técnicas que veremos son
independientes de si se realiza o no
optimización
Introduccion.

Los requerimientos que, tradicionalmente,


se imponen en un generador de código
son muy demandantes
El código generado debe ser correcto y de
alta calidad (debe hacer uso efectivo de
los recursos de la máquina objeto)
El generador, además, debe ser eficiente
El problema de generar código óptimo es
no decidible
En la práctica, se utilizan heurísticas que
generan código bueno (aunque
probablemente no óptimo)
Lenguaje Maquina.

Lenguaje de máquina es el sistema de códigos


directamente interpretable por un circuito
microprogramable, como el microprocesador de una
computadora o el microcontrolador de un autómata
(un PLC) . Este lenguaje está compuesto por un
conjunto de instrucciones que determinan acciones a
ser tomadas por la máquina..
Lenguaje Maquina.

Un programa de computadora consiste en una cadena


de estas instrucciones de lenguaje de máquina (más
los datos). Estas instrucciones son normalmente
ejecutadas en secuencia, con eventuales cambios de
flujo causados por el propio programa o eventos
externos. El lenguaje de máquina es específico de
cada máquina o arquitectura de la máquina, aunque
el conjunto de instrucciones disponibles pueda ser
similar entre ellas
Patrocinado Por Wikipedia:

Lenguaje de máquina del Intel 8088. El código de máquina se resalta en rojo, el


equivalente en lenguaje assembler en magenta, y las direcciones de memoria donde
se encuentra el código, en azul.
Lenguaje Ensamblador.

Es un lenguaje de bajo nivel para las computadoras de


programación. Pone una representación en ejecución
simbólica del numero, códigos automáticos y otras
constantes necesitaron programar un detalle CPU
arquitectura. Esta representación es definida
generalmente por el fabricante de hardware, y basada
en las abreviaturas esa ayuda el programador recuerda
instrucciones individuales, registros, etc. Un lenguaje
ensamblador es así específico a cierta arquitectura de
computadora física o virtual (en comparación con la
mayoría de idiomas de alto nivel, que son portables).
Características De Lenguaje Ensamblador.

1.Velocidad. –Como trabaja directamente con el microprosesador al ejecutar un programa, pues como
este lenguaje es el mas cercano a la máquina lo procesa mas rápido.

2.Eficiencia de tamaño.-Un programa en ensamblador no ocupa mucho espacio en memoria porque no


tiene que cargan librerías y demás como son los lenguajes de alto nivel.

3.Flexibilidad.-Es flexible porque todo lo que puede hacerse con una máquina, puede hacerse en el
lenguaje ensamblador de esta máquina; los lenguajes de alto nivel tienen en una u otra forma limitantes
para explotar al máximo los recursos de la máquina.
4.Tiempo de programacion.-Como es un lenguaje de bajo nivel requiere más instrucciones para
realizar el mismo proceso, en comparación con un lenguaje de alto nivel.

5.Programas fuentes grandes.-Por las mismas razones que aumenta el tiempo, crecen los programas
fuentes; simplemente requerimos más instrucciones primitivas para describir procesos equivalentes.

6.Peligro al afectar recursos inesperadamente.-Que todo error que podamos cometer, o todo
riesgo que podamos tener, podemos afectar los recursos de la maquina, programar en este lenguaje lo
más común que pueda pasar es que la máquina se bloquee o se reinicialice.
Almacenamiento L .E.

Una de las principales ventajas del uso del


ensamblador, es que se encarga de administrar de
manera transparente para el usuario la creación de
memoria, las bifurcaciones y el paso de
parámetros.

Además nos permite acceder directamente a los


recursos de la máquina para un mejor desempeño.
Aspectos generales:

Entrada al generador de código (RI)


Programas objeto
 Administración de memoria
Selección de instrucciones
Adjudicación de registros
Elección de orden de evaluación
Entrada Del Código Objeto.

La entrada consiste en la RI del código fuente,


producida por el frontend, junto con la
información de la tabla de símbolos

La TS se utiliza para determinar las direcciones


en tiempo de ejecución de los objetos de datos
denotados por los nombres en la RI

Asumimos que la RI es de “suficiente bajo nivel”


con tipos de datos que se pueden mapear
razonablemente a la arquitectura objeto
Entrada Del Código Objeto.

Asumimos que el chequeo de tipos ya fue


realizado, con la adecuada inserción de
operadores de cambio de tipos, y demás

Asumimos que no hay errores semánticos


obvios (Ej., intentar indizar un arreglo con
un punto flotante)

Esta fase se basa en la asunción de que


la RI no tiene errores (aunque en algunos
compiladores, el chequeo se realiza a la
vez que la generación de código)
Código Objeto.

La salida del generador es el código o


programa objeto, el cual puede tomar
distintas formas:
– código máquina absoluto
– código máquina reubicable
– código assembler
Código Maquina Absoluto.

Producir código máquina absoluto como


salida conlleva la ventaja de que puede
ser ubicado en un lugar fijo de memoria y
ejecutado inmediatamente
Código Reubicable.

Código reubicable (también llamado


módulo objeto) permite tener módulos que
se compilan por separado. Luego se unen
(linking) y se cargan

En este caso se gana mucha flexibilidad


en función del trabajo que conlleva la
unión y carga.

Si la máquina objeto no se hace cargo de


la reubicación, el compilador debe
producir información explícita para el
linker
Código Assembler.

Finalmente, producir código assembler


como salida facilita el proceso de
compilación. Podemos generar
instrucciones simbólicas y usar las macros
de assembler como ayudas.

Finalmente, facilita la optimización “a


mano” del código generado.

El precio es que aparece una etapa final


de ensamblado
Administración De Memoria.

Consiste en determinar la posición de


memoria en la que los diferentes símbolos
del programa almacenan la información

Depende de la estrategia utilizada para la


gestión de memoria, el mecanismo puede
variar
Selección De Instrucciones.

La naturaleza del conjunto de instrucciones de


la máquina objeto, determina la dificultad de la
selección de instrucciones

La uniformidad y completitud del conjunto de


instrucciones son factores muy importantes.

Si la máquina objeto no soporta cada tipo de


datos de forma uniforme, entonces se necesitan
estrategias alternativas
Selección De Instrucciones.

Si no nos interesa la eficiencia, para cada tipo


de sentencia en C3D podemos diseñar un
esqueleto de código que muestra el código
objeto a generar para esa construcción
• Ej.: x:=y+z
– MOV Y, R0
– ADD Z, R0
– MOV R0, X
• Esto genera código pobre
Selección De Instrucciones.

Por ejemplo:
– a := b + c
– d := a + e
Se traduce a
– MOV b, R0
– ADD c, R0
– MOV R0, a  redundante?
– MOV a, RO  redundante?
– ADD e, R0
– MOV R0, d
Selección De Instrucciones.

La calidad del código generado se mide en


función de
– Tamaño
– Velocidad
En función de la variedad de instrucciones uno
puede seleccionar la instrucción más
performante (ej. INC vs MOV - ADD - MOV).
Para los casos no triviales, es un problema
muy complejo.
Asignación De Registros.

Operar sobre registros es más rápido y


eficiente que operar sobre memoria
Por ello, la adjudicación eficiente de
registros tiene un gran impacto en la
Performance

El uso de registros puede dividirse en


dos subproblemas:
– Durante la reserva de registros
(allocation), se seleccionan el conjunto de
variables que vivirá en registros en un punto
del programa.
– Durante la (posterior) asignación de
registros (assignation), se elige el registro
específico para cada variable.
Orden De Evaluación.

El orden en que algunas computaciones


se llevan a cabo puede afectar la
eficiencia del código objeto

Algunos ordenes requieren menos


registros para almacenar valores
Intermedios

Seleccionar el orden óptimo es también


NP-completo

También podría gustarte