Está en la página 1de 13

UNIVERSIDAD NACIONAL

“SANTIAGO ANTÚNEZ DE MAYOLO”

FACULTAD DE CIENCIAS

Escuela Profesional de Ingeniería de Sistemas e


Informática

“CODIGO FINAL”

DOCENTE: ING.SILVA ZAPATA MIGUEL ANGEL

CURSO: TEORIA DE LENGUAJES

CICLO: VII

INTEGRANTES:

 CHAVEZ TORRES, Cristian


 FIGUEROA VILLANUEVA, Juan
 IBARRA VILLAFAN, Mack
 ROSAS CAMPOS, Eric

HUARAZ – 2012
INDICE: Pag.

I. Introducción………………………………………………………………..……...03

II. Código Final………...……………………………………………………………...04

2.1. GeneraciónCódigo Objeto o Final…………………………………………...04

2.2. Código Objeto o Final……………………...……………………………………...06

2.3. Partes de Ejecución del Código Objeto………………………………………...10

2.4. Tipos de Arquitecturas Físicas…………………….………………………….....13

III. Conclusiones…………………………………………………………………..….16

IV. Bibliografía…………………………………………………………………………17
I. INTRODUCCION

En este informe tratamos específicamente del Código Final, el


cual es la salida del compilador, luego de que el código fuente
haya pasado por todos los subprogramas de compilación como
son el Análisis Léxico, Análisis Sintético, Análisis Semántico, La
Generación de Código Intermedio, la Optimización del Código
Intermedio que finalmente nos da el código final, código que
ejecuta el programa bien directamente, o bien pasándolo a código
ensamblador. También se abordará sobre las estructuras físicas
que ejecutan las instrucciones del código objeto, para poder
comprender un poco más sobre la interacción del compilador con
la máquina.

El conocimiento del funcionamiento de un compilador,y el


conocimiento de un lenguaje objeto o final ayuda a cualquier
profesional en el ámbito de programación a ampliar sus horizontes
y a conocer más pues logra entender el sentido y la forma de
ejecución del lenguaje de programación con el que trabaja

II. CODIGO FINAL

2.1. GENERACION DEL CODIGO FINAL O CODIGO OBJETO:

La fase de generación de código final tiene por objeto traducir la secuencia de


instrucciones de código intermedio en una colección de instrucciones ejecutables y
direccionables, aunque también puede ser generado directamente del análisis
semántico, con lo cual la generación de código intermedio y la optimización de
código no se realizan. Esta generación de código se da para una arquitectura física
específica. Las condiciones arquitectónicas del entorno de ejecución van
acondicionar considerablemente este proceso de compilación.

Esta fase recibe a la entrada un programa en un lenguaje intermedio (código de pila,


de tres direcciones, estructurado como árbol, etc.) y emite código de máquina para
una máquina objetivo (código objeto). La generación de código máquina con el
correspondiente optimizador forma el back end del compilador. Debe escribirse un
back end para cada máquina para la que deseamos generar código.

Usualmente, el código de entrada ya ha sufrido una primera fase de optimización


que permite eliminar cierta redundancia del código, aprovechar mejor el espacio
(eliminando las variables temporales que no se necesitan), entre otras mejoras
posibles. En esta fase el código generado es llamado código objeto.

Proceso de Traducción de Código Intermedio a Código Máquina:

El proceso de traducción directo es relativamente sencillo. Cada instrucción del


código intermedio puede traducirse por una secuencia de instrucciones de máquina.

Así las instrucciones:

r1:= &FP[-3]
r2:= &FP[-2]
r1:= r1+r2
&FP[-1]:= r1
Existen lenguajes pseudointerpretados que utilizan código intermedio como el
lenguaje java que tiene por ejemplo la extensión .class. Utilizando los bytecodes que
son interpretados por una maquina virtual (en este caso JavaVirtualMachine).

Ahora estudiaremos más a fondo el código final o código objeto:

2.1. CODIGO FINAL O CODIGO OBJETO:

El código objeto generado por un compilador puede ser de 3 distintas maneras.

2.1.1.- Lenguaje Máquina o Código Ensamblador.- Crea instrucciones


simbólicas para ser ejecutadas por medio del ensamblador para ejecutar las
instrucciones del programa, pues este es el lenguaje que la máquina
reconoce, tiene la extensión .ASM.

2.1.2.- Lenguaje de Máquina Relocalizable.- Permite compilar por separado


los subprogramas del programa, siendo un sistema flexible, el cual es el más
común en la mayoría de compiladores comerciales, funciona separando el
programa en módulos objetos que se pueden enlazar y cargar para su
ejecución en el momento que son invocados mediante un cargador
enlazador. Tiene la extensión .OBJ

2.1.3.- Lenguaje de Máquina Absoluto.- Se coloca en una posición fija de la


memoria y se ejecuta inmediatamente, el cual es muy eficiente pero no es
flexible. Tiene la extensión .EXE

Ventajas del Lenguaje Ensamblador:

Simplifica la generación de código debido al uso de instrucciones simbólicas y


nombres simbólicos.

Capa de abstracción lógica.

Las arquitecturas pueden ser descritas por un lenguaje ensamblador,


Podemos modificar la implementación.

Desventajas

Proceso adicional de ensamblaje y linking

Linker.- Ver todos los archivos objetopara encontrar símbolos no resueltos,


ejecutar los símbolos y encontrar las partes necesarias en las librerías
disponibles en una sola imagen de memoria, resolver todos los nombres
simbólicos a las direcciones correctas de memoria y salidas adecuadas.

2.2. PARTES DE EJECUCION DEL CODIGO OBJETO:


2.2.1.- Administración de Memoria.

Esto se refiere a seleccionar la correspondencia entre los nombres del


programa y las direcciones de objetos de datos en la memoria, en esta fase
las entradas de la tabla de símbolos se van creando conforme se examina las
declaraciones de un procedimiento o método, el tipo de una declaración
determina la cantidad de memoria que necesaria para el nombre declarado.

Modos de Direccionamiento:

2.2.1.1.- Direccionamiento Inmediato.- El direccionamiento inmediato es


aquel en el que el operando forma parte la propia instrucción de código
ejecutable. Se expresa ante poniendo # al valor del operando.

Ejemplo:

ADD R1 #3

2.2.1.2.- Direccionamiento Directo al Registro.- El direccionamiento directo al


registro permite direccionar un valor que está almacenado en uno de los
registros del entorno de ejecución del objetivo.

Ejemplo:

ADD R1 3

2.2.1.3.- Direccionamiento Directo a la Memoria.- El direccionamiento


inmediato a la memoria opera con un valor almacenado en una dirección
absoluta de memoria. Se utiliza / para representarlo.

Ejemplo:

ADD R1 /1000

2.2.1.4.- Direccionamiento Indirecto.- El direccionamiento indirecto opera con


el valor almacenado en la dirección de memoria apuntada en el registro dado.
Se pone entre [] el nombre del registro.

Ejemplo:

ADD R1 [R3]
2.2.1.5.- Direccionamiento Relativo al Registro.- El direccionamiento relativo
al registro permite expresar una dirección de desplazamiento sobre la base
del valor de memoria en un registro.

Ejemplo:

ADD R1 #3[SP]

2.2.1.6.- Direccionamiento Relativo al Contador del Programa.- Utilizado en


las instrucciones de salto, este direccionamiento expresa un direccionamiento
relativo al registro contador del programa. Se usa $ y se omite el registro.

Ejemplo:

BR $3

2..2.2.- Selección de Instrucciones.

Todas las instrucciones deben ser uniformes y completas, es un factor importante


para la velocidad de la ejecución de las instrucciones; la eficiencia del programa
objeto se debe a la selección correcta de instrucciones a realizar.

En particular, muchos lenguajes de máquina tienen instrucciones especializadas


que permiten ahorrar espacio, accesos a memoria y/o una ejecución más eficiente.

2.2.3.- Asignación de Registros.

Según las instrucciones que envía el compilador, existen algunas que operan en el
registro, las cuales son más rápidas que las que operan en la memoria, para lo cual
se debe hacer un uso adecuado de los registros. La asignación de registros se
realiza en 2 subprogramas:

En el primer subprograma, se selecciona el conjunto de variables que residirá en los


registros en un momento del programa

En el subprograma siguiente, se escoge el registro específico en el que residirá una


variable

2.2.4.- Elección del Orden de Evaluación.


En esta parte se elige el orden en el cual se realizarán los cálculos a ejecutar,
dependiendo del orden que los ejecute variará la eficiencia del código objeto, pues
algunos ordenamientos de cálculos necesitan menos registros que otros para
guardar resultados intermedios y finales.

2.3. TIPOS DE ARQUITECTURAS FISICAS:


El tipo de arquitectura del entorno de ejecución para el cual se está generando el
código final condiciona directamente la anatomía del mismo. En efecto, los recursos
de la máquina suelen condicionarla estructura y prestaciones del juego de
instrucciones con lo que la traducción puede ser muy diferente de una máquina a
otra.

2.3.1.- Máquinas a Pila.- Las máquinas a pila disponen de una pila de


operandos donde realizan todas las operaciones propias de la unidad
aritméticológica. Para operar una operación aritmética, por ejemplo, primero
se meten los operandos en la pila uno o dos según sea unaria o binaria la
operación–y después se aplica el operador que extrae de la pila el número de
operandos que requiere e inserta el resultado en la cima.

2.3.2.- Máquinas con registro acumulador.- Las máquinas con registro


acumulador disponen, a parte de otros recursos, de un registro especial
llamado registro acumulador contra el que se realizan todas las operaciones
de la unidad aritmético lógica. Cuando se desea hacer una operación binaria
uno de los datos aparece como operando de la operación mientras que el
otro se carga en el acumulador y funciona como operando implícito.

2.3.3.- Máquinas con Código de Terceros.- En las máquinas con código de


terceros las operaciones de las instrucciones disponen a lo sumo de dos
operandos sobre los cuales realizar la operación. Frecuentemente el primero
de ellos se utiliza como argumento de entrada y salida donde se almacena el
resultado final. Si no se quieren perder los resultados de los operandos hay
que guardar previamente los datos.

2.3.4.- Máquinas con Código de Cuartetos.- Es poco frecuente encontrar


máquinas con instrucciones basados en cuartetos. No obstante es necesario
estudiarlas. En las máquinas de cuartetos las cuadruplas de código
intermedio tienen una traducción directa a las instrucciones de la arquitectura
final. Esto simplifica considerablemente el proceso.

III. CONCLUCIONES:
 La generación del código final o generación del código objeto es el
proceso final de la compilación, esta consiste en llevar el código
intermedio a código maquina.

 La generación de código final es un proceso sencillo de traducción


de un código intermedio a un código máquina final, el cual realiza
la traducción de instrucciones por bloques de código.

 El lenguaje Máquina obtenido dependerá de la máquina con que


se trabaje, pueda ser de ejemplo Intel, Motorola, etc.Por ende el
compilador está orientado a tener su salida de acuerdo a la
máquina en que trabaje.

 Los lenguajes interpretados como java, envían su código


intermedio a una maquina independiente que ejecutará el
programa, en caso de java la JavaVirtualMachine. Eso quiere
decir que no trabaja con la máquina física, con la ventaja de la
portabilidad.
IV. BIBLIOGRAFIA:

-Construcción de Compiladores: Principios y Práctica Kenneth C. Louden


International thomsom Editores, 2004 ISBN 970-686-900-4

-Compiladores: Principios, técnicas y herramientas. Aho, Lam, Sethi, ullman,


Adison-Segunda Edición mexico 2008

-Procesadores de lenguajes Francisco José Ribadas pena 22 de mayo de 2009

También podría gustarte