1.c.1 Código Fuente, Objeto y Ejecutable.

Objetivo

Diferenciar código fuente, código objeto y código ejecutable, comprendiendo el papel del compilador y del enlazador en un proceso de compilación tradicional.

1. Contenidos

1.1 Del algoritmo a la máquina

Los programadores escriben instrucciones mediante lenguajes relativamente legibles para las personas. Sin embargo, el procesador ejecuta instrucciones codificadas según su arquitectura. Por ello necesitamos herramientas que traduzcan el programa.


Código fuente → Traducción → Código ejecutable por la máquina
				

1.2 Código fuente

El código fuente es el conjunto de instrucciones escritas por los desarrolladores en uno o varios lenguajes de programación.

Ejemplo en C:


#include <stdio.h>

int main() {
    int stock = 3;
    printf("Stock: %d\n", stock);
    return 0;
}
				

Este contenido puede guardarse en un archivo como emporio.c. Es texto editable por una persona, pero todavía no es un ejecutable nativo.

1.3 Compilación

Un compilador analiza y traduce el código fuente a una representación de nivel inferior. En un proceso tradicional de C podemos generar un archivo objeto:


gcc -c emporio.c
				

El resultado habitual será:


emporio.o
				

Durante la compilación pueden detectarse errores de sintaxis y otros problemas que impidan continuar.

1.4 Código objeto

El código objeto es un resultado intermedio de la compilación. Contiene código y metadatos preparados para una arquitectura y un formato determinados, pero puede no constituir todavía un programa completo.

Un proyecto puede estar dividido en varios módulos:


main.c       → main.o
productos.c  → productos.o
ventas.c     → ventas.o
				

Estos archivos objeto deberán combinarse para formar el programa final.

1.5 Bibliotecas

Los programas suelen utilizar código ya desarrollado en bibliotecas. Por ejemplo, para mostrar información en C utilizamos funciones de la biblioteca estándar.

Durante la construcción del programa, nuestro código puede necesitar enlazarse con estas bibliotecas.

1.6 Enlazado

El enlazador o linker combina archivos objeto y las bibliotecas necesarias para producir el programa final.


main.o ──────────┐
productos.o ─────┼──→ ENLAZADOR → emporio.exe
ventas.o ────────┤
bibliotecas ─────┘
				

Con GCC podríamos realizar el enlazado así:


gcc main.o productos.o ventas.o -o emporio
				

1.7 Código ejecutable

El ejecutable es el archivo preparado para que el sistema operativo pueda cargar el programa y comenzar su ejecución en una plataforma concreta.

En Windows es frecuente encontrar la extensión .exe. En sistemas como GNU/Linux un ejecutable no necesita una extensión específica.

Un ejecutable generado para una plataforma concreta no tiene por qué funcionar directamente en otra combinación de sistema operativo y arquitectura.

1.8 Resumen del proceso


PROGRAMADOR
    ↓
Código fuente (.c)
    ↓
COMPILADOR
    ↓
Código objeto (.o / .obj)
    ↓
ENLAZADOR + bibliotecas
    ↓
Ejecutable
    ↓
Sistema operativo
    ↓
CPU
				

Este modelo describe especialmente bien los lenguajes compilados a código nativo, como C o C++. Otros lenguajes utilizan estrategias diferentes, que veremos en el indicador siguiente.

2. Ejercicios

  1. Explica la diferencia entre código fuente, código objeto y ejecutable.
  2. Clasifica: tienda.c, tienda.o y tienda.exe.
  3. ¿Qué herramienta genera normalmente el código objeto?
  4. ¿Qué función realiza el enlazador?
  5. Un proyecto contiene main.o, productos.o y ventas.o. ¿Está necesariamente terminado? Razona la respuesta.
  6. Si queremos modificar el comportamiento del programa, ¿qué tipo de código debemos cambiar y qué pasos habrá que repetir después?

3. Bibliografía