Después de un año de desarrollo, se ha lanzado la suite de compiladores gratuita GCC 15.1, la primera versión importante en la nueva rama GCC 15.x. De acuerdo con el esquema de numeración de versiones, durante el desarrollo se utilizó la versión 15.0 y, poco antes del lanzamiento de GCC 15.1, ya se había bifurcado una rama de GCC 16.0, que formará la base de la próxima versión principal, GCC 16.1.
Cambios importantes:
- Al compilar programas en C, se utiliza de forma predeterminada el estándar C23 (Resumen de cambios) con extensiones GNU ("-std=gnu23"). Anteriormente, se utilizaba por defecto el estándar C17 (-std=gnu17). El cambio podría potencialmente causar problemas al construir proyectos existentes debido a la inclusión de la constante nullptr, el tipo _BitInt(n) y las palabras clave bool, true y false, que podrían entrar en conflicto con identificadores con nombres similares definidos en las aplicaciones.
- Se han implementado las siguientes capacidades del estándar C23:
- La directiva "#embed" está diseñada para incrustar recursos binarios en el código.
- El atributo "no secuencial", que indica que el resultado no depende del orden de ejecución.
- El atributo "reproducible" indica que la función siempre devuelve el mismo resultado dada la misma entrada, es decir, no depende de otros factores.
- Se han implementado elementos del futuro estándar C2Y (-std=c2y y -std=gnu2y):
- Capacidad de declarar variables en una declaración "si", como "if (int x = get ()) {...}".
- Soporte para nombrar bucles para hacer referencia a ellos en el código. exterior: para (int i = 0; i < IK; ++ i) { switch (i) { caso 1: break; // salta a CONT1 caso 2: break external; // salta a CONT2 } // CONT1 } // CONT2
- Soporte para especificar rangos de valores enteros en expresiones de caso, como "caso 1...10:".
- Los sufijos "i" y "j" para denotar la parte imaginaria en números complejos.
- Posibilidad de utilizar los operadores “++” y “—” con números complejos.
- La construcción "_Generic(type, expr1, expr2, …)" para seleccionar una expresión según el tipo de operando.
- Soporte para acceder a matrices de bytes como otros tipos de objetos, como estructuras y uniones.
- Soporte para aplicar el operador "alignof" a matrices incompletas (aquellas declaradas sin especificar un tamaño, como "int a[]").
- Se agregó 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{}”, en las que 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)").
- La interfaz para el lenguaje C++ implementa características que se están desarrollando para el futuro estándar C++26:
- Operador variacional "amigo" ("amigo Ts...").
- La capacidad de utilizar la palabra clave constexpr con una variación del operador new (colocación new) para colocar un objeto en una memoria preasignada en tiempo de compilación.
- Error de salida al eliminar un puntero a un tipo incompleto.
- La sintaxis para definir parámetros variádicos con puntos suspensivos sin una coma precedente (por ejemplo, al especificar "void e(int…)" en lugar de "void e(int, …)") ha quedado obsoleta.
- Indexar un paquete de parámetros en plantillas.
- Atributos para enlaces estructurados;
- Sintaxis '= delete("razón");
- Inclusión de "@", "$" y "`" en el conjunto de caracteres básicos.
- Está prohibido el uso de macros para declarar módulos.
- Capacidad de utilizar el enlace estructurado como condición en las declaraciones if y switch.
- Se ha descontinuado el soporte para la comparación directa de matrices (por ejemplo, "int arr1[5]; int arr2[5]; bool same = arr1 == arr2").
- El mecanismo "#embed" para incrustar recursos binarios.
- La clase de plantilla is_trivial ha quedado obsoleta.
- Se agregaron características de C++23:
- No permitir algunos usos de la directiva "export" y permitir el uso de "export {}".
- Soporte para extender la vida útil de objetos temporales en bucles for que iteran sobre rangos.
- La biblioteca libstdc++ implementa soporte experimental para los módulos std y std.compat.
- El uso del inicializador "{0}" para uniones en código C y C++ ya no garantiza que se borre todo el contenido, sino que da como resultado que el primer elemento de la unión se ponga en cero. Para borrar toda la unión, utilice la expresión "{}" definida en la especificación C23 o especifique la opción "-fzero-init-padding-bits=unions" para restaurar el comportamiento anterior.
- Se implementó soporte para el atributo "musttail" ([[gnu::musttail]] y [[clang::musttail]]) para llamadas de cola garantizadas. El atributo se aplica a las declaraciones de retorno que realizan una llamada recursiva a la función actual y garantiza que dicha llamada utilizará recursión de cola, que no asigna memoria adicional en la pila (eliminando el riesgo de quedarse sin memoria con una cantidad muy grande de llamadas).
- Se implementó soporte para el atributo flag_enum ([[gnu::flag_enum]] y [[clang::flag_enum]]) aplicado a enumeraciones para indicar que los contenidos se utilizan en operaciones bit a bit (evita advertencias en modo -Wswitch).
- Se agregó soporte para el atributo "counted_by", que se puede usar para especificar un campo en una estructura con una matriz flexible que determina la cantidad de elementos. El atributo se puede utilizar para mejorar la eficiencia de las comprobaciones de desbordamiento de búfer.
- Se agregó el atributo "nonnull_if_nonzero" a las funciones, que especifica que algunos parámetros de función con punteros pueden ser NULL solo si otro parámetro es cero.
- Se permite la inclusión en línea de "asm(….)" del ensamblador extendido fuera de las funciones. En las inserciones del ensamblador, se permite sobrescribir la memoria en la zona roja de la pila (el área en la parte superior de la pila).
- La compilación de código C++ es más rápida gracias al hash de plantilla mejorado.
- Se agregaron nuevas optimizaciones. Se ha implementado soporte para vectorizar bucles que contienen código para salida anticipada (por ejemplo, a través de una llamada de interrupción o retorno), incluso si dichos bucles manipulan matrices o buffers asignados dinámicamente cuyo tamaño se desconoce en el momento de la compilación. Cuando se especifica la opción -O2, se habilita la vectorización de algunos bucles fácilmente vectorizables para los cuales no está disponible la información de recuento de viajes.
- Se agregó el modo de optimización incremental en la etapa de vinculación (LTO, Link-Time Optimization), que reduce significativamente el tiempo de recompilación cuando se usa LTO en situaciones en las que se han realizado cambios menores en el código (se ha editado una función). Para habilitar el modo incremental, se propone la opción "-flto-incremental".
- Compilación mejorada de archivos de entrada muy grandes. Se implementó el seguimiento de números de columna mayores a 4096. Se mejoró la precisión al indicar la ubicación de errores y advertencias en archivos muy grandes.
- Visibilidad mejorada de los informes al diagnosticar problemas. Por ejemplo, la ubicación del problema está resaltada con el símbolo “⚠️”, se ha cambiado el diseño de la salida de errores en las plantillas de C++, se han agregado sugerencias para simplificar la transición al estándar C23 y se ha rediseñado el esquema de colores. Se agregó la capacidad de generar diagnósticos en formato Sarif (-fdiagnostics-format=sarif-file).
- Se ha implementado la biblioteca libgdiagnostics, que le permite integrar las capacidades de GCC relacionadas con el diseño de mensajes de diagnóstico en sus proyectos (por ejemplo, puede usar citas, resaltados y sugerencias de corrección).
- Se agregaron las advertencias "-Wtrailing-whitespace" y "-Wleading-whitespace" para detectar espacios en blanco residuales al final de las líneas y espacios en blanco adicionales al comienzo de las líneas.
- Se agregó la advertencia "-Wheader-guard" para informar problemas en las macros de protección de encabezado que impiden que se incluya nuevamente un archivo de encabezado.
- La interfaz para el lenguaje D se ha actualizado a la versión 2.111.0.
- Se ha agregado soporte para enteros sin signo al frontend de Fortran.
- El paquete incluye un compilador para el lenguaje COBOL, gcobol, que admite las 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ía de las pruebas NIST CCVS/85.
- Se ha continuado con la implementación de los estándares OpenMP 5.0, 5.1, 5.2 y 6.0 (Open Multi-Processing), definiendo la API y los métodos para aplicar métodos de programación paralela en sistemas multinúcleo e híbridos (CPU+GPU/DSP) con memoria compartida y unidades de vectorización (SIMD). Se agregó soporte para metadirectivas y construcciones de mosaico, desenrollado, interoperabilidad y despacho. Para algunas GPU AMD y NVIDIA, se ha agregado compatibilidad con memoria compartida unificada (habilitada al especificar unified_shared_memory en la directiva "requires"). Se agregó soporte para la expresión "self_maps".
- El backend de la arquitectura AArch64 se ha actualizado para soportar la plataforma MinGW (aarch64-w64-mingw32). 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 agregó 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)
- Brazo Neoverse V3AE (neoverse-v3ae)
- FUJITSU-MONAKA (fujitsu-monaka)
- NVIDIA Grace
- NVIDIA Olympus (Olympus)
- Qualcomm Oryon-1 (Oryon-1)
- El backend de generación de código de la GPU AMD Radeon (GCN) se ha actualizado para admitir la biblioteca libstdc++ y se ha agregado soporte de generación de código experimental para las series de dispositivos gfx9-generic, gfx10-3-generic y gfx11-generic.
- El backend x86 ahora admite las extensiones de arquitectura del conjunto de instrucciones Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Se agregó soporte para CPU Intel Diamond Rapids y Xeon Phi.
- Capacidades de backend ampliadas para las plataformas LoongArch y AVR.
- Se eliminó el soporte para la arquitectura de destino nios2 utilizada en los procesadores Nios II. La compatibilidad con ILP32 ABI (-mabi=ilp32) en el puerto AArch64 ha quedado obsoleta y se eliminará en la próxima versión principal.
Fuente: opennet.ru
