MMmmm... No sé.
Creo que estoy complicando demasiado el asunto con tan sólo el "Hola Mundo" y sus amigos.
No te preocupes, no lo complicas, es complicado, que es distinto.
Según he consultado en Internet por ahí, parece ser que durante la compilación sí se pasa a código en números binarios y después se ensambla inmediatamente; ahora bien, no he podido enterarme si eso de "ensamblar" ser refiere al código código ensamblador de antes, del que yo sí conocía un poco básicamente, o es otra cosa.
De todas formas, tú ve a tu aire, que yo te sigo como pueda y ya con la práctica me iré enterando. Además, parece que tiene cosas bastante parecidas al Javascript en cuanto a declaración de variables locales y algunas cosas así que conozco también de forma básica (de hacer tonterías con el Flash Macromedia).
Saludos y gracias.
Lo que pasa es que me estás mezclando cosas.
Estábamos hablando del preprocesador.
El preprocesador nunca transforma a lenguaje de máquina, sino que solamente transforma un programa en C, con algunas directivas (o sea cláusulas con #), en otro programa escrito también en C, pero sin directivas #.
Es que las directivas del preprocesador son sólo declaraciones de tipo "abreviatura".
El preprocesador "desenrolla" esas abreviaturas y las muestra explícitamente.
En la entrada que escribí de mis notas:
Etapas del preprocesadorhay un ejemplo de cómo trabaja el preprocesador, yendo en varias etapas de traducción que van quitando las cláusulas #.
_________________
Luego, el ciclo de compilación es algo complejo que contiene varias etapas, que yo he simplificado para que se entienda.
Yo dije esto:
Programa-que-uno-escribe-en-C ---------> Preprocesador-traduce-a-programa-en-C-equivalente-pero-sin-directivas ---------> Compilador-traduce-esto-a-código-de-máquina-del-programa-ejecutable.
Bien, obviamente me he saltado algo en el medio en el último paso.
Es lo que vos mencionás sobre el ensamble.
El "ensamble" no tiene nada que ver con el lenguaje "ensamblador".
Lo que hace el compilador es traducir los diferentes archivos involucrados en un programa (que en general son muchos en un proyecto serio), que todavía no son el ejecutable definitivo.
Esos archivos "compilados" contienen las librerías ".h" y otros archivos que andan por ahí, junto con los enlaces y relaciones que el programados ha elegido entre todos los archivos del proyecto.
El "ensamble" consiste en tomar nota de todas esas relaciones, y "enlazar" todos esos archivos (que es un trabajo hecho por un programa llamado "enlazador" o "linker"), que es lo que finalmente "fabrica" definitivamente el programa ejecutable ".exe".
El compilador, en teoría, no se encarga de hacer el enlazado, sino el programa "enlazador".
El "ensamble" es esta unión o enlazamiento de archivos para formar uno definitivo ejecutable.
Cuando en el IDE wxDevC++ seleccionamos la opción "Compilar", resulta que hace todo junto: el preproceso, luego la "compilación" propiamente dicha, y finalmente el enlazado (o ensamble)..
Un compilador bien hecho tiene que permitir que el programador tenga control sobre esas etapas, porque en proyectos grandes conviene compilar algunos trozos o archivos una sola vez, y así modificar sólo unos pocos archivos cada vez, que serían los únicos que hay que compilar "de verdad", mientras que la única tarea que habría que hacer siempre sería la del enlazado, que es más sencilla y consume menos recursos.