Fases de traducción
Los programas de C y C++ constan de uno o más archivos de código fuente, cada uno de los cuales contiene parte del texto de programa. Un archivo de código fuente, junto con sus archivos de inclusión archivos que se incluyen mediante la #include
directiva de preprocesador pero sin incluir las secciones de código que se quitan mediante directivas de compilación condicional como #if
, se denomina unidad de traducción.
Archivos de código fuente pueden traducirse en diferentes momentos. De hecho, es habitual traducir solo los archivos obsoletos. Las unidades de traducción traducidas se pueden procesar en archivos de objetos o bibliotecas de código de objetos independientes. Estas unidades de traducción independientes traducidas se vinculan para formar un programa ejecutable o una biblioteca de vínculos dinámicos (DLL). Para obtener más información sobre los archivos que se pueden utilizar como entrada del vinculador, vea LINK input files.
Las unidades de traducción pueden comunicarse mediante:
Llamadas a funciones que tienen vinculación externa.
Llamadas a funciones miembro de clase que tienen vinculación externa.
Modificación directa de objetos que tienen vinculación externa.
Modificación directa de archivos.
Comunicación entre procesos (solo para aplicaciones basadas en Microsoft Windows).
La lista siguiente describe las fases en las que el compilador traduce los archivos:
Asignación de caracteres
Los caracteres del archivo de código fuente se asignan a la representación de código fuente interna. En esta fase, las secuencias de trígrafos se convierten en una representación interna de caracteres únicos.
Splicing de líneas
Todas las líneas que terminan en una barra diagonal inversa (\) seguida inmediatamente de un carácter de nueva línea se combinan con la línea siguiente en el archivo de código fuente, para formar líneas lógicas a partir de las líneas físicas. A menos que esté vacío, un archivo de código fuente debe terminar con un carácter de nueva línea que no esté precedido por una barra diagonal inversa.
Tokenización
El archivo de código fuente se divide en tokens de preprocesamiento y caracteres de espacio en blanco. Cada uno de los comentarios del archivo de código fuente se reemplaza por un carácter de espacio. Los caracteres de nueva línea se conservan.
Preprocesamiento
Se ejecutan las directivas de preprocesamiento y se expanden las macros al archivo de código fuente. La instrucción #include
invoca la traslación que comienza con los tres pasos anteriores de traslación en cualquier texto incluido.
Asignación de juego de caracteres
Todos los miembros y secuencias de escape de juego de caracteres de origen se convierten en sus equivalentes en el juego de caracteres de ejecución. Para Microsoft C y C++, tanto el juego de caracteres de ejecución de origen como el de ejecución son ASCII.
Concatenación de cadenas
Se concatenan todos los literales adyacentes de cadena y cadena de caracteres anchos. Por ejemplo, "String " "concatenation"
se convierte en "String concatenation"
.
Traducción
Todos los tokens se analizan sintáctica y semánticamente; estos tokens se convierten en código de objeto.
Vinculación
Se resuelven todas las referencias externas para crear un programa ejecutable o una biblioteca de vínculos dinámicos.
El compilador produce advertencias o errores durante las fases de traslación en las que encuentra errores de sintaxis.
El vinculador resuelve todas las referencias externas y crea un programa ejecutable o DLL combinando una o más unidades de traslación procesadas por separado junto con bibliotecas estándar.