13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 39 — #77<br />

✐<br />

2.1. El proceso de traducción del l<strong>en</strong>guaje<br />

m<strong>en</strong>te con el tiempo. Los primeros compiladores simplem<strong>en</strong>te g<strong>en</strong>eraban código<br />

máquina, y el programador insertaba s<strong>en</strong>t<strong>en</strong>cias de impresión para ver qué estaba<br />

ocurri<strong>en</strong>do, lo que no siempre era efectivo. Los compiladores modernos pued<strong>en</strong><br />

insertar información sobre el código fu<strong>en</strong>te <strong>en</strong> el programa ejecutable. Esta información<br />

se usa por poderosos depuradores a nivel de código que muestran exactam<strong>en</strong>te lo<br />

que pasa <strong>en</strong> un programa rastreando su progreso mediante su código fu<strong>en</strong>te.<br />

Algunos compiladores solucionan el problema de la velocidad de compilación<br />

mediante compilación <strong>en</strong> memoria. La mayoría de los compiladores trabajan con ficheros,<br />

leyéndolos y escribiéndolos <strong>en</strong> cada paso de los procesos de compilación.<br />

En la compilación <strong>en</strong> memoria el compilador se manti<strong>en</strong>e <strong>en</strong> RAM. Para programas<br />

pequeños, puede parecerse a un intérprete.<br />

2.1.3. El proceso de compilación<br />

Para programar <strong>en</strong> C y <strong>en</strong> <strong>C++</strong>, es necesario <strong>en</strong>t<strong>en</strong>der los pasos y las herrami<strong>en</strong>tas<br />

del proceso de compilación. Algunos l<strong>en</strong>guajes (C y <strong>C++</strong>, <strong>en</strong> particular) empiezan la<br />

compilación ejecutando un preprocesador sobre el código fu<strong>en</strong>te. El preprocesador es<br />

un programa simple que sustituye patrones que se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> el código fu<strong>en</strong>te<br />

con otros que ha definido el programador (usando las directivas de preprocesado). Las<br />

directivas de preprocesado se utilizan para ahorrar escritura y para aum<strong>en</strong>tar la legilibilidad<br />

del código (posteriorm<strong>en</strong>te <strong>en</strong> este libro, apr<strong>en</strong>derá cómo el diseño de <strong>C++</strong><br />

desaconseja <strong>en</strong> gran medida el uso del preprocesador, ya que puede causar errores<br />

sutiles). El código preprocesado se suele escribir <strong>en</strong> un fichero intermedio.<br />

Normalm<strong>en</strong>te, los compiladores hac<strong>en</strong> su trabajo <strong>en</strong> dos pasadas. La primera pasada<br />

consiste <strong>en</strong> analizar sintácticam<strong>en</strong>te el código g<strong>en</strong>erado por el preprocesador.<br />

El compilador trocea el código fu<strong>en</strong>te <strong>en</strong> pequeñas partes y lo organiza <strong>en</strong> una estructura<br />

llamada árbol. En la expresión FIXME:«A+B», los elem<strong>en</strong>tos «A», «+», «B»<br />

son hojas del árbol.<br />

A m<strong>en</strong>udo se utiliza un optimizador global <strong>en</strong>tre el primer y el segundo paso para<br />

producir código más pequeño y rápido.<br />

En la segunda pasada, el g<strong>en</strong>erador de código recorre el árbol sintáctico y g<strong>en</strong>era<br />

l<strong>en</strong>guaje <strong>en</strong>samblador o código máquina para los nodos del árbol. Si el g<strong>en</strong>erador<br />

de código crea l<strong>en</strong>guaje <strong>en</strong>samblador, <strong>en</strong>tonces se debe ejecutar el programa <strong>en</strong>samblador.<br />

El resultado final <strong>en</strong> ambos casos es un módulo objeto (un fichero que típicam<strong>en</strong>te<br />

ti<strong>en</strong>e una ext<strong>en</strong>sión de .o o .obj. A veces se utiliza un optimizador de mirilla<br />

<strong>en</strong> esta segunda pasada para buscar trozos de código que cont<strong>en</strong>gan s<strong>en</strong>t<strong>en</strong>cias redundantes<br />

de l<strong>en</strong>guaje <strong>en</strong>samblador.<br />

Usar la palabra «objeto» para describir pedazos de código máquina es un hecho<br />

desafortunado. La palabra com<strong>en</strong>zó a usarse antes de que la programación ori<strong>en</strong>tada<br />

a objetos tuviera un uso g<strong>en</strong>eralizado. «Objeto» significa lo mismo que «FIX-<br />

ME:meta» <strong>en</strong> este contexto, mi<strong>en</strong>tras que <strong>en</strong> la programación ori<strong>en</strong>tada a objetos<br />

significa «una cosa con límites».<br />

El <strong>en</strong>lazador combina una lista de módulos objeto <strong>en</strong> un programa ejecutable que<br />

el sistema operativo puede cargar y ejecutar. Cuando una función <strong>en</strong> un módulo objeto<br />

hace una refer<strong>en</strong>cia a una función o variable <strong>en</strong> otro módulo objeto, el <strong>en</strong>lazador<br />

resuelve estas refer<strong>en</strong>cias; se asegura de que todas las funciones y los datos externos<br />

solicitados durante el proceso de compilación exist<strong>en</strong> realm<strong>en</strong>te. Además, el <strong>en</strong>lazador<br />

añade un módulo objeto especial para realizar las actividades de inicialización.<br />

El <strong>en</strong>lazador puede buscar <strong>en</strong> unos archivos especiales llamados librerías para<br />

resolver todas sus refer<strong>en</strong>cias. Una librería conti<strong>en</strong>e una colección de módulos objeto<br />

39<br />

✐<br />

✐<br />

✐<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!