El primero de ellos es el preprocesador, es el encargado de transformar el código fuente de entrada original en el código fuente puro. Es decir en expandir las macros, incluir las librerías, realizar un preprocesado racional (capacidad de enriquecer a un lenguaje antiguo con recursos más modernos), extender el lenguaje y todo aquello que en el código de entrada sea representativo de una abreviatura para facilitar la escritura del mismo. |
![]() |
El segundo modulo es el de compilación que recibe el código fuente puro, este es él modulo principal de un compilador, pues si ocurriera algún error en esta etapa el compilador no podría avanzar. En esta etapa se somete al código fuente puro de entrada a un análisis léxico gráfico, a un análisis sintáctico, a un análisis semántico, que construyen la tabla de símbolos, se genera un código intermedio al cual se optimiza para así poder producir un código de salida generalmente en algún lenguaje ensamblador. |
![]() |
El tercer modulo es el llamado modulo de ensamblado, este modulo no es ni más mi menos que otro compilador pues recibe un código fuente de entrada escrito en ensamblador, y produce otro código de salida, llamado código binario no enlazado. Si por un momento viéramos a este modulo como un programa independiente, veríamos que en este caso los términos programa compilador y proceso de compilación son los mismos. Pues este modulo no es mas que un compilador, que en su interior realiza como su antecesor un análisis léxico gráfico, un análisis sintáctico, un análisis semántico, crea una tabla de símbolos, genera un código intermedio lo optimiza y produce un código de salida llamado código binario no enlazado, y a todo este conjunto de tares se los denomina proceso de compilación. Como se puede ver este compilador (llamado ensamblador) a diferencia de los demás compiladores no realiza una expansión del código fuente original(código fuente de entrada), tiene solamente un proceso de compilación y por supuesto no enlaza el código fuente. Es un compilador que carece de los módulos de preprocesado y enlazado, y donde los módulos de compilación y ensamblado son los mismos. |
![]() |
El cuarto y ultimo modulo es el encargado de realizar el enlazado del código de fuente de entrada (código maquina relocalizable) con las librerías que necesita, como así también de proveer al código de las rutinas necesarias para poder ejecutarse y cargarse a la hora de llamarlo para su ejecución, modifica las direcciones relocalizables y ubica los datos en las posiciones apropiadas de la memoria. Este ultimo modulo es el que produce como salida el código binario enlazado. Ya sea dinámico o estático, al decir dinámico se refiere a que el código producido utiliza librerías dinámicas (librerías ya cargadas en el sistema), esto implica que se obtendrá un código más corto y que se actualizara automáticamente si aparece alguna nueva versión de las librerías, mientras que el estático se refiere al echo que no se realiza enlace con ninguna librería y por lo tanto se obtendrá un código mas largo con una copia de las rutinas de librería que necesita. |
![]() |
Estructura de un intérprete.-
En la figura se representa el esquema general de un intérprete puro. Se puede observar que el
lenguaje fuente se traduce a una representación interna (texto o binaria) que puede ser almacenada en
memoria o en disco. Esta representación interna tiene todas las instrucciones numeradas o colocadas
consecutivamente en estructuras de tamaño fijo (por ejemplo un array o posiciones consecutivas de
memoria, o un fichero binario de estructuras de tamaño fijo). Mientras se realiza este paso se puede
construir la tabla de símbolos o etiquetas, que es una tabla que contiene una estructura donde están
todas las etiquetas y su posición en el programa fuente (las etiquetas se utilizan tanto en las instrucciones
de salto como en las llamadas a procedimientos y funciones). Una vez que este proceso ha finalizado,
comienza la ejecución por la primera instrucción del código, que se envía al evaluador de instrucciones,
éste la ejecuta (recibiendo datos si es necesario o enviando un mensaje de error). El evaluador de
instrucciones también determina la instrucción siguiente a ejecutar, en algunos casos previa consulta a la
tabla de etiquetas. En caso de que no haya saltos (GOTO) se ejecuta la siguiente instrucción a la
instrucción en curso.
CLASES DE COMPILADORES
- Compiladores cruzados: generan código para un sistema distinto del que están funcionando.
- Compiladores optimizadores: realizan cambios en el código para mejorar su eficiencia, pero manteniendo la funcionalidad del programa original.
- Compiladores de una sola pasada: generan el código máquina a partir de una única lectura del código fuente.
- Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder producir el código máquina.
- Compiladores JIT : forman parte de un interprete y compilan partes del código según se necesitan.
No hay comentarios:
Publicar un comentario