Análisis
y Diseño de Algoritmos
Prof: Ing.
Victor Garro
Asistente:
Marco Elizondo Vargas
PROGRAMACION
EN C++
CAPITULO 7 Procesos para
crear un programa ejecutable
Para
empezar necesitamos un poco de vocabulario técnico. Veremos algunos conceptos
que se manejan frecuentemente en cualquier curso de programación y sobre todo
en manuales de C y C++.
Los
programas C y C++ se escriben con la ayuda de un editor de textos del mismo
modo que cualquier texto corriente. Los archivos que contiene programas en C o
C++ en forma de texto se conocen como archivo fuente, y el texto del programa
que contiene se conoce como código fuente. Nosotros siempre escribiremos
programas fuente y los guardaremos en archivos fuente. El archivo fuente de C
es de extensión C y de C++ es de extensión CPP, al ser compilados ambos generan
un archivo de extensión exe, osea
un archivo ejecutable.
Los
programas fuente no pueden ejecutarse. Son archivos de texto, pensados para que
los comprendan los seres humanos, pero incomprensibles para los ordenadores.
Para
conseguir un programa ejecutable hay que seguir algunos pasos. El primero es
compilar o traducir el programa fuente a su código objeto equivalente. Este es
el trabajo que hacen los compiladores de C y C++. Consiste en obtener un
archivo equivalente a nuestro programa fuente comprensible para el ordenador,
este archivo se conoce como archivo objeto, y su contenido como código objeto.
Los
compiladores son programas que leen un archivo de texto que contiene el
programa fuente y generan un archivo que contiene el código objeto.
El
código objeto no tiene ningún significado para los seres humanos, al menos no
directamente. Además es diferente para cada ordenador y para cada sistema
operativo. Por lo tanto existen diferentes compiladores para diferentes
sistemas operativos y para cada tipo de ordenador.
Junto
con los compiladores de C y C++, se incluyen ciertos archivos llamados
librerías. Las librerías contienen el código objeto de muchos programas que
permiten hacer cosas comunes, como leer el teclado, escribir en la pantalla,
manejar números, realizar funciones matemáticas, etc. Las librerías están
clasificadas por el tipo de trabajos que hacen, hay librerías de entrada y
salida, matemáticas, de manejo de memoria, de manejo de textos, etc.
Hay
un conjunto de librerías muy especiales, que se incluyen con todos los
compiladores de C y de C++. Son las librerías ANSI o estándar. Pero también hay
librerías no estándar, y dentro de estas las hay públicas y comerciales. En
este curso sólo usaremos librerías ANSI.
Además
de estas librerías nosotros también podemos crear nuestras propias librerías,
que también se pueden conocer como encabezados o headers,
son de extensión H y me permiten ahorrar mucho código, si por ejemplo tengo
creado un algoritmo que quiero utilizar en varios programas, puedo crear un
librería con ese algoritmo y llamarlo cuando quiera en cualquier programa.
Cuando
obtenemos el archivo objeto, aún no hemos terminado el proceso. El archivo
objeto, a pesar de ser comprensible para el ordenador, no puede ser ejecutado.
Hay varias razones para eso:
1.
Nuestros programas
usaran, en general, funciones que estarán incluidas en librerías externas, ya
sean ANSI o no. Es necesario combinar nuestro archivo objeto con esas librerías
para obtener un ejecutable.
2.
Muy a menudo, nuestros
programas estarán compuestos por varios archivos fuente, y de cada uno de ellos
se obtendrá un archivo objeto. Es necesario unir todos los archivos objeto, más
las librerías en un único archivo ejecutable.
3.
Hay que dar ciertas
instrucciones al ordenador para que cargue en memoria el programa y los datos,
y para que organice la memoria de modo que se disponga de una pila de tamaño
adecuado, etc. La pila es una zona de memoria que se usa para que el programa
intercambie datos con otros programas o con otras partes del propio programa.
Veremos esto con más detalle durante el curso.
Existe
un programa que hace todas estas cosas, se trata del "link", o
enlazador. El enlazador toma todos los archivos objeto que componen nuestro
programa, los combina con los archivos de librería que sea necesario y crea un
archivo ejecutable.
Una
vez terminada la fase de enlazado, ya podremos ejecutar nuestro programa.
Por
supuesto, somos humanos, y por lo tanto nos equivocamos. Los errores de
programación pueden clasificarse en varios tipos, dependiendo de la fase en que
se presenten.
Errores
de sintaxis: son errores
en el programa fuente. Pueden deberse a palabras reservadas mal escritas,
expresiones erróneas o incompletas, variables que no existen, etc. Los errores
de sintaxis se detectan en la fase de compilación. El compilador, además de
generar el código objeto, nos dará una lista de errores de sintaxis. De hecho
nos dará sólo una cosa o la otra, ya que si hay errores no es posible generar
un código objeto.
Avisos: además de errores, el compilador puede
dar también avisos (warnings). Los avisos son
errores, pero no lo suficientemente graves como para impedir la generación del
código objeto. No obstante, es importante corregir estos avisos, ya que el
compilador tiene que decidir entre varias opciones, y sus decisiones no tienen
por qué coincidir con lo que nosotros pretendemos, se basan en las directivas
que los creadores del compilador decidieron durante su creación.
Errores
de enlazado: el programa
enlazador también puede encontrar errores. Normalmente se refieren a funciones
que no están definidas en ninguno de los archivos objetos ni en las librerías.
Puede que hayamos olvidado incluir alguna librería, o algún archivo objeto, o
puede que hayamos olvidado definir alguna función o variable, o lo hayamos
hecho mal.
Errores
de ejecución: incluso
después de obtener un archivo ejecutable, es posible que se produzcan errores.
En el caso de los errores de ejecución normalmente no obtendremos mensajes de
error, sino que simplemente el programa terminará bruscamente. Estos errores
son más difíciles de detectar y corregir. Existen programas auxiliares para
buscar estos errores, son los llamados depuradores (debuggers).
Estos programas permiten detener la ejecución de nuestros programas,
inspeccionar variables y ejecutar nuestro programa paso a paso. Esto resulta
útil para detectar excepciones, errores sutiles, y fallos que se presentan
dependiendo de circunstancias distintas.
Errores
de diseño: finalmente
los errores más difíciles de corregir y prevenir. Si nos hemos equivocado al
diseñar nuestro algoritmo, no habrá ningún programa que nos pueda ayudar a
corregir los nuestros. Contra estos errores sólo cabe practicar y pensar.