Anda di halaman 1dari 5

RAMIREZ PELAEZ ENRIQUE PROGRAMACION DE SISTEMAS ING.

GABRIELA OROZCO MAGALLON GRUPO 3512 Nombre(s): RAMIREZ PELAEZ ENRIQUE Nombre de la asignatura: PROGRAMACION DE SISTEMAS Nombre del profesor(a): GABRIELA OROZCO MAGALLN Matrcula(s): 08090758

Generacin de Cdigo Intermedio y Final


Introduccin: En el presente trabajo se refiere al tema de generacin de cdigo intermedio y final, esto quiere decir que genera un cdigo intermedio entre el cdigo del lenguaje que uno quiere compilar y el lenguaje de la maquina de destino. Adems este cdigo no concreta las caractersticas de la maquina final pero organiza el cdigo objeto para que sea el mismo o casi el mismo, independientemente del lenguaje. Resumen TIPOS DE CODIGO INTERMEDIO Hay mas tipos de CI, los ms utilizados son: el cdigo de tres direcciones y el cdigo de maquina virtual de pila. La generacin de cdigo intermedio es la ltima fase del proceso de creacin de un compilado. El resultado es un programa en CI que luego ser interpretado o compilado en una maquina final. Cdigo en tres direcciones Se trata de un formato de representacin en el que todas las operaciones se representan por cudruplas, o registros con cuatro campos, en las que la primera de ellas es el tipo de operacin, las dos siguientes son dos direcciones y la ultima una direccin de resultado. Este tipo de representacin tiene su origen en la posibilidad de representar las expresiones aritmticas por medio de una operacin, dos operandos y un resultado. Cdigo de maquina virtual de pila Consiste en utilizar una pila para guardar los resultados intermedios en la evaluacin de expresiones y para otras funciones. Operadores sobrecargados Cuando se quiere obtener el CI de una operacin entre dos valores, se debe analizar que sean del mismo tipo y asi generar su CI. Pero hay lenguajes en que se permite que se operen valores de distinto tipo. En este caso, aunque no se generara ningn error semntico si se intenta operara entre dos valores de tipos diferentes, se deber decidir si el resultado es de un tipo u otro. El CI deber hacer las conversiones de tipos adecuadas.

RAMIREZ PELAEZ ENRIQUE PROGRAMACION DE SISTEMAS ING. GABRIELA OROZCO MAGALLON GRUPO 3512 CODIGO INTERMEDIO PARA EXPRESIONES Conforme se va generando CI, este se va escribiendo en un archivo de cdigo intermedio y al final del proceso se procesara este archivo para generar el cdigo final. Direcciones temporales son donde se guardan valores parciales. CODIGO INTERMEDIO PARA ASIGNACIONES Esta instruccin consiste en asignar el valor de la expresin de la derecha de la asignacin a la variable a la izquierda de la misma. SENTENCIA DE ENTRADA Y SALIDA Estas sentencias se tratan de manera diferente para maquinas diferentes, po lo que CI depender de la maquina fina. Por lo general, se tratara de comprobar que la sentencia de entrada la variable donde se guarda la entrada existente y es del tipo adecuado y para las sentencias de salida los datos de salida son los adecuados. SENTENCIA CONDICIONAL Esta sentencia es parecida en todos los lenguajes imperativos, se encarga de comprobar que la condicin se cumpla si es asi se guarda en el primer bloque y si no pueden ocurrir dos cosas si hay un else se ejecuta su bloque y si no se termina sin hacer nada. ITERACION TIPO WHILE No hay bloques else, al final del bloque de sentencias hay un salto al comienzo de la condicin. Se pone una etiqueta al principio de la instruccin. Si la condicin es falsa se salta a la otra etiqueta que se pone al final de la instruccin. Pero si la condicin es verdadera se ejecuta el bloque de cdigo. Al final del bloque se debe un salto incondicional a la etiqueta que seala el principio de la instruccin. Se permite salir de interaccin con una sentencia de ruptura (break). Para implementar esta sentencia hay que provocar un salto a la etiqueta del final de la iteracin. ITERACION TIPO REPEAT-UNTIL Y DO-WHILE La caracterstica comn es que la condicin de la interaccin se evala al final del bloque, es decir que el bloque se ejecuta al menos una vez. ITERACION TIPO FOR En este tipo de iteracin, aunque tiene similitudes en los lenguajes mas comunes, tambin hay algunas diferencias. Por ejemplo, en Pascal solo se permite utilizar utilizar variables del tipo entero para el contador de la iteracin. Pero a la hora de generas CI los lenguajes imperativos ms comunes funcionan igual. LA SELECCIN Lo primero que habra que realizar es hacer las comprobaciones semnticas (por ejemplo, comprobar que E es del tipo adecuado y acorde con los valores de case). Despus, se debe incluir las acciones semnticas oportunas.

RAMIREZ PELAEZ ENRIQUE PROGRAMACION DE SISTEMAS ING. GABRIELA OROZCO MAGALLON GRUPO 3512 CODIGO INTERMEDIO PARA VECTORES Hay dos pasos para obtener la direccin de un elemento de un vector, el primero es calcular el orden en que est en la lista de elementos del vector y el segundo es acceder a la direccin de ese elemento. Como el acceso a la posicin de un elemento de un vector no suele estar concretado en tiempo de compilacin, no se puede comprobar directamente si tal elemento esta o se intenta acceder a un elemento fuera del rango del vector, por lo que esta comprobacin est a cargo del usuario. Tambin se puede comprobar el acceso dentro del rango del vector generado el cdigo final correspondiente para esta tarea. En memoria, los elementos del vector estn guardados unos detrs del otro y en la tabla de smbolos se indica la direccin del primero. CODIGO INTERMEDIO PARA REGISTROS El clculo de la direccin de cada campo del registro se podra hacer en tiempo de compilacin. Como la estructura y el nombre de los campos de los registros estn en la tabla de tipos, debemos acudir a ella para realizar la comprobaciones semnticas oportunas (ver si el acceso de un campo de una variable registro es adecuado respecto al nombre y el tipo, etc.). Tambin acudimos a ella para saber la direccin relativa de los elementos de cada campo respecto al primer elemento de la variable registro. La direccin relativa se tiene que calcular en la tabla tipos. Esta direccin es relativa es la distancia desde el primer elemento del registro en la tabla de tipos hasta el elemento sealado. ESPACIO DE DIRECCIONES Un aspecto importante a la hora de afrontar la creacin de un compilador es organizar el espacio de direcciones, es decir dnde va cada objeto dentro de la memoria fsica del computador de destino. Se genera un CI tomando en cuenta la organizacin de la maquina final y, de las funcionalidades de su lenguaje ensamblador. REGISTRO DE ACTIVACION (RA) El RA es una estructura de datos en memoria donde se guarda informacin necesaria para el uso de subprogramas. En la maquina fsica, esta estructura de datos es una serie de direcciones de memoria, consecutivas, que guardan informacin necesaria para la utilizacin de subprogramas, estos datos son los parmetros del subprograma, las variables locales las direcciones temporales utilizadas en el cdigo del subprograma, el valor devuelto (si es una funcin). La zona del RA va a parte de la zona de las variables globales o temporales. El RA es una zona de datos propios de un subprograma. Los RA no son estructuras estticas, normalmente, sino que se irn generando conforme el cdigo del programa encuentre una llamada a un subprograma, encontrar una llamada a un subprograma lanza una serie de acciones enfocadas a crear el RA del mismo detrs del RA creado anteriormente. Se trata de una especie de pila de RA.

RAMIREZ PELAEZ ENRIQUE PROGRAMACION DE SISTEMAS ING. GABRIELA OROZCO MAGALLON GRUPO 3512 SECUENCIA DE ACCIONES EN SUBPROGRAMAS NO RECURSIVOS El cdigo del subprograma debe situar el valor a devolver en el lugar adecuado (conocido por el invocante) y debe retomar el control al invocante. Al mismo tiempo que se realiza esta accin se debe hacer una serie de comprobaciones semnticas como son: Reservar la utilizacin de parntesis solo para subprogramas y no para variables. Verificar la correccin en cuanto al nmero y tipo de argumentos. Verificar el tipo devuelto si existe.

   

SECUENCIA DE ACCIONES EN SUBPROGRAMAS RECURSIVOS Si un subprograma se llama as mismo, cada llamada debe tener su propia RA ya que los datos con los que opera el subprograma son diferentes, estos RA suelen apilarse en memoria tal y como hemos hecho antes para subprogramas deferentes o utilizar la pila para apilarlos. Cada llamada a un subprograma apila un RA con los datos propios de la llamada y cuando se sale del cdigo y se devuelve el control al invocante, el RA se elimina. Por lo tanto en un mismo instante de la ejecucin del programa es posible que haya en memoria ms de un RA de un mismo subprograma. y Compilacin del cuerpo del subprograma Las tareas a realizar cuando aparece el cdigo de un subprograma al existir subprogramas recursivos son: 1. 2. 3. 4. 5. 6. 7. 8. 9. Comprobar que en la tabla de smbolos no existe un smbolo en el mismo mbito y con el mismo nombre que el subprograma. Si no existe el smbolo, se inserta en la tabla de smbolos actual una nueva entrada con el nombre del subprograma y con un indicador de que se trata de un subprograma. Las temporales comienzan a contar desde la direccin relativa a 0 y adems se abre un nuevo mbito. Si existen parmetros, se insertan en la tabla de smbolos con la direccin relativa al ndice 0,1, etc., dependiendo del nmero y de la dimensin de los parmetros. Una vez que estn metidos los parmetros y el tipo de la funcin o nulo si es un procedimiento, las temporales comienzan a contar a partir de la direccin asignada al ltimo parmetro. Las variables locales, si la hay, iran ocupando direcciones temporales consecutivas. El cdigo generado, que necesitara de temporales, la iran poniendo a continuacin de las variables locales. Al final del cdigo del subprograma, se comprueba si existe retorno se trata de una funcin. Tas la ultima comprobacin, se debe cerrar el mbito y, por tanto, eliminar las entradas en la tabla de smbolos comenzando por los parmetros y siguiendo por las variables locales y tipos locales.

Compilacin de la llamada al subprograma La mayora de las tareas para poder implementar subprogramas se deja para el invocante. Las acciones y comprobaciones a realizar son: 1. Se comprueba si el subprograma existe en la tabla simbolos.

RAMIREZ PELAEZ ENRIQUE PROGRAMACION DE SISTEMAS ING. GABRIELA OROZCO MAGALLON GRUPO 3512 2. 3. 4. 5. 6. Si el smbolo existe, se reserva espacio para el RA de la llamada. Por cada parmetro, se reserva tanto espacio en la RA como espacio ocupe el parmetro. Por cada parmetro, se copia el valor obtenido al evaluar la expresin que lo calcula en la siguiente temporal respecto a las tres primeras reservadas y las reservadas a los parmetros anteriores. Pone en IX la direccin del enlace de control y lo actualiza para que apunte al siguiente RA. Se guarda la etiqueta de retorno en el nuevo RA, se salta a la funcin, y tras recibir otra vez el control, se restaura el valor IX con el valor anterior. SECUENCIA DE ACCIONES EN SUBPROGRAMAS LOCALES Hay lenguajes de programa que permite definir subprogramas dentro de otros subprogramas. Esta funcionalidad crea una serie de problemas adicionales a la hora de generar el compilador adecuado. Como el direccionamiento dentro de un RA es relativo al mismo RA, si queremos acceder a una variable RA padre, su direccin relativa ser respecto a su RA, por lo tanto hay un solapamiento de direcciones relativas. y ENCADENAMIENTO DE ACCESOS Consiste en aadir un nuevo campo al RA de manera que este campo apunta al RA del subprograma padre segn esta en el cdigo del programa a compilar. Como sabemos el orden de anidamiento de un subprograma respecto a otro, podemos acceder al RA adecuado dando tantos saltos a travs de este enlace, que se llama enlace de acceso, como orden de anidamiento haya entre la variable que intentamos acceder y el subprograma donde queremos utilizarla. Este valor se conoce en tiempo de compilacin, por lo que su implementacin en el cdigo final es inmediata. Este encadenamiento genera una serie de cdigo adicional. Si el encadenamiento es muy profundo, se generara demasiado cdigo, por lo que sera recomendable aplicar otra tcnica diferente.

DISPLAY Esta tcnica se usa para evitar la creacin de demasiado cdigo adicional mediante la tcnica de encadenamiento de accesos. Consiste en la creacin de un vector global al compilador, que en tiempo de ejecucin guarde los enlaces de acceso necesarios. Estos datos se deben guardar en otra zona de la memoria a tal efecto. A este efecto se le conoce con el nombre Display.

Anda mungkin juga menyukai