1.2.-Código fuente, objeto y ejecutable
1.2. Código fuente, objeto y ejecutable (CE 1.c)¶
Idea principal
Un programa no aparece directamente como una aplicación lista para usar. Primero se escribe como código fuente, después puede traducirse a código objeto y, finalmente, se genera un código ejecutable que el sistema operativo puede cargar y ejecutar.
En el apartado anterior vimos que el software necesita al hardware para ejecutarse. Ahora vamos a estudiar qué ocurre antes de esa ejecución: cómo un programa escrito por una persona desarrolladora se transforma en instrucciones que el ordenador puede procesar.
Imagina que quieres construir una mesa. Primero preparas un plano con medidas e instrucciones. Después cortas las piezas de madera siguiendo ese plano. Por último, ensamblas las piezas y obtienes una mesa que ya se puede usar. En programación ocurre algo parecido:
- Código fuente: el plano que escribe la persona programadora.
- Código objeto: las piezas ya traducidas, pero todavía no ensambladas del todo.
- Código ejecutable: el programa final, listo para ponerse en marcha.
Según la normativa del módulo Entornos de Desarrollo, este contenido contribuye al siguiente resultado de aprendizaje y criterio de evaluación:
| Código | Descripción |
|---|---|
| RA 1 | Reconoce los elementos y herramientas que intervienen en el desarrollo de un programa informático, analizando sus características y las fases en las que actúan hasta llegar a su puesta en funcionamiento. |
| CE 1.c | Se han diferenciado los conceptos de código fuente, objeto y ejecutable. |
Qué deberías saber al terminar
Al acabar este apartado deberías poder:
- diferenciar código fuente, código objeto y código ejecutable;
- explicar el papel del compilador y del enlazador;
- describir el proceso básico para pasar de un archivo
.ca un programa ejecutable; - interpretar por qué el código fuente es legible para personas y el ejecutable está preparado para la máquina.
1. Código fuente: el programa escrito por personas¶
El código fuente es el conjunto de instrucciones que una persona desarrolladora escribe usando un lenguaje de programación comprensible para humanos, como Python, Java, C, C++ o JavaScript.
Cada lenguaje tiene su propia sintaxis, sus reglas y sus características. Por ejemplo, C obliga a declarar una función main, Python suele tener una sintaxis más compacta y Java organiza el código en clases. A pesar de estas diferencias, todos tienen un objetivo común: expresar instrucciones de una forma que el equipo de desarrollo pueda leer, escribir, revisar y mantener.
Código fuente
El código fuente es la versión del programa escrita en un lenguaje de programación. Es legible para personas, pero normalmente necesita traducirse, interpretarse o ejecutarse mediante una herramienta antes de que el ordenador pueda realizar sus instrucciones.
Un ejemplo mínimo de código fuente en C sería:
Este programa indica que debe mostrarse el mensaje Hola, mundo! en pantalla. Para una persona que conoce C, el significado es relativamente claro. Sin embargo, la CPU no ejecuta directamente estas líneas tal como están escritas: necesita instrucciones en lenguaje de máquina, representadas internamente mediante bits.
No todos los lenguajes siguen exactamente el mismo camino
En este apartado usamos C porque permite ver con claridad las etapas de compilación, código objeto y enlazado. Otros lenguajes, como Python o JavaScript, suelen ejecutarse mediante intérpretes o motores de ejecución. Java, por su parte, genera código intermedio para una máquina virtual, que se estudia en el siguiente apartado.
2. Código objeto: una traducción intermedia¶
El código objeto es una versión intermedia obtenida al compilar el código fuente. Lo genera una herramienta llamada compilador, que traduce el programa desde un lenguaje de alto nivel a instrucciones mucho más cercanas al lenguaje de máquina.
Código objeto
El código objeto contiene instrucciones traducidas a un formato cercano al que entiende la máquina, pero todavía no constituye necesariamente un programa completo y ejecutable por sí solo.
Si compilamos el programa anterior en C, el compilador puede generar un archivo objeto, por ejemplo hola.o en Linux o hola.obj en Windows. Ese archivo ya no se lee como C, sino como datos binarios que representan instrucciones y referencias.
La idea importante es que un programa real suele estar dividido en varias partes:
- archivos de código fuente creados por el equipo de desarrollo;
- módulos o bibliotecas propias del proyecto;
- bibliotecas externas, como la biblioteca estándar de C;
- funciones proporcionadas por el sistema operativo o por otras herramientas.
Por eso, el código objeto puede verse como una pieza ya traducida, pero aún pendiente de unirse con otras piezas. Siguiendo la analogía de la mesa, sería como tener las patas y el tablero cortados: están preparados, pero todavía no forman una mesa usable.
3. Enlazado: unir las piezas del programa¶
El enlazado (linking) es el proceso que une uno o varios archivos de código objeto con las bibliotecas necesarias para construir el programa final. La herramienta encargada de hacerlo se llama enlazador (linker).
Durante esta fase, el enlazador resuelve referencias pendientes. Por ejemplo, en el programa anterior se usa printf, pero esa función no está escrita por nosotros en el archivo fuente: pertenece a la biblioteca estándar de C. El enlazador localiza esa función y prepara el ejecutable para que pueda utilizarla correctamente.
Por qué importa el código objeto
En proyectos grandes no conviene recompilarlo todo cada vez que cambia una línea. Dividir el programa en módulos permite compilar solo las partes modificadas y enlazarlas de nuevo, lo que ahorra tiempo y facilita el mantenimiento.
4. Código ejecutable: el programa listo para usar¶
El código ejecutable es la versión final del programa que el sistema operativo puede cargar en memoria y poner en ejecución. Contiene instrucciones en un formato que el procesador puede ejecutar, además de la información necesaria para que el sistema operativo prepare el proceso.
Código ejecutable
El código ejecutable es el archivo final generado tras compilar y enlazar. Está preparado para ser cargado por el sistema operativo y ejecutado por el procesador.
Si el programa en C se compila y enlaza correctamente, podemos obtener un archivo como:
hola.exeen Windows;holaen Linux o macOS.
Este archivo no es cómodo de leer para una persona, porque está formado principalmente por información binaria. Sin embargo, es justo el formato que necesita el ordenador para realizar la tarea indicada: mostrar Hola, mundo! en pantalla.
Ejecutable no significa siempre portable
Un ejecutable generado para Windows no suele funcionar directamente en Linux o macOS, y uno compilado para una arquitectura concreta de procesador puede no servir para otra. El ejecutable depende del sistema operativo, la arquitectura y las bibliotecas utilizadas.
5. Proceso completo de conversión¶
En un lenguaje compilado como C, el proceso habitual puede resumirse así:
flowchart LR
A[Código fuente<br/>hola.c] -->|compilador| B[Código objeto<br/>hola.o]
B -->|enlazador| C[Código ejecutable<br/>hola]
D[Bibliotecas<br/>printf, sistema, etc.] -->|se enlazan| C
C -->|ejecución| E[Programa en marcha]
Las etapas principales son:
- Escribir el código fuente en un lenguaje como C. Aunque no todos los lenguajes siguen el mismo proceso, C es un buen ejemplo para observar cada fase.
- Compilar el código fuente. El compilador traduce el archivo fuente a código objeto.
- Enlazar los archivos de código objeto con las bibliotecas necesarias. El resultado es el código ejecutable.
- Ejecutar el archivo generado. El sistema operativo lo carga en memoria y la CPU ejecuta sus instrucciones.
Una forma práctica de verlo en Linux, si tenemos instalado gcc, sería:
La primera orden genera el código objeto. La segunda genera el ejecutable. La tercera ejecuta el programa.
6. Analogía de la receta y el robot¶
Otra analogía útil es imaginar que estás traduciendo una receta para un robot que solo entiende órdenes muy concretas:
-
Código fuente: la receta original
- Está escrita en español y una persona puede entenderla.
-
En programación, sería una instrucción como:
-
Código objeto: traducción intermedia
- Parte de la receta ya se ha traducido a un lenguaje mucho más cercano al robot.
-
Todavía faltan ingredientes, herramientas o instrucciones externas que deben conectarse.
-
Código ejecutable: instrucciones finales
- La receta ya está completamente preparada para el robot.
-
El robot puede seguir esas instrucciones y producir el resultado final.
En ambos casos vemos la misma progresión: una idea expresada para personas se transforma gradualmente en instrucciones listas para la máquina.
7. Comparativa rápida¶
| Tipo de código | Quién lo produce | Quién lo usa principalmente | Estado del programa |
|---|---|---|---|
| Código fuente | Persona desarrolladora | Equipo de desarrollo | Escrito y legible, pero no necesariamente ejecutable directamente. |
| Código objeto | Compilador | Compilador, enlazador y herramientas de construcción | Traducido parcialmente, pendiente de enlazar. |
| Código ejecutable | Enlazador o herramienta de construcción | Sistema operativo y procesador | Programa final listo para ejecutarse. |
Pregunta de comprobación
Si modificas una línea del archivo hola.c, ¿qué archivo has cambiado: fuente, objeto o ejecutable? ¿Qué fases deberías repetir para obtener de nuevo el programa final?
8. Buenas prácticas¶
Para trabajar con código fuente, objeto y ejecutable con criterio profesional, conviene aplicar estas buenas prácticas:
- Distinguir cada fase del proceso: cuando algo falla, identifica si el problema está al escribir el código fuente, al compilar, al enlazar o al ejecutar el programa.
- Leer los mensajes de error completos: el compilador y el enlazador suelen indicar el archivo, la línea o la referencia que provoca el fallo. Leer el mensaje antes de cambiar código evita pruebas al azar.
- Separar fuente, objetos y ejecutables: en proyectos reales, los archivos
.c,.java,.kt,.o,.class,.jar,.exeo similares tienen funciones distintas. Mezclarlos sin criterio dificulta entender qué se ha generado y qué se debe entregar. - Recompilar cuando cambie el código fuente: si modificas el archivo fuente, el ejecutable anterior no cambia mágicamente. Debes repetir las fases necesarias para obtener una nueva versión del programa.
- Comprobar el sistema de destino: antes de distribuir un ejecutable, revisa para qué sistema operativo, arquitectura y entorno se ha generado.
9. Errores frecuentes¶
| Error frecuente | Por qué ocurre | Cómo evitarlo |
|---|---|---|
| Confundir código objeto con código ejecutable. | Ambos pueden ser archivos binarios y no se leen cómodamente como texto. | Recuerda que el código objeto suele ser una pieza intermedia y todavía necesita enlazarse. |
| Pensar que compilar y enlazar son exactamente lo mismo. | Muchos IDE ejecutan ambas fases con un solo botón, por lo que el proceso queda oculto. | Diferencia la traducción del archivo fuente a objeto y la unión final con bibliotecas. |
| Creer que un ejecutable funciona en cualquier equipo. | El nombre "ejecutable" puede dar la impresión de que sirve en todos los sistemas. | Relaciona siempre el ejecutable con su sistema operativo, arquitectura y dependencias. |
| Borrar archivos generados sin saber qué son. | En una carpeta de proyecto aparecen muchos archivos nuevos tras compilar. | Identifica cuáles son fuente, cuáles son generados y cuáles forman parte del resultado final. |
| Ignorar los errores del enlazador. | El alumnado suele fijarse solo en errores de sintaxis del código fuente. | Si aparece una referencia no encontrada, revisa bibliotecas, nombres de funciones y configuración de construcción. |
10. Resumen¶
En este apartado has aprendido que:
- el código fuente es lo que escriben las personas desarrolladoras en un lenguaje de programación;
- el código objeto es una versión intermedia generada por el compilador;
- el enlazador une archivos objeto y bibliotecas para crear el programa final;
- el código ejecutable es el archivo que el sistema operativo puede cargar y el procesador puede ejecutar;
- comprender estas etapas ayuda a usar mejor compiladores, enlazadores, IDE y herramientas de construcción.
Idea clave
Diferenciar código fuente, objeto y ejecutable permite entender qué hacen realmente las herramientas de desarrollo cuando pulsas “Run”, “Build” o “Compilar” en un IDE.
Bibliografía y fuentes¶
- Brian W. Kernighan y Dennis M. Ritchie, The C Programming Language, 2.ª ed., Prentice Hall, 1988.
- Free Software Foundation, documentación de GCC: https://gcc.gnu.org/onlinedocs/.