El compilador GCC 10.1 ya esta aquí y estas son sus principales novedades
Después de un año de desarrollo se publicó el lanzamiento de la nueva versión del conjunto gratuito de compiladores GCC 10.1, siendo este el primer lanzamiento significativo en la nueva rama de GCC 10.x.
De acuerdo con el nuevo esquema de numeración de la versión, la versión 10.0 se utilizó durante el proceso de desarrollo y poco antes del lanzamiento de GCC 10.1, la rama GCC 11.0 ya se ramificó, sobre la base de la cual se formará la próxima versión significativa de GCC 11.1.
Para quienes desconocen de GCC (GNU Compiler Collection) deben saber que este es un conjunto de compiladores creados por el proyecto GNU, es software libre y lo distribuye la Free Software Foundation (FSF) bajo la licencia general pública GPL.
Estos compiladores son ampliamente utilizados en la mayoría de los sistemas Unix a tal grado que se consideran un estándar para sistemas operativos Unix y derivados de código abierto y también de propietarios, como Mac OS X.
GCC requiere el conjunto de aplicaciones conocido como binutils para realizar tareas como identificar archivos objeto u obtener su tamaño para copiarlos, traducirlos o crear listas, enlazarlos, o quitarles símbolos innecesarios.
Novedades en GCC 10.1
GCC 10.1 destaca por la implementación de muchas innovaciones del lenguaje C++ desarrollado para el estándar C++ 20, mejoras relacionadas con el futuro estándar del lenguaje C (C2x), nuevas optimizaciones en los backends del compilador y soporte experimental para el modo de análisis estático.
Para los lenguajes C, C++ y Fortran, se implementa la especificación de programación paralela OpenACC 2.6, que define herramientas de descarga en GPU y procesadores especializados como NVIDIA PTX.
La implementación del estándar OpenMP 5.0 (Open Multi-Processing), que define la API y los métodos para usar métodos de programación paralela en sistemas multi-core e híbridos (CPU + GPU/DSP) con memoria compartida y unidades de vectorización (SIMD), está casi terminada.
Se agregan características como expresiones condicionales lastprivate, directivas de escaneo y bucle, orden y expresiones use_device_addr. Para OpenMP y OpenACC, se agregó soporte para la descarga en las GPU AMD Radeon de cuarta generación y quinta generación.
Para los lenguajes C, la función “access” se ha agregado para describir el acceso a la función de los objetos pasados por referencia o puntero y para asociar dichos objetos con argumentos enteros que contienen información sobre el tamaño de los objetos.
Para trabajar junto con “access”, el atributo “type” se implementa para detectar el acceso incorrecto desde las funciones del usuario, por ejemplo, al escribir valores en un área fuera de los límites de la matriz. El atributo symver también se ha agregado para vincular caracteres en el archivo ELF a números de versión específicos.
Para C++, se han implementado alrededor de 16 cambios e innovaciones desarrolladas en el estándar C++ 20 incluyendo la palabra clave “constinit” que se agrega y se implementa el soporte para expandir las plantillas “concept” que permiten definir un conjunto de requisitos para parámetros de plantilla, que durante la compilación limitan el conjunto de argumentos que se pueden tomar como parámetros de plantilla.
Ademas se destacan las optimizaciones interprocedurales mejoradas, IPA-SRA se ha rediseñado para que funcione durante el enlace y entre otras cosas, ahora elimina los valores calculados y devueltos no utilizados.
En el modo de optimización “-O2”, se habilita la opción “-finline-functions”, que se reconfigura para obtener un código más compacto que para el rendimiento.
También se destaca la optimización de enlace mejorada (LTO), se agregó un nuevo archivo ejecutable lto-dump para volcar información sobre archivos de objetos con código de bytes LTO. En pases paralelos de LTO, es posible determinar automáticamente el número de tareas de ejecución ejecutadas simultáneamente y, si no se pueden determinar, utilizar información sobre el número de núcleos de CPU como factor de paralelización.
El mecanismo de optimización fue mejorado y se basa en los resultados de la creación de perfiles de código (PGO), que genera un código más óptimo basado en un análisis de las características de la ejecución del código.
Si quieres conocer más al respecto, puedes consultar los detalles de este lanzamiento en el siguiente enlace.