Después de un año de desarrollo, se ha publicado el lanzamiento del conjunto gratuito de compiladores GCC 15.1, la primera versión significativa en la nueva rama GCC 15.x. De acuerdo con el esquema de numeración de versiones, la versión 15.0 se utilizó durante el desarrollo, y poco antes del lanzamiento de GCC 15.1 ya se había bifurcado la rama GCC 16.0, sobre la cual se formará el siguiente lanzamiento importante GCC 16.1.
Principales cambios:
- Al compilar programas en lenguaje C, por defecto se utiliza el estándar C23 (resumen de cambios) con las extensiones GNU (‘-std=gnu23’). Anteriormente, el estándar por defecto era C17 — ‘-std=gnu17’. Este cambio puede potencialmente causar problemas al compilar proyectos existentes debido a la inclusión de la constante nullptr, del tipo _BitInt(n) y de las palabras clave bool, true y false, que pueden entrar en conflicto con identificadores homónimos definidos en las aplicaciones.
- Se han implementado las capacidades del estándar C23:
- La directiva ‘#embed’, destinada a incrustar recursos binarios en el código.
- El atributo ‘unsequenced’, que indica que el resultado no depende del orden de ejecución.
- El atributo ‘reproducible’, que indica que la función siempre devuelve el mismo resultado con los mismos datos de entrada, es decir, no depende de otros factores.
- Se han implementado elementos del futuro estándar C2Y (-std=c2y y -std=gnu2y):
- La posibilidad de declarar variables en la sentencia ‘if’, por ejemplo, ‘if (int x = get()) {…}’.
- Soporte para asignar nombres a los bucles para poder referirse a ellos en el código. outer: for (int i = 0; i < IK; ++i) { switch (i) { case 1: break; // salta a CONT1 case 2: break outer; // salta a CONT2 } // CONT1 } // CONT2
- Soporte para especificar rangos de valores enteros en las expresiones ‘case’, por ejemplo, ‘case 1 … 10:’.
- Sufijos ‘i’ y ‘j’ para denotar la parte imaginaria en números complejos.
- Posibilidad de usar los operadores ‘++’ y ‘—’ con números complejos.
- La construcción ‘_Generic(type, expr1, expr2, …)’ para seleccionar una expresión basada en el tipo del operando.
- Soporte para acceder a matrices de bytes como si fueran otros tipos de objetos, como estructuras y uniones.
- Soporte para aplicar el operador ‘alignof’ a arreglos incompletos (declarados sin especificar el tamaño, por ejemplo, ‘int a[]’).
- Se ha agregado una nueva sintaxis para secuencias de escape de caracteres octales, hexadecimales y universales. En lugar de «\u», «\x» y «\nnn», se proponen las secuencias «\u{}», «\o{}» y «\x{}», donde se puede especificar cualquier número de dígitos.
- Funciones integradas «__builtin_stdc_rotate_left» y «__builtin_stdc_rotate_right».
- Se permiten operaciones de longitud cero en punteros NULL (por ejemplo, «sizeof(*p)»).
- En el frontend para el lenguaje C++ se han implementado capacidades que se desarrollan para el futuro estándar C++26:
- Operador variacional «friend» («friend Ts…»).
- Posibilidad de usar la palabra clave «constexpr» con la variante del operador «new» (placement new) para colocar un objeto en memoria previamente asignada durante la compilación.
- Se genera un error al eliminar un puntero a un tipo incompleto.
- Se ha declarado obsoleta la sintaxis de definición de parámetros variáticos con puntos suspensivos sin una coma previa (por ejemplo, al indicar «void e(int…)» en lugar de «void e(int, …)»).
- Indexación del paquete de parámetros en plantillas.
- Atributos para enlaces estructurados;
- Sintaxis ‘= delete(«razón»)‘;
- Inclusión de «@», «$» y «`» en el conjunto básico de caracteres.
- Se prohíbe el uso de macros para declarar módulos.
- Posibilidad de aplicar enlaces estructurados (structured binding) como condición en los operadores if y switch.
- Se ha dejado de soportar la comparación directa de arreglos (por ejemplo, «int arr1[5]; int arr2[5]; bool same = arr1 == arr2»).
- Mecanismo «#embed» para incrustar recursos binarios.
- Se ha declarado obsoleta la clase de plantilla is_trivial.
- Se han agregado las capacidades de C++23:
- Prohibición de algunas aplicaciones de la directiva «export» y permiso para usar «export {}».
- Soporte para extender el tiempo de vida de objetos temporales en bucles «for» que recorren rangos.
- En la biblioteca libstdc++ se ha implementado soporte experimental para módulos std y std.compat.
- El uso del inicializador «{0}» para uniones en código C y C++ ya no garantiza la limpieza de todo el contenido, sino que conduce a la nulificación del primer elemento de la unión. Para limpiar toda la unión, se debe usar la expresión «{}», definida en la especificación C23, o especificar la opción «-fzero-init-padding-bits=unions» para restaurar el comportamiento anterior.
- Se ha implementado el soporte para el atributo «musttail» ([[gnu::musttail]] y [[clang::musttail]]) para llamadas garantizadas en cola. Este atributo se aplica a las expresiones de retorno en las que se realiza una llamada recursiva a la función actual, y garantiza que dicha llamada utilizará recursión de cola, evitando la asignación de memoria adicional en la pila (eliminando el riesgo de agotamiento de memoria con un número muy alto de llamadas).
- Se ha implementado el soporte para el atributo flag_enum ([[gnu::flag_enum]] y [[clang::flag_enum]]), aplicable a enumeraciones para indicar que su contenido se utiliza en operaciones de bits (evitando advertencias en modo «-Wswitch»).
- Se ha añadido soporte para el atributo «counted_by», que permite especificar un campo en la estructura con un arreglo flexible que define el número de elementos. Este atributo puede utilizarse para mejorar la eficiencia de las verificaciones de desbordamiento de búfer.
- Para las funciones se ha añadido el atributo «nonnull_if_nonzero», que define que algunos parámetros de función con punteros pueden aceptar el valor NULL solo si otro parámetro es cero.
- Se permite el uso de inserciones de ensamblador extendidas «asm(…)» fuera de las funciones. En las inserciones de ensamblador, se permite sobrescribir la memoria en la zona roja de la pila (área en la parte superior de la pila).
- La compilación de código en C++ se ha acelerado gracias a una mejor elaboración de hash de plantillas.
- Se han añadido nuevas optimizaciones. Se ha implementado soporte para la vectorización de bucles que contienen código para salidas anticipadas (por ejemplo, a través de una llamada a break o return), incluso si tales bucles manipulan arreglos o búferes asignados dinámicamente cuyo tamaño no es conocido en el momento de la compilación. Al especificar la opción «-O2», se incluye la vectorización de algunos bucles fácilmente vectorizables para los que no hay información sobre el número de iteraciones (tripcount).
- Se ha añadido un modo de optimización incremental en la etapa de enlace (LTO, Link-Time Optimization), que reduce significativamente el tiempo de recompilación al utilizar LTO en situaciones donde se han realizado cambios menores en el código (como editar una función). Para activar el modo incremental, se ha propuesto la opción «-flto-incremental».
- Se ha mejorado la compilación de archivos de entrada muy grandes. Se ha implementado el seguimiento de los números de columna que exceden 4096. Se ha aumentado la precisión en la indicación de la ubicación de errores y advertencias en archivos muy grandes.
- Se ha aumentado la claridad de los informes al diagnosticar problemas. Por ejemplo, se ha asegurado la identificación del lugar donde ocurre el problema con el símbolo «⚠️», se ha modificado la disposición de la salida ante errores en plantillas de C++, se han añadido sugerencias para facilitar la transición al estándar C23 y se ha renovado la paleta de colores. Se ha añadido la capacidad de salida de diagnóstico en formato Sarif (-fdiagnostics-format=sarif-file).
- Se ha implementado la biblioteca libgdiagnostics, que permite integrar en sus proyectos las capacidades de GCC relacionadas con la formación de mensajes de diagnóstico (por ejemplo, se pueden utilizar herramientas de citas, resaltado y sugerencias de corrección).
- Se han añadido las advertencias «-Wtrailing-whitespace» y «-Wleading-whitespace» para identificar espacios en blanco residuales al final de las líneas y espacios en blanco innecesarios al principio de las líneas.
- Se ha añadido la advertencia «-Wheader-guard» para informar sobre problemas en los macros de protección de archivos de encabezado que evitan la inclusión repetida de archivos de encabezado.
- Se ha actualizado el frontend para el lenguaje D a la versión 2.111.0.
- Se ha añadido soporte para enteros sin signo en el frontend para el lenguaje Fortran.
- Se ha incluido un compilador para el lenguaje COBOL — gcobol, que admite plataformas x86-64 y AArch64, y no está diseñado para su uso en sistemas de 32 bits. El compilador implementa la especificación ISO/IEC 1989:2023 y pasa la mayor parte de las pruebas NIST CCVS/85.
- Se ha continuado la implementación de los estándares OpenMP 5.0, 5.1, 5.2 y 6.0 (Open Multi-Processing), que definen la API y los métodos de aplicación para la programación paralela en sistemas multinúcleo y híbridos (CPU+GPU/DSP) con memoria compartida y bloques de vectorización (SIMD). Se ha añadido soporte para metadirectivas y construcciones tile, unroll, interop y dispatch. Para algunos GPU de AMD y NVIDIA se ha añadido soporte para la memoria compartida unificada (activada mediante el indicador unified_shared_memory en la directiva «requires»). Se ha añadido soporte para la expresión «self_maps».
- Se ha añadido soporte para la plataforma MinGW (aarch64-w64-mingw32) en el backend para la arquitectura AArch64. Se han implementado más de 20 extensiones ARM8 y se ha mejorado el soporte para la extensión ACLE (Arm C Language Extensions). Se han realizado numerosas mejoras en el generador de código. Se ha añadido soporte para CPU:
- Apple A12 (apple-a12)
- Apple M1 (apple-m1)
- Apple M2 (apple-m2)
- Apple M3 (apple-m3)
- Arm Cortex-A520AE (cortex-a520ae)
- Arm Cortex-A720AE (cortex-a720ae)
- Arm Cortex-A725 (cortex-a725)
- Arm Cortex-R82AE (cortex-r82ae)
- Arm Cortex-X925 (cortex-x925)
- Arm Neoverse N3 (neoverse-n3)
- Arm Neoverse V3 (neoverse-v3)
- Arm Neoverse V3AE (neoverse-v3ae)
- FUJITSU-MONAKA (fujitsu-monaka)
- NVIDIA Grace (grace)
- NVIDIA Olympus (olympus)
- Qualcomm Oryon-1 (oryon-1)
- En el backend de generación de código para GPU AMD Radeon (GCN) se ha implementado soporte para la biblioteca libstdc++ y se ha añadido soporte experimental para la generación de código para las series de dispositivos gfx9-generic, gfx10-3-generic y gfx11-generic.
- En el backend para la arquitectura x86 se ha añadido soporte para las extensiones de la arquitectura del conjunto de instrucciones Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Se ha añadido soporte para CPU Intel Diamond Rapids y Xeon Phi.
- Se han ampliado las capacidades de los backends para las plataformas LoongArch y AVR.
- Se ha eliminado el soporte para la arquitectura de destino nios2, utilizada en los procesadores Nios II. Se ha declarado obsoleto y se eliminará en la próxima versión importante el soporte ABI ILP32 (-mabi=ilp32) en el puerto para AArch64.
Fuente: opennet.ru
