El proceso de compilación, del código fuente al código máquina

Anuncio
TEMA 3: El proceso de compilación, del código fuente al
código máquina
3.1 Fase de compilación y linkado (link, montado o enlace)
Un programa escrito en un lenguaje de alto nivel, no puede ser ejecutado
directamente por un ordenador, sino que debe ser traducido a lenguaje máquina.
Las etapas por las que debe pasar un programa escrito en un lenguaje de
programación, hasta poder ser ejecutable son:
Programa fuente: Es el programa
escrito en un lenguaje de alto nivel. No
es más que un texto ordinario que
contiene las sentencias (instrucciones)
del programa en un determinado
lenguaje de programación.
Compilador es el programa
encargado de traducir los programas
fuentes escritos en un lenguaje de alto
nivel a lenguaje máquina (traduce
nuestras
instrucciones
a
otras
reconocibles por el microprocesador).
Programa objeto o código
objeto: Es el programa .obj resultante
de la traducción del código fuente. Aún
no es directamente ejecutable por el
ordenador.
Figura 1. Fases de ejecución de un programa
Linker (montador o enlazador): Es el programa encargado de realizar el
proceso de montaje, que producirá un programa .exe en lenguaje máquina
directamente ejecutable (programa ejecutable). El linkador se encarga de unir
al programa objeto una serie de librerías (archivos de biblioteca) necesarias
para su funcionamiento. Los archivos de biblioteca son una colección de
código que ha sido programada y traducida, y lista para utilizar en un programa.
Página 1 de 5
Como cada lenguaje de programación tiene unas reglas especiales (sintaxis)
para la construcción de sus programas, debe existir un compilador específico
para cada lenguaje de programación.
El compilador antes de generar el programa objeto debe analizar el
programa fuente (almacenado en un archivo de texto) y comprobar que cumple
las reglas de sintaxis del lenguaje de programación. Si cumple la sintaxis genera
el correspondiente programa objeto, sino, visualizará un mensaje de error y su
posible causa para que procedamos a la depuración del programa.
Depurar un programa consiste en detectar y corregir los errores que se
producen en él, ya sean en tiempo de compilación o en tiempo de ejecución.
Los errores en tiempo de compilación son los que se producen antes de la
ejecución del programa, durante el proceso de compilación del programa.
Los errores en tiempo de ejecución son los que se producen durante la
ejecución del programa. Este tipo de errores, son los más difíciles de encontrar,
porque no son detectados por el compilador, ya que no son errores
consecuencia de violar alguna regla sintáctica.
Es decir, aunque al compilar un programa no de errores, eso no significa que
el programa funcione adecuadamente o que no vaya a producir algún fallo
durante la ejecución del mismo. Por ejemplo:
• Un programa puede producir resultados erróneos, porque nos hayamos
equivocado (errores lógicos) al programar el algoritmo (por ejemplo, donde
teníamos que sumar, hemos programado una multiplicación).
• Un programa puede interrumpirse bruscamente, por ejemplo si tenemos
que hacer una división y el divisor es cero, etc.
Para ayudarnos a encontrar los errores lógicos y demás errores producidos
en tiempo de ejecución, podemos hacer uso de los depuradores.
Un depurador (debugger), es un programa diseñado específicamente para la
detección, verificación y corrección de errores, y que por tanto nos ayudará en
las tareas de depuración.
Los depuradores nos permiten trazar el programa (ejecutarlo sentencia a
sentencia) y visualizar el contenido de las variables y direcciones de memoria
durante la ejecución del programa. Además permiten alterar el flujo de ejecución
del mismo, cambiar los valores de las variables e introducir puntos de parada.
Página 2 de 5
Los compiladores emiten mensajes de error o de advertencia durante las
fases de compilación, de enlace o de ejecución de un programa. Los mensajes
de error producidos los podemos agrupar en tres bloques:
− Errores fatales: Son raros. Algunos indican un error interno del
compilador. Cuando ocurren la compilación se detiene inmediatamente.
− Errores de sintaxis: Son los errores típicos de sintaxis, errores de línea
de órdenes y errores de acceso a memoria o disco. El compilador
terminará la fase de compilación y se detendrá.
− Advertencias
(warnings):
No
impiden
la
compilación.
Indican
condiciones que son sospechosas, pero son legítimas como parte del
lenguaje.
Así pues los pasos a seguir para la elaboración y ejecución de un programa
los podemos resumir de la siguiente manera:
1 º. Comenzamos escribiendo el código fuente.
2 º. Compilamos el fichero fuente y se comprueban los mensajes de error.
3 º. Volvemos al editor y eliminamos los errores de sintaxis.
4 º. Cuando el compilador tiene éxito, el linker construirá el archivo ejecutable.
5 º. Ya podemos ejecutar el archivo ejecutable que se obtiene al linkar.
6 º. Si encontramos un error, podemos activar el depurador para trazar el
programa y ejecutar sentencia a sentencia.
7 º. Una vez que hayamos encontrado la causa del error, volveremos al editor
y lo corregimos.
8 º. El proceso de compilar, enlazar y ejecutar el programa lo repetiremos
hasta que no se produzcan errores.
9 º. Una vez tengamos el archivo ejecutable, será el sistema operativo el
encargado de colocar el programa en la memoria central y ejecutarlo.
Página 3 de 5
3.2 Fase de ejecución de un programa
Una vez que tenemos el programa en lenguaje máquina, para poderlo
ejecutar hay que introducirlo en la memoria. Para esta tarea existe un programa
del sistema operativo denominado cargador, que introduce el programa en
posiciones consecutivas de memoria a partir de una determinada.
Cuando el programa está cargado se le indica a la computadora que pase su
control a la posición de memoria donde se ha cargado. Esta operación la hace
directamente el sistema operativo.
A partir de ahora, la Unidad de Control repite sucesivamente los siguientes
pasos:
Suponiendo que el programa se ha cargado a partir de una determinada
posición i de memoria.
1. Lleva de la Memoria (M) a la Unidad de Control (UC) la instrucción que
está en la posición i. Cambiar el valor de i por i+1.
2. Interpreta el código de operación de la instrucción y, según sea éste y las
señales de estado, envía señales de control a las unidades y circuitos que
deben intervenir para ejecutar la instrucción. Vuelve a la fase (1).
La fase (1), es la fase de captación de instrucción, y la (2), es la fase de
ejecución de instrucción.
En el caso de que la ejecución de una instrucción implique saltar a otra
instrucción en la posición m, por ejemplo (alterándose por tanto el orden
secuencial), la UC hace, en la fase de ejecución de la instrucción de salto, que
cambie i por m, de forma que en la siguiente fase de captación se ejecuta la
instrucción que está en m.
Página 4 de 5
3.3 El compilador de C. Características generales.
♦ El lenguaje C es un lenguaje de nivel medio: combina elementos de
lenguajes de alto nivel con la funcionalidad del lenguaje ensamblador. Como
lenguaje de nivel medio, permite la manipulación de bits, bytes y direcciones.
Es particularmente adecuado para la programación de sistemas.
♦ El código de C es muy portable: se puede adaptar el software escrito para un
tipo de computadora a otra computadora sin hacer muchos cambios.
♦ El lenguaje C es un lenguaje estructurado: permite seccionar y esconder
(mediante subrutinas y variables locales) del resto del programa toda la
información e instrucciones necesarias para realizar una determinada tarea.
− Soporta construcciones de bucles (while, do-while y for) e instrucciones
condicionales (if, switch)
− Permite sangrar las sentencias.
− Permite crear funciones (subrutinas independientes). Las funciones son
los bloques en los que se desarrolla toda la actividad de los programas.
Son los que permiten definir las tareas de un programa y codificarlas por
separado, permitiendo así que los programas sean modulares.
− Permiten crear bloques de códigos. Un bloque de código es un grupo de
sentencias de un programa conectadas de forma lógica que es tratado
como una unidad. Se crean colocando una serie de sentencia entre llaves.
♦ El lenguaje C sólo tiene 32 palabras clave, que constituyen las órdenes que
conforman el lenguaje C (el BASIC por ejemplo contiene 159 palabras clave).
♦ El lenguaje C es compilado, no interpretado. Un intérprete lee el código
fuente de un programa línea a línea y traduce las instrucciones específicas
contenidas en esa línea para que el microprocesador las pueda interpretar,
pero no genera ningún programa objeto. Un compilador, en cambio lee el
programa entero y lo convierte en código objeto, de manera que genera un
programa en un código que es directamente ejecutable y entendible por el
microprocesador.
Página 5 de 5
Descargar