Lección 9: Del código fuente al ejecutable — compilación, ensamblador, enlazado y carga
En la lección anterior vimos que el código de alto nivel debe convertirse, en última instancia, en código máquina. Pero ¿quién hace la traducción, y cómo varios archivos que escribimos se convierten en un solo programa ejecutable? La respuesta es una cadena de herramientas (Toolchain): un compilador
Para que el código que escribiste pueda ejecutarse, pasa por varias estaciones: primero un software lo traduce a código máquina, luego varias partes se unen en un solo archivo, y finalmente el archivo se carga en memoria y se ejecuta. Cada estación es una herramienta separada con una sola tarea.
- Compilador (Compiler)
- Software que traduce código fuente escrito en un lenguaje de alto nivel a código de nivel más bajo, generalmente ensamblador o código máquina.
- Ensamblador (Assembler)
- Software que traduce código ensamblador a código máquina y produce un archivo objeto.
- Archivo objeto (Object File)
- El resultado del ensamblador para un solo archivo fuente: código máquina junto con una tabla de símbolos, antes del enlazado.
- Enlazador (Linker)
- Software que combina varios archivos objeto y bibliotecas en un único ejecutable y resuelve las referencias entre archivos.
- Cargador (Loader)
- Parte del sistema operativo que copia un ejecutable del disco a la memoria y lo inicia como un proceso.
- Ejecutable (Executable)
- Un archivo listo para ejecutarse que contiene código máquina enlazado, el producto final de la cadena de construcción.
- Intérprete (Interpreter)
- Software que ejecuta código línea por línea en tiempo de ejecución, en lugar de traducirlo de antemano a un ejecutable.
- Código de bytes (Bytecode)
- Una forma intermedia que no es código fuente ni código máquina del CPU, ejecutada por un intérprete o una máquina virtual.
- Enlazado estático y dinámico
- El estático incorpora la biblioteca dentro del ejecutable; el dinámico la carga por separado en tiempo de ejecución y la comparte entre programas.
- Símbolo (Symbol)
- El nombre de una función o variable en la tabla de símbolos, que el enlazador usa para conectar una llamada con su definición.