Ingeniería Técnica Industrial
El Compilador y el Debugger
El Compilador es un programa que permite traducir un programa escrito en un
lenguaje de alto nivel (como C, C++, Pascal, Módula-2, Ada...) a
lenguaje máquina o código binario, que es el único que puede entender y ejecutar un
ordenador.
Hay muchos tipos de compiladores y cada uno tiene sus propias características, opciones y
formas de uso. Muchos compiladores, por ejemplo, incorporan un entorno que facilita la
programación. Este entorno suele ser similar a un editor de textos con algunos menús
especiales de compilación. En general, esto facilita las tareas de leer y grabar programas y puede tener otras ventajas:
facilitar el sangrado de programas, poner en colores ciertas partes del programa (palabras reservadas, comentarios,
constantes...), ofrecer ayuda o información sobre el lenguaje y el compilador y muchas más cosas.
No obstante, un programa en C es un fichero de texto y podrá, por tanto,
escribirse con cualquier editor de textos que lo permita, como el Bloc de notas (NotePad) o
el mismo WordPad. Por supuesto, una vez escrito el programa necesitamos el compilador
para que pueda ser ejecutado.
Intente configurar y entender las opciones básicas del compilador desde el principio,
pues le permitirán ganar mucho tiempo. Desde el principio le recomendamos que cree un
directorio de trabajo (por ejemplo C:\PRACTICA) y utilice ese directorio para guardar todos los programas en C y
los ficheros resultantes de la compilación, de forma que evite mezclar unos ficheros con
otros de otras aplicaciones. Al final, si ese directorio ya no le resulta útil, bórrelo
para evitar que se llene el disco duro de directorios y ficheros inútiles.
El Compilador de Borland y sus Menús
Aquí pretendemos dar un resumen de las opciones más útiles del compilador. Todo lo aquí
explicado es aplicable a muchos compiladores aunque nosotros nos referimos a los compiladores
de Borland (Borland C++, Turbo C...).
El compilador tiene un menú en la parte superior al estilo de cualquier programa habitual. Cada opción
del menú superior se despliega mostrando una lista de opciones relacionadas. Para
desplegar ese submenú se puede utilizar el ratón, pulsar F10 y luego usar las fechas, o
bien, pulsar la tecla Alt y, sin soltarla, pulsar también la inicial del menú que
queremos desplegar. Los menús son los siguientes, detallando las opciones más útiles:
- Menú File (Archivo): Las opciones son las siguientes dentro de este menú.
- Opción New (Nuevo): Sirve para abrir un nuevo programa. Se abre una ventana en
blanco dispuesta para empezar a escribir un programa nuevo.
- Opción Open (Abrir): Para abrir un fichero que ya exista. Es necesario escoger
el directorio. Observe que a veces se seleccionan sólo los ficheros con cierta extensión,
*.C (programas en C), *.CPP (programas en C++)..., lo cual puede originar en que no se
visualice el programa que buscamos.
- Opción Save (Guardar): Para guardar el programa actual, modificando el fichero
que hubiera anteriormente. El fichero es guardado con el nombre que tuviera. En ocasiones la versión anterior del programa se guarda en un
fichero con la extensión .bak (de backup).
- Opción Save as (Guardar como): Permite guardar el fichero con un nombre
distinto al que tiene.
- Opción Change dir (Cambiar directorio): Permite cambiar el directorio por
defecto que utilizará el compilador, de forma que al usar la opción Abrir, por ejemplo,
se situará directamente en dicho directorio
- Opción Quit (Salir): Abandona el compilador.
- Menú Edit (Edición): Tiene las opciones típicas para facilitar la edición de
programas, incluyendo las utilísimas funciones de Cortar (Cut), Copiar (Copy) y Pegar (Paste).
- Menú Search (Búsqueda): Opciones para buscar textos en el programa,
reemplazarlos por otros, ir a cierta línea...
- Menú Run (Ejecutar): La opción Run (Ctrl-F9) es la más útil y permite ejecutar
el programa. Si el programa no está compilado, lo compila previamente y si tiene errores,
los visualizará (sin ejecutar el programa, obviamente) en una ventana denominada Message.
Las demás opciones y el menú Debug
son opciones del debugger o depurador de programas y se explican más adelante.
- Menú Compile (Compilar): Son las opciones para compilar el programa sin
necesidad de ejecutarlo posteriormente. Se distingue entre compilar (compile) el programa
fuente y enlazar (link) que consiste en unirle las funciones de librerías cuya definición
no está incluida en el programa (funciones de stdio.h por ejemplo).
Al final se generarán ficheros con la extensión .OBJ y .EXE respectivamente.
Recuerde que si lo que desea es ejecutar el programa para probar su funcionamiento, la
opción Run compila el programa si es necesario (si ha habido alguna modificación), por lo
que no es necesario compilar primero y luego ejecutar.
- Menú Project (Proyectos): Un proyecto es un fichero (.prj) que contiene
información sobre todos los ficheros que se son usados por un programa. Esto se utiliza
cuando nuestro programa es tan grande que decidimos partirlo en diversos ficheros
independientes utilizando las ventajas de la compilación separada. Resumiendo, se crean
ficheros con diversas funciones (con la extensión .C) y, para cada uno de ellos, se crea
un fichero con las cabeceras de las funciones (con la extensión .h). Además, hay que
crear un fichero .C que contenga la función principal main(). Los ficheros .h se
incluyen con la directiva #include en los ficheros .C donde se utilicen. Tras
eso, se crea un fichero de proyecto al que se añaden todos los ficheros .C (NO los .h)
que sean necesarios, incluyendo aquel fichero con la función principal. Al compilar un
proyecto se genera el programa ejecutable (.EXE) con el nombre del proyecto (no con el
nombre del fichero con la función principal.
- Menú Options (Opciones): Contiene multitud de opciones de configuración del
compilador. Algunas importantes son las siguientes:
- Opción Compiler ® Code generation (Generación de código): Permite elegir
entre distintos modelos de memoria para la compilación y otras opciones para la
generación de código. Los valores por defecto suelen ser suficientemente buenos.
- Opción Compiler ® Messages (Mensajes): Permite activar y desactivar la
aparición de mensajes de errores (errors) o avisos (warnings) por parte del compilador.
Lo mejor es activar (con una X) todos los
mensajes y avisos posibles, ya que en la mayoría de los casos esos avisos suelen ser
errores o advertencias importantes del compilador. Aunque podemos elegir que NO
muestre esos avisos eso no implica que no puedan ser errores graves de programación.
- Opción Linker (Enlazador): Tiene distintas opciones del enlazador, como por
ejemplo la activación de la librería gráfica para poder usarla.
- Opción Directories (Directorios): Contiene la lista de directorios donde el
compilador buscará o guardará cada tipo de información:
- Directorio Include: Es el directorio donde están los ficheros .h de las
bibliotecas del sistema. Usualmente este directorio se llama INCLUDE y está situado
dentro del directorio donde se instalara el compilador. Normalmente será:
C:\BORLANDC\INCLUDE
- Directorio LIB: Es el directorio donde están las bibliotecas (libraries)
del sistema. Usualmente este directorio se llama LIB y está situado
dentro del directorio donde se instalara el compilador. Normalmente será:
C:\BORLANDC\LIB
- Directorio Output (de Salida): Es el directorio donde el compilador escribirá
los ficheros que genere (.OBJ, .EXE...). Lo mejor es crearse un directorio de
trabajo y poner en esta opción dicho directorio, de forma que los ficheros que se generen
no se guarden en el directorio por defecto, mezclándose con otros ficheros de otras
tareas. Por ejemplo: C:\PROGC
- Directorio Source (Fuentes): Es el directorio donde están los ficheros fuente (.C)
con los que trabajamos. Lo mejor es crearse un directorio de
trabajo, que puede ser el mismo que para la opción anterior, y poner en esta opción dicho directorio, de forma que
en dicho directorio guardemos todos los ficheros fuente que generemos. Por ejemplo: C:\PROGC
- Opción Environment (Entorno): En esta opción podemos configurar multitud de
aspectos del entorno del compilador. Por ejemplo, podemos cambiar el tamaño de la letra,
si queremos que se guarde o no fichero de seguridad (.bak), opciones del ratón,
colores... En general, lo mejor es no tocar estas opciones si no se tiene claro qué se
está haciendo.
- Menú Window (Ventana): Tiene opciones para moverse o alterar las distintas ventanas
que abre el compilador. Por ejemplo, podemos cambiar el tamaño y la posición de cada
ventana, ampliarla (zoom), cerrarla (close), ir a la ventana de mensajes de error (Message), ir a la ventana de
visualización de variables (Watch), ir a la ventana de ejecución del programa o ventana
de usuario (User screen Alt-F5)... Observe que la ventana donde se ejecuta el programa se llama
ventana de usuario y en ella se muestra la salida por pantalla del programa. Note que esa ventana
no se borra cada vez que se ejecuta un programa, sino que escribe a continuación. Esa
ventana es muy práctica y, por eso existe una forma rápida de acceder a ella: Alt-F5.
Una opción muy útil para cambiar de ventana es pulsando F6 (Next). Esto consigue ir
cambiando de ventana alternativamente hasta llegar a la ventana que busquemos.
- Menú Help (Ayuda): Aquí hay utilísimas opciones para localizar información
sobre el compilador y sobre el lenguaje C: funciones de biblioteca (matemáticas, de cadenas...), formatos de lectura y escritura de
scanf() y printf(), tipos de datos, operadores...
En general, se accede a la ayuda usando la tecla F1. Si estamos en la ventana de errores
(Message) y pulsamos F1 sobre un error, nos muestra alguna información sobre ese error y
posibles modos de corregirlo. Si situamos el cursor encima de una palabra (por ejemplo
printf) y pulsamos Ctrl-F1, nos situamos en la parte de la ayuda que evoque dicha palabra.
El Depurador o Debugger
El depurador es una herramienta extremadamente útil para todo programador. Esta
herramienta permite depurar programas, es decir, facilita la tarea de encontrar errores
en un programa. En programación es muy frecuente que durante la creación de un programa
éste no funcione como nosotros esperamos
o deseamos que lo haga y, sin embargo, aparentemente el algoritmo sea correcto y esté bien implementado.
Evidentemente, si el programa no funciona correctamente es que el programa está mal.
La ayuda que oferta el depurador consiste simplemente en permitir que el programa sea
ejecutado paso a paso (instrucción a instrucción, línea a línea) y, en todo momento, el
programador puede ver el contenido de cualquier variable del programa. Obviamente, el
depurador no nos dice dónde están los errores, pero si vamos ejecutando el programa paso
a paso con atención, será fácil descubrir en qué momento una variable no toma el valor
que debería tomar y, por tanto, ahí debe existir un error de programación.
Por tanto, muchas veces hay que usar el depurador con un papel en el que vayamos haciendo
nosotros también los cálculos dudosos y vayamos cotejando nuestros cálculos con los
cálculos que arroja el depurador.
Manejar el depurador es extremadamente simple y todas sus opciones están en el menú Run y
Debug. Veamos las más importantes:
- Menú Run (Ejecutar):
- Opción Trace into F7 (Ejecutar Paso a Paso): Sirve para ejecutar el programa instrucción a
instrucción. La primera vez que ejecutamos esta opción, la ejecución se va a la función
principal main(), indicando que ahí es donde empieza la ejecución y la depuración.
Cada vez que usamos esta opción ejecuta la instrucción que va señalando y pasa a la siguiente.
Pulsando sucesivamente F7 el programa se va ejecutando hasta que termine. Observe que al
ejecutar alguna instrucción de lectura, el programa puede pasar a la ventana de usuario,
que es donde se está ejecutando el programa. En todo momento, no obstante podemos
visualizar esa pantalla (recuerde que esto se hace con Alt-F5).
Esta opción ejecuta el programa línea a línea, de forma que al llegar a la llamada a una función
definida en el mismo programa, la ejecución se introduce dentro de esa función para
ejecutarla también paso a paso. La ejecución paso a paso no está restringida
sólo a la función principal, por supuesto.
- Opción Step over F8 (Paso a Paso rápido):
Esta opción es similar a la anterior pero si la instrucción a ejecutar contiene
la llamada a una función, entonces la ejecución ejecuta la función completamente en un
único paso, evitando tener que ejecutar también la función paso a paso. O sea, debemos
usar esta opción cuando no queramos depurar una función que suponemos que es correcta.
Recuerde que esta opción ejecuta la función, pero en un único paso.
- Opción Program reset Ctrl-F2 (Fin de la depuración): Finaliza la depuración.
Esto se puede usar en cualquier momento durante la depuración. Tenga en cuenta que tras
esto, si queremos podemos volver a ejecutar el programa con el depurador pero desde el
principio.
- Opción Go to cursor F4 (Ejecutar hasta el cursor):
A veces, deseamos depurar una parte del programa muy específica y queremos evitar tener
que ejecutar paso a paso todo el principio del programa hasta llegar a esa parte. Para esto
podemos situar primero el cursor al principio de lo que deseamos depurar y
tras eso usamos esta opción con lo que conseguiremos que el programa se ejecute hasta
la instrucción en la que se encuentre el cursor. Tras esto podemos usar las opciones
anteriores (F7 y F8) para continuar la depuración a partir de esa instrucción.
Esta opción puede ser usada en cualquier momento, incluso aunque la depuración ya haya
comenzado. Podemos usar esta opción para, por ejemplo, saltarnos la ejecución paso a paso
de bucles o fragmentos de código más o menos largos de ejecutar.
- Menú Debug (Depuración): Ese menú contiene, básicamente algunas opciones para
la depuración de programas. Las más importante son las que se refieren a visualizar el
contenido de las variables e incluso modificar su valor:
- Opción Evaluate/modify Ctrl-F4 (Evaluar/Modificar): Utiliza esta opción para
visualizar el contenido de una variable (o una expresión) con la posibilidad de cambiar
su contenido en tiempo de ejecución. Al usar esta opción aparece una ventana con 3
posiciones o recuadros: 1. Expression (Expresión) es el recuadro en donde debemos escribir la variable o
la expresión a evaluar. 2. Result (Resultado) es donde el depurador mostrará el valor de
la expresión. 3. New Value (Nuevo Valor) es donde podemos poner el nuevo valor de la
variable especificada en el primer recuadro.
- Opción Watches (Visualizaciones): La opción anterior es útil para cuando
queremos evaluar alguna variable o expresión de forma muy puntual. Sin embargo, a veces
queremos ver el valor de una variable o expresión de forma continua, para así ir viendo
cómo se modifica su valor en cada paso que ejecutamos con el depurador.
Si usamos la opción Add Watch Ctrl-F7
abre una ventana que nos pide que escribamos la variable o expresión que queremos evaluar.
Tras esto abre la ventana titulada Watch en la que sitúa todas las expresiones que
deseamos evaluar. Podemos añadir con esa opción todas las que queramos. También podemos
borrar una expresión previamente seleccionada (opción Delete watch), borrarlas todas
(Delete all watches) o modificar una expresión previamente seleccionada (Edit watch).
Recuerde que la ventana Watch es como una ventana más y podemos cambiar su tamaño según
nuestras necesidades. Podemos cambiar de ventana activa pulsando sucesivamente la tecla
F6, como se vio anteriormente. Quizás, una buena forma de depurar programas sea dejar la
ventana Watch en la parte inferior de la pantalla y hacer que la ventana del programa que
queremos depurar ocupe la parte superior restante de la pantalla.