close
Espacios de nombres
Variantes

Fases de Traducción

De cppreference.com

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

1) Los bytes individuales del archivo de código fuente (que generalmente es un archivo de texto en algún tipo de codificación multibyte como UTF-8) se asignan, de forma definida en la implementación, a los caracteres del conjunto de caracteres fuente. En particular, los indicadores de fin de línea dependientes del sistema operativo se sustituyen por caracteres de nueva línea.
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:
a) 5 caracteres de espacio en blanco (espacio, tabulación horizontal, tabulación vertical, salto de página, línea nueva)
b) 10 caracteres para digitos desde '0' a '9'
c) 52 letras desde 'a' a 'z' y tambien 'A' hasta 'Z'
d) 29 caracteres para puntuación: _ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " ’
2) Las secuencias de trígrafos se sustituyen por las correspondientes representaciones de un solo carácter.

Fase 2

1) Siempre que aparece una barra invertida al final de una línea (seguida inmediatamente por el carácter de nueva línea), se borran tanto la barra invertida como la nueva línea, combinando dos líneas de fuente física en una sola línea de fuente lógica. Se trata de una operación de paso simple: una línea que termina en dos barras invertidas seguidas de una línea vacía no combina tres líneas en una.
2) Si un archivo fuente no-vacío no termina con un carácter de nueva línea después de este paso (si no tenía ninguna línea nueva originalmente, o si terminó con una barra invertida), el comportamiento sera indefinido.


Fase 3

1) El archivo fuente se descompone en comentarios, secuencias de caracteres de espacios en blanco (espacio, tabulación horizontal, nueva línea, tabulación vertical y alimentación de formularios) y tokens de preprocesamiento, que son los siguientes
a) nombres de cabeceras: <stdio.h> ó "myfile.h"
c) números de preprocesamiento, que cubren constantes enteras y constantes flotantes, pero también algunos tokens no válidos como 1..E+3.foo ó 0JBK
e) operadores y puntuadores, tales como +, <<=, <%, ó ##.
f) caracteres individuales no espaciados que no encajan en ninguna otra categoría
2) Cada comentario es reemplazado por un carácter de espacio
3) Se mantienen las líneas nuevas y se define si las secuencias de espacios en blanco que no son de líneas nuevas pueden colapsarse en caracteres de un solo espacio.

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 #include y 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

1) El Preprocesador es ejecutado.
2) Cada archivo introducido con la directiva #include pasa por las fases 1 a 4, recursivamente.
3) Al final de esta fase, todas las directivas del preprocesador se eliminan de la fuente.

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