Fases de Traducción
El archivo de código fuente C es procesado por el compilador como si las siguientes fases tuvieran lugar, en este orden exacto. La implementación real puede combinar estas acciones o procesarlas de manera diferente siempre y cuando el comportamiento sea el mismo.
Fase 1
- El conjunto de caracteres fuente es un conjunto de caracteres multibyte que incluye el caracteres fuente básicos como un subconjunto de un solo byte, formado por los siguientes 96 caracteres:
'0' a '9''a' a 'z' y tambien 'A' hasta 'Z'_ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " ’Fase 2
Fase 3
<stdio.h> ó "myfile.h"1..E+3.foo ó 0JBK+, <<=, <%, ó ##.Si la entrada se ha procesado en tokens de preprocesamiento hasta un carácter determinado, generalmente se considera que el siguiente token de preprocesamiento es la secuencia más larga de caracteres que podría constituir un token de preprocesamiento, incluso si eso causaría un fallo en el análisis posterior. Esto se conoce comúnmente como "maximal munch".
int foo = 1;
int bar = 0xE+foo; // error: numero de preprocesamiento no valido 0xE+foo
int baz = 0xE + foo; // OK
int quux = bar+++++baz; // error: bar++ ++ +baz, no bar++ + ++baz.
La única excepción a la regla de "maximal munch" es:
- Los tokens de preprocesamiento en los nombres de las cabeceras sólo se forman dentro de una directiva
#includey en ubicaciones definidas por la implementación dentro de una directiva#pragma.
#define MACRO_1 1
#define MACRO_2 2
#define MACRO_3 3
#define MACRO_EXPR (MACRO_1 <MACRO_2> MACRO_3) // OK: <MACRO_2> no es un nombre de encabezado
Fase 4
Fase 5
Todos los caracteres y secuencias de escape en los caracteres constantes y de cadenas de caracteres literales se convierten de un conjuntos de caracteres de origen a un conjunto de caracteres de ejecución (que puede ser un conjunto de caracteres multibyte como UTF-8, siempre y cuando los 96 caracteres del juego de caracteres de origen básico enumerados en la fase 1 tengan representaciones de un solo byte). Si el carácter especificado por una secuencia de escape no es miembro del conjunto de caracteres de ejecución, el resultado es definido por la implementación, pero se garantiza que no será un carácter nulo (ancho).
Nota: la conversión realizada en esta etapa puede ser controlada por opciones de línea de comandos en algunas implementaciones: gcc y clang usan -finput-charset para especificar la codificación del conjunto de caracteres de origen, -fexec-charset y -fwide-exec-charset para especificar las codificaciones del conjunto de caracteres de ejecución en los literales de cadena y las constantes de caracteres que no tienen un prefijo de codificación (desde C11). (desde C11).
Fase 6
Se concatenan las cadenas de caracteres literales adyacentes.
Fase 7
La compilación tiene lugar: los tokens son analizados sintáctica, semánticamente y traducidos como una unidad de traducción.
Fase 8
Se realiza el enlace: Las unidades de traducción y los componentes de las librerias necesarios para satisfacer las referencias externas se recogen en una imagen del programa que contiene la información necesaria para la ejecución en su entorno de ejecución (el sistema operativo).
Referencias
- Standard C11 (ISO/IEC 9899:2011):
- 5.1.1.2 Translation phases (p: 10-11)
- 5.2.1 Character sets (p: 22-24)
- 6.4 Lexical elements (p: 57-75)
- Standard C99 (ISO/IEC 9899:1999):
- 5.1.1.2 Translation phases (p: 9-10)
- 5.2.1 Character sets (p: 17-19)
- 6.4 Lexical elements (p: 49-66)
- Standard C89/C90 (ISO/IEC 9899:1990):
- 2.1.1.2 Translation phases
- 2.2.1 Character sets
- 3.1 Lexical elements
Véase también
Documentación de C++ para Fases de traducción
|