visitas realizadas

3.3 Traducción de un programa: compilación, enlace de un programa, errores en tiempo de compilación.

Un compilador es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente que la máquina será capaz de interpretar. Usualmente el segundo lenguaje es lenguaje de máquina, pero también puede ser un código intermedio (bytecode), o simplemente texto. Este proceso de traducción se conoce como compilación.[]

Un compilador es un programa que permite traducir el código fuente de un programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior (típicamente lenguaje de máquina). De esta manera un programador puede diseñar un programa en un lenguaje mucho más cercano a cómo piensa un ser humano, para luego compilarlo a un programa más manejable por una computadora.

Partes de un compilador

La construcción de un compilador involucra la división del proceso en una serie de fases que variará con su complejidad. Generalmente estas fases se agrupan en dos tareas: el análisis del programa fuente y la síntesis del programa objeto.

  • Análisis: Se trata de la comprobación de la corrección del programa fuente, e incluye las fases correspondientes al Análisis Léxico (que consiste en la descomposición del programa fuente en componentes léxicos), Análisis Sintáctico (agrupación de los componentes léxicos en frases gramaticales ) y Análisis Semántico (comprobación de la validez semántica de las sentencias aceptadas en la fase de Análisis Sintáctico).
  • Síntesis: Su objetivo es la generación de la salida expresada en el lenguaje objeto y suele estar formado por una o varias combinaciones de fases de Generación de Código (normalmente se trata de código intermedio o de código objeto) y de Optimización de Código (en las que se busca obtener un código lo más eficiente posible).

Alternativamente, las fases descritas para las tareas de análisis y síntesis se pueden agrupar en Front-end y Back-end:

  • Front-end: es la 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. Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar, y está compuesta por las fases comprendidas entre el Análisis Léxico y la Generación de Código Intermedio.
  • Back-end: es la parte que genera el código máquina, específico de una plataforma, a partir de los resultados de la fase de análisis, realizada por el Front End.

Esta división permite que el mismo Back End se utilice para generar el código máquina de varios lenguajes de programación distintos y que el mismo Front End que sirve para analizar el código fuente de un lenguaje de programación concreto sirva para generar código máquina en varias plataformas distintas. Suele incluir la generación y optimización del código dependiente de la máquina.

El código que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser enlazado por un programa enlazador (linker).

 

Preproceso

 

Lo primero que el compilador de C hace es pasar nuestro programa por el preprocesador.El preprocesador se encarga de interpretar cada una de  las directivas que aparecen en el programa y de expandir las macros. Respecto a las directivas, son todos a aquellas líneas que comienzan con un símbolo #. Hay un conjunto de directivas que son parte del estándar ANSI se comentan en el apéndice.


Compilación del programa.


Una vez que el programador acaba de escribir el programa en su terminal y lo almacena en un archivo debe traducirlo a código ejecutable por la maquina. Este proceso se llama en su conjunto compilación del código fuente en C.

#include<stdio.h>

Hace que se inserte el fichero stdio.h en el lugar donde aparece esa línea. Como el lector puede ver si examina el fichero stdio.h, lo que hay en el son declaraciones de prototipos de funciones y de tipos de datos, perfectamente validos en C.

El compilador se encarga de la etapa de preproceso, justo antes de iniciar la compilación. Por lo tanto , esta etapa pasa normalmente desapercibida, aunque puede indicársele al compilador que solo efectué el preproceso, para ver cómo queda el programa después de èl. La forma de solicitárselo depende de cada compilador en concreto. Una vez finalizado el preproceso , nuestro programa que da listo para que pueda comenzarse su traducción a código ejecutable.


Enlace

 

La siguiente etapa de compilación es el enlace con las funciones presentes en las librerías de funciones. Si nuestro programa utiliza solo funciones ANSI, no suele ser necesario indicarle al compilador en que librerías están esas funciones. Sin embargo hay excepciones. Por ejemplo si utilizamos funciones matemáticas de la librería estándar en nuestro programa (es decir en el programa aparece #include <math.h>, opción –lm. Sin embargo, si utilizamos funciones definidas en una librería propia o bien en una librería no estándar, debemos indicárselo al compilador mediante algún parámetro.


Errores en tiempo de compilación



El compilador es capaz de detectar algunos errores que pueden cometerse en el desarrollo de un programa escrito en C. Evidentemente, no puede detectar todos ya que un programa puede funcionar perfectamente pero no hacer lo que se espera de él. Los errores detectados por el compilador son de dos clases: errores propiamente dichos (errors), y advertencias (warnings)

Los errores se deben a cuestiones sintácticas relacionadas con el lenguaje. El compilador enumera los errores que se encontraron, y luego detiene la compilación. El mensaje de error que aparece siempre indica al menos tres cosas:

*El nombre del fichero en donde se ha encontrado el error.

*la línea del fichero en donde se ha detectado el error.

*un mensaje describiendo brevemente el error.



Las advertencias no indican errores, sino que llaman la atención al programador sobre los posibles usos incorrectos del lenguaje. Las advertencias, a diferencia de los errores no detienen el proceso de compilación, pero casi siempre señalan un error oculto. En general, si aparece un warning hay que intentar eliminarlo. Si el compilador encuentra el error , intentara seguir compilando el programa para encontrar todos los errores posibles, deteniéndose cuando le resulte imposible seguir.






Vídeo de YouTube


Comments