Después de un año de desarrollo publicado el lanzamiento de un conjunto de compiladores gratuito GCC 16.1, el primer lanzamiento significativo en la nueva rama GCC 16.x. De acuerdo con el esquema de numeración de lanzamientos, la versión 16.0 fue utilizada durante el desarrollo, y poco antes del lanzamiento de GCC 16.1 ya se había bifurcado la rama GCC 17.0, sobre la cual se formará la siguiente versión significativa, GCC 17.1.
Principales cambios:
- El modo predeterminado para el lenguaje C++ ha cambiado para usar el estándar C++20 (-dialecto GNU C++20, -std=gnu++20) en lugar del anteriormente propuesto C++17. La implementación de C++20 en la biblioteca estándar se ha declarado estable.
- Se ha incluido un front-end experimental ga68 para compilar programas en el lenguaje de programación Algol 68.
- Se ha añadido la capacidad de salida de información diagnóstica en formato HTML. Se ha ampliado la información sobre el progreso de la ejecución del programa, incluida en la salida de diagnóstico en formato SARIF, basado en JSON (el soporte para «-fdiagnostics-format=json» se ha descontinuado).
- Se han ampliado las optimizaciones en la etapa de enlace (LTO, Optimización en el Tiempo de Enlace). Se ha añadido la opción «-flto-toplevel-asm-heuristics», que incluye heurísticas para mejorar la optimización del código con inserciones ensambladoras. La técnica de desvirtualización especulativa (-fdevirtualize-speculatively) ya no está limitada a la transformación de métodos virtuales y puede aplicarse a la conversión de llamadas indirectas a llamadas directas de cualquier función, como las llamadas mediante punteros.
- Se ha implementado soporte para la vectorización de bucles para los cuales en la etapa de compilación se desconoce el número de iteraciones. Se ha mejorado la eficiencia en el manejo de salidas anticipadas del bucle (por ejemplo, mediante break).
- Se ha añadido soporte experimental para muchas capacidades del recientemente aprobado estándar C++26. Por ejemplo, se han implementado:
- Reflexión (Reflection, «-freflection»), que permite rastrear y modificar elementos del programa en la etapa de compilación. Se han añadido nuevos operadores «^^ (open-std.org)» para obtener metainformación sobre la construcción gramatical y «[:…:]» para realizar la transformación inversa. Para la conversión y procesamiento de la información obtenida durante la inspección, se ha propuesto la biblioteca std::meta y se dispone de funciones tales como cálculos con constantes.
- Programación por contrato (Contracts), lo que permite definir especificaciones formales de interfaces utilizando tres nuevos operadores: pre (precondición), post (poscondición) y contract_assert (verificación de afirmaciones). El operador «pre» define las condiciones preliminares que deben cumplirse antes de la llamada (verificación de entradas); «post» son las condiciones que deben cumplirse después de la ejecución (requisitos de salida); contract_assert son las condiciones de excepción. Esta capacidad estará disponible en GCC 16.
- El operador «template for» para iterar sobre elementos como paquetes de parámetros, objetos similares a tuplas y los resultados de reflexión (metaobjetos), en tiempo de compilación al estilo de un ciclo normal. Al ejecutar «template for», el cuerpo del ciclo se descompone para cada elemento y cada iteración se procesa en un ámbito separado, donde el elemento de la secuencia sobre la que itera el ciclo es una constante para cada iteración y puede participar en expresiones constantes (constexpr). En el contexto de la reflexión, «template for» puede ser utilizado para recorrer las propiedades de clases o enumeraciones.
- La biblioteca std::simd para paralelizar la ejecución de operaciones sobre datos utilizando conjuntos de instrucciones SIMD, como AVX-512 y NEON, aprovechando el sistema de tipos estándar de C++.
- Las bibliotecas std::inplace_vector, std::optional<T&>, std::copyable_function, std::function_ref, std::indirect, std::polymorphic y std::owner_equal.
- Se han implementado capacidades relacionadas con el estándar C++23, como explícito gestión del tiempo de vida de los objetos y soporte especificación de la codificación de caracteres de los mensajes de diagnóstico.
- Se ha ampliado el soporte para el estándar C23 (opennet.ru), por ejemplo, se ha implementado la posibilidad de usar el atributo «counted_by» para verificar la corrección del uso de punteros.
- 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 API y métodos para aplicar técnicas de programación paralela en sistemas multinúcleo e híbridos (CPU+GPU/DSP) con memoria compartida y bloques de vectorización (SIMD). Se ha mejorado la implementación de las especificaciones de programación paralela OpenACC 3.0, 3.3 y 3.4, que definen herramientas para la ejecución de operaciones (offloading) en GPU y procesadores especializados, como NVIDIA PTX.
- Se ha añadido soporte para procesadores AMD basados en la microarquitectura Zen6 (-march=znver6) en el backend de arquitectura x86, así como para los procesadores Intel Wildcat Lake (-march=wildcatlake) y Nova Lake (-march=novalake).
- En el backend de generación de código para GPU AMD Radeon (GCN), se ha implementado soporte para los aceleradores AMD Instinct MI300 (gfx942).
- Para las arquitecturas RISC-V, ARM, S/390 y LoongArch, se ha implementado soporte para el tipo «_BitInt (N)» para la definición de enteros con un número específico de bits.
Fuente: linux.org.ru
