Ficheros objeto, código objeto y compiladores

Como hemos dicho antes, en los lenguajes compilados, los programas fuente no pueden ejecutarse. Son ficheros 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 fichero equivalente a nuestro programa fuente comprensible para el ordenador, este fichero se conoce como fichero objeto, y su contenido como código objeto.

Los compiladores son programas traductores, que leen un fichero de texto que contiene el programa fuente y generan un fichero que contiene el código objeto.

El código objeto no suele tener ningún significado para los seres humanos, al menos para la mayoría de los humanos que conozco, y menos 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.

Librerías o bibliotecas

Junto con los compiladores de C y C++, se incluyen ciertos ficheros llamados bibliotecas. Las bibliotecas 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 bibliotecas están clasificadas por el tipo de trabajos que hacen, hay bibliotecas de entrada y salida, matemáticas, de manejo de memoria, de manejo de textos, etc.

Nota: Existe una discusión permanente sobre el nombre genérico de estos ficheros. Una gran parte de personas consideran que el nombre adecuado es ficheros de biblioteca, y he de decir que esencialmente estoy de acuerdo con ellos. Sin embargo, la mayoría llamamos a estos ficheros librerías, y también me incluyo entre estos. El equívoco proviene del nombre en inglés, que es ficheros library. Este término se traduce como biblioteca, y no como librería, que es la palabra en español más parecida fonéticamente. Sin embargo esta discusión es poco importante, desde nuestro punto de vista, ya que nos entendemos igualmente con las dos palabras.

Hay un conjunto de bibliotecas (o librerías) muy especiales, que se incluyen con todos los compiladores de C y de C++. Son las librerías (o bibliotecas) ANSI o estándar. Pero también las hay no estándar, y dentro de estas las hay públicas y comerciales. En este curso sólo usaremos bibliotecas (o librerías) ANSI.

Ficheros ejecutables y enlazadores

Cuando obtenemos el fichero objeto, aún no hemos terminado el proceso. El fichero 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 bibliotecas externas, ya sean ANSI o no. Es necesario combinar nuestro fichero objeto con esas bibliotecas para obtener un ejecutable.
  2. Muy a menudo, nuestros programas estarán compuestos por varios ficheros fuente, y de cada uno de ellos se obtendrá un fichero objeto. Es necesario unir todos los ficheros objeto, más las bibliotecas en un único fichero 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.
  4. No siempre obtendremos un fichero ejecutable para el código que escribimos, a veces querremos crear ficheros de biblioteca, y en ese caso el proceso será diferente.

Existe un programa que hace todas estas cosas, se trata del "linker", o enlazador. El enlazador toma todos los ficheros objeto que componen nuestro programa, los combina con los ficheros de biblioteca que sean necesarios y crea un fichero ejecutable.

Una vez terminada la fase de enlazado, ya podremos ejecutar nuestro programa.

Errores

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 errores, ya que ante un aviso el compilador tiene tomar decisiones, y estas no tienen por qué coincidir con lo que nosotros pretendemos hacer, ya se basan en las directivas que los creadores del compilador decidieron durante la creación del compilador.

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 ficheros objetos ni en las bibliotecas. Puede que hayamos olvidado incluir alguna biblioteca, o algún fichero 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 fichero 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 (instrucción a instrucción). 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.

Propósito de C y C++

¿Qué clase de programas y aplicaciones se pueden crear usando C y C++?

La respuesta es muy sencilla: TODOS.

Tanto C como C++ son lenguajes de programación de propósito general. Todo puede programarse con ellos, desde sistemas operativos y compiladores hasta aplicaciones de bases de datos y procesadores de texto, pasando por juegos, aplicaciones a medida, etc.

Oirás y leerás mucho sobre este tema. Sobre todo diciendo que estos lenguajes son complicados y que requieren páginas y páginas de código para hacer cosas que con otros lenguajes se hacen con pocas líneas. Esto es una verdad a medias. Es cierto que un listado completo de un programa en C o C++ para gestión de bases de datos (por poner un ejemplo) puede requerir varios miles de líneas de código, y que su equivalente en Visual Basic sólo requiere unos pocos cientos. Pero detrás de cada línea de estos compiladores de alto nivel hay cientos de líneas de código en C, la mayor parte de estos compiladores están respaldados por enormes bibliotecas escritas en C. Nada te impide a ti, como programador, usar bibliotecas, e incluso crear las tuyas propias.

Una de las propiedades de C y C++ es la reutilización del código en forma de bibliotecas de usuario. Después de un tiempo trabajando, todos los programadores desarrollan sus propias bibliotecas para aquellas cosas que hacen frecuentemente. Y además, raramente piensan en ello, se limitan a usarlas.

Además, los programas escritos en C o C++ tienen otras ventajas sobre el resto. Con la excepción del ensamblador, generan los programas más compactos y rápidos. El código es transportable, es decir, un programa ANSI en C o C++ podrá ejecutarse en cualquier máquina y bajo cualquier sistema operativo. Y si es necesario, proporcionan un acceso a bajo nivel de hardware sólo igualado por el ensamblador.

Otra ventaja importante es que C tiene más de 30 años de vida, y C++ casi 20 y no parece que su uso se debilite demasiado. No se trata de un lenguaje de moda, y probablemente a ambos les quede aún mucha vida por delante. Sólo hay que pensar que sistemas operativos como Linux, Unix o incluso Windows se escriben casi por completo en C.

Por último, existen varios compiladores de C y C++ gratuitos, o bajo la norma GNU, así como cientos de bibliotecas de todo propósito y miles de programadores en todo el mundo, muchos de ellos dispuestos a compartir su experiencia y conocimientos.

Comentarios de los usuarios (18)

BARRIOS SANCHEZ RAFAEL
2010-06-07 20:37:14

Buenas. tengo un macbook pro, prenguntar si xcode es compatible para hacer este curso.

gracias

bairon sanchez
2010-06-12 01:50:56

es que hasta haora no se nada de los sistemas de lenguaje y nesesito aprender el uso de c++ es de vida o muerte =)

quiesiera saver si donde ay una guia de eso o donde podria aprender desde 0 q es en lo q estoy

gerardo
2010-10-20 18:58:01

toy asiendo una monografia sobre el c++ y necesito a ver si m pueden ayudar con la aplicacion en la actualidad del c++

si m pueden ayudar con eso se los agradeceria.

Jaume
2011-05-10 13:46:34

Para mí, el debate "librería vs biblioteca" tiene poco sentido. En inglés, "library" tiene 2 significados:

- El edificio donde se guardan libros, etc.

- Una colección de material (libros, etc.) sobre un tema. A esta definición se referiría "library" cuando se habla de programación.

A la vez, la RAE define "librería" como sinónimo de "biblioteca" en las mismas acepciones: el edificio donde se guardan los libros y la colección de éstos.

Así que, diccionario en mano, para mí la discusión no existe, y "librería" es un término tan válido y tan castellanamente correcto como "biblioteca"

http://dictionary.cambridge.org/dictionary/british/library

http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=librer%EDa

http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=biblioteca

Gabriel 9k
2011-05-31 18:19:12

Sobre el asunto de los términos que haces notar y no conforme, das tu opinión, diré que me dá mucho gusto saber que hay más personas que se empeñan en denotar esos detalles de nuestra lengua y sus conotaciones, que para algunos no tienen importancia, pero que son base de un mejor entendimiento. Lentamente la cosa tomará su lugar y su término, el lenguaje es un ente vivo que hay que comprender.

Gracias por tu esfuerzo, y ciao...........................

krajito
2011-07-23 04:53:58

hola buenas noches tengo un problema con mi c++

estoy comenzando a estudiar este lenguaje y este es mi primer programa no entiendo por que solo me muestra el 2293620 en vez del numero que ingreso yo por teclado.. por fa si me pueden ayudar lo agradeceria muchisimo

main ()

{

int numero;

printf ("escribe el numero que quieres mostrar ");

scanf ("%d",&numero);

printf ("el numero que escribiste es %d ");

getch();

}

Steven R. Davidson
2011-07-23 11:22:29

Hola Krajito,

El problema que tienes es que no has pasado ningún parámetro a 'printf()', aunque dijiste que sí lo ibas a hacer. Escribes:

printf( "el numero que escribiste es %d " );

cuando debería ser:

printf( "el numero que escribiste es %d ", numero );

Aparte de esto, te comento que 'main()' debe ser implementada así:

int main()

y por lo tanto, debe retornar un número entero, que por convenio es 0 (cero) para indicar una terminación exitosa.

Por último, no aconsejo usar 'getch()' porque no es estándar y por lo tanto, no todos los compiladores tienen por qué aceptar esta función que suele estar declarada en <conio.h>.

Por cierto, recomiendo usar <iostream> para la entrada y salida estándares, ya que estás aprendiendo C++. Por ahora, no hemos introducido estos conceptos, que los veremos en el capítulo 6: http://c.conclase.net/curso/?cap=006p#resueltos1_6

Espero haber aclarado las dudas.

Steven

Misael
2012-02-27 14:29:08

Hey muchas gracias por compartir esta pagina, no sabes la falta que me hacia encontrar un tutotial facil de comprender pues mi maestro de programacion no es muy entendible :D

yeraldit
2012-03-31 22:57:42

buenas tardes una pregunta como se realiza un icono de presentacion y tambien combinaciones de letras... gracias...

Steven R. Davidson
2012-04-01 00:07:08

Hola Yeraldit,

Ambos temas son avanzados que no pertenecen al lenguaje en sí. Necesitas usar bibliotecas no estándares para tu plataforma para mostrar imágenes al igual que leer e interpretar combinaciones de teclas.

Sugiero que leas el curso del API de MS-Windows. En particular, lee los capítulos de la GDI a partir del capítulo 16 ( http://winapi.conclase.net/curso/index.php?cap=016#inicio ) y el capítulo 31 ( http://winapi.conclase.net/curso/index.php?cap=031#inicio ), para la parte gráfica y de iconos, respectivamente. Para aceptar combinaciones de teclas, consulta el capítulo 34 acerca del teclado yendo a: http://winapi.conclase.net/curso/index.php?cap=034#inicio

Espero que esto te oriente.

Steven

ivan ardila
2013-05-20 19:24:11

Buenas tardes tengo el siguiente codigo pero no se que esta mal por que no compila. si me pudieran ayudar gracias.

#include <cstdlib>

#include <cstdio>

#include<ciostream>

#include<cmath>

#include<conio>

#include<ciomanip>

#define N 2 // number of equations: y(t) and v(t)

#define dist 0.1 // stepsize

#define MIN 0.0 // minimum x

#define MAX 200.0 // maximum x

#define b1 0.5 //F=-b1*v

#define a1 0.2 //F=-a1*v*v

#define muc 0.5

#define mue 0.8

#define fN 9.8

#define k 1.0

#define m 1.0

#define Damping 0 //Choose the type of damping

#define om 3

using namespace std;

//-------------------

//Global variables

double omega2 = k/m;

double gb1= b1/m;

double ga1= a1/m;

//-------------------

//Functions

void runge4(double, double* , double, double);

double f(double, double*, double, int);

double Damp(double*, double);

//--------------------------------------

main(){

//Declaration of variables;

double t=0.0, y[N], a;

double yant, yact;

double Et, Ec, Ep;

//Save data in Runge4.dat

FILE *output;

output= fopen("Runge4.dat","w");

y[0]= 1.0;// initial position

y[1]= 0.0;// initial velocity

//Damping .......

a = Damp(y, t);

fprintf(output, "%f\t%f\t%f\t%f\n", t, y[0], y[1], a);

for (t= MIN; t <= MAX ; t += dist){

yant = y[1];

runge4(t, y, dist, a);

yact = y[1];

//Damping......

a = Damp(y,t);

fprintf(output, "%f\t%f\t%f\t%f\n", t, y[0], y[1], a);

}

printf("data stored in Runge4.dat\n");

fclose(output);

} //End of main program

//------------------------------------------------------

//Runge-Kutta function

void runge4(double t, double y[], double step, double a) { // rk subroutine

double f(double t, double y[], double a, int i);

double Dt = step/2.0, // the midpoint

yt1[N], yt2[N], yt3[N], k1[N], k2[N], k3[N],k4[N]; // for Runge-Kutta

int i;

for (i = 0; i<N; i++){

k1[i] = f(t, y, a, i);

yt1[i]= y[i]+0.5*(k1[i]*step);

}

for (i = 0; i<N; i++){

//Damping.....

a = Damp(yt1,t);

k2[i] = f(t+Dt, yt1, a, i);

yt2[i]= y[i]+0.5*(k2[i]*step);

}

for (i = 0; i<N; i++){

//Damping.....

a = Damp(yt2,t);

k3[i] = f(t+Dt, yt2, a, i);

yt3[i]= y[i]+(k3[i]*step);

}

for (i = 0; i<N; i++){

//Damping....

a = Damp(yt3,t);

k4[i]= f(t + step, yt3, a, i);

}

for (i = 0; i<N; i++)

y[i] += (k1[i]+2*k2[i]+2*k3[i]+k4[i])*step/6.0; //Runge-Kutta 4th order

}

//---------------------------------------------

double f(double t, double y[], double a, int i) {// RHS function

if (i == 0) return(y[1]); // RHS of first equation

if (i == 1) return(a); // RHS of second equation

}

//---------------------------------------------

//Damping functions

double Damp(double yf[],double t){

double res;

//F=0

if(Damping == 0)

res= -omega2*yf[0];

//F=-bv

else if(Damping == 1)

res= -omega2*yf[0]-gb1*yf[1];

//F=-b*v*v

else if(Damping == 2){

if(yf[1] >= 0.0)

res= -omega2*yf[0]-ga1*yf[1]*yf[1];

else

res= -omega2*yf[0]+ga1*yf[1]*yf[1];

}

//F = -muc*N

else if(Damping == 3){

if(yf[1] >= 0.0)

res= -omega2*yf[0]-muc*fN;

else

res= -omega2*yf[0]+muc*fN;}

else{

cout << "Unknown damping" << endl;

return -1;}

return res;

}

Steven R. Davidson
2013-05-22 01:50:10

Hola Iván,

Viendo el código fuente, los errores son:

#include <ciostream>

cuando es:

#include <iostream>

Luego escribes,

#include <ciomanip>

cuando es:

#include <iomanip>

Ten presente que la biblioteca "conio" no es estándar, por lo que incluir su fichero de cabecera, <conio>, puede provocar un error. Sin embargo, no veo que uses ninguna de sus funciones, así que puedes eliminar su inclusión.

Escribes:

main(){

cuando el estándar de C++ exige que se indique el tipo de retorno; esto es,

int main(){

Esto implica que se debe retornar un entero. Por convenio, se retorna 0 (cero) para indicar una terminación sin problemas.

No son errores, pero defines algunas variables en 'main()', pero no las usas:

double yant, yact;
double Et, Ec, Ep;

Espero que esto te oriente.

Steven

Alejandro Guadalupe
2013-09-05 20:09:43

Hola tengo el Turbo C++ solo pregunto si con ese programa puedo realizar ejercicios para aprender el c++ gracias.

Salvador Pozo
2013-09-10 11:36:24

Hola Alejandro:

No es recomendable usar Turbo C++, ya que se trata de un compilador antiguo que no acepta las características añadidas al estándar en 1999, y no digamos las de 2011.

El curso, tal como está actualmente, sigue el estándar de 1999. Espero que pronto podamos añadir las nuevas características de C++11, aunque pocos compiladores las aceptan aún.

Te recomiendo que consigas otro compilador, puedes descargar de forma gratuita Code::Blocks o ZinjaI.

Hasta pronto.

nestor saul ortega
2014-03-29 22:43:10

hola buen día!!!

tengo un proyecto y quiero ver si me pueden apoyar, resulta que tengo que realizar unos contadores de 0 a 90 pero el problema esta en que debo de poner un paro que detenga el proceso en el conteo que se quedo he puesto un (for) infinito.

for(;;); pero solo se detiene al terminar el conteo no donde va me pueden ayudar muchas gracias!!!

(la programacion la estoy realizando para unos microcontroladores atmel at89s52)....

gracias!!!

Javier de leon
2014-08-20 20:27:56

Buenas tardes tengo un problema ala hora de hacer un programa de suma de números como puedo hacer si el usuario introduce le tras salga un tipo de error si que el programa se quede trabado

Borja
2014-09-22 10:35:28

Bueno tampoco ay que mostrar ni interes ni preocupaccion por la traduccion de bibliotecas o librerias el signficidado es el mismo y admito que ciertas traducciones al español varian con las intenciones de unos y de otros pero lo importante es que estamos aqui para aprender sobre C++

Leon
2014-11-26 22:54:52

hola, alguien podria explicarme mejor eso de las bibliotecas, lo repaso y repaso y no logro entenderlo