GCC 16

Após um ano de desenvolvimento foi publicado lançamento de uma nova versão do compilador GCC 16.1, o primeiro lançamento significativo na nova série GCC 16.x. De acordo com o esquema de numeração de lançamentos, a versão 16.0 foi utilizada durante o desenvolvimento, e pouco antes do lançamento do GCC 16.1, já havia surgido a ramificação GCC 17.0, a partir da qual será formado o próximo lançamento significativo do GCC 17.1.

Principais mudanças:

  • O modo padrão para a linguagem C++ foi alterado para usar o padrão C++20 (diálogo GNU C++20, -std=gnu++20) em vez do anteriormente proposto C++17. A implementação do C++20 na biblioteca padrão foi declarada estável.
  • Incluído um front-end experimental ga68 para compilar programas na linguagem de programação Algol 68.
  • Adicionada a capacidade de gerar informações de diagnóstico em formato HTML. Expandida a informação sobre o progresso da execução do programa, incluída na saída de diagnóstico em formato SARIF, baseado em JSON (o suporte a «-fdiagnostics-format=json» foi descontinuado).
  • Expandidas as otimizações na fase de ligação (LTO, Link-Time Optimization). Adicionada a opção «-flto-toplevel-asm-heuristics», que inclui heurísticas para melhorar a otimização do código com inserções em assembly. A técnica de desvirtualização especulativa (-fdevirtualize-speculatively) agora não é limitada à transformação de métodos virtuais e pode ser aplicada à conversão em chamadas diretas de quaisquer chamadas indiretas de funções, por exemplo, chamadas através de ponteiros.
  • Implementado suporte à vetorização de loops, para os quais o número de iterações é desconhecido na fase de compilação. A eficiência do tratamento de saídas antecipadas de loops (por exemplo, através de break) foi aumentada.
  • Suporte experimental adicionado. muitos capacidades recentemente aprovado padrão C++26. Por exemplo, foram implementados:
    • Reflexão (Reflection, «-freflection»), permitindo rastrear e modificar elementos do programa na fase de compilação. Novos operadores «^^ (open-std.org)» para obter metainformação sobre a construção gramatical e «[:…:]» para realizar a transformação inversa. Para a transformação e processamento das informações obtidas durante a inspeção, foi proposta a biblioteca std::meta e estão disponíveis capacidades como cálculos com constantes.
    • Programação por contrato (Contratos), permitindo definir especificações formais de interfaces por meio de três novos operadores: pre (pré-condição), post (pós-condição) e contract_assert (verificação de afirmação). O operador 'pre' define condições prévias que devem ser atendidas antes da chamada (verificação de dados de entrada); 'post' — condições que devem ser atendidas após a execução (requisitos para os dados de saída); contract_assert — condições que geram exceções. Essa funcionalidade estará disponível no GCC 16.
    • O operador 'template for' para iterar sobre elementos, como pacotes de parâmetros, objetos semelhantes a tuplas e resultados de reflexão (metaobjetos), durante a etapa de compilação em um estilo de laço comum. Ao executar 'template for', o corpo do laço é expandido para cada elemento e cada iteração é processada em um escopo separado, onde o elemento da sequência pelo qual o laço itera é uma constante para cada iteração e pode participar de expressões constantes (constexpr). No contexto de reflexão, 'template for' pode ser usado para percorrer propriedades de classes ou enumerações.
    • A biblioteca std::simd para paralelizar a execução de operações sobre dados usando conjuntos de instruções SIMD, como AVX-512 e NEON, utilizando o sistema de tipos padrão C++.
    • As bibliotecas std::inplace_vector, std::optional, std::copyable_function, std::function_ref, std::indirect, std::polymorphic e std::owner_equal.
  • Foram implementadas funcionalidades relacionadas ao padrão C++23, como gerenciamento explícito do tempo de vida dos objetos e suporte indicação da codificação de símbolos das mensagens de diagnóstico.
  • Apoio expandido ao padrão C23 (opennet.ru), por exemplo, foi implementada a capacidade de usar o atributo 'counted_by' para verificar a sustentabilidade do uso de ponteiros.
  • Continua implementação dos padrões OpenMP 5.0, 5.1, 5.2 e 6.0 (Open Multi-Processing), que definem API e métodos para aplicar técnicas de programação paralela em sistemas multicore e híbridos (CPU+GPU/DSP) com memória compartilhada e blocos de vetorização (SIMD). Aprimorada implementação das especificações de programação paralela OpenACC 3.0, 3.3 e 3.4, que definem recursos para descarregar operações (offloading) para GPUs e processadores especializados, como NVIDIA PTX.
  • Suporte adicionado no backend para a arquitetura x86 para processadores AMD baseados na microarquitetura Zen6 (-march=znver6), além de processadores Intel Wildcat Lake (-march=wildcatlake) e Nova Lake (-march=novalake).
  • No backend de geração de código para GPU AMD Radeon (GCN), foi implementado suporte para aceleradores AMD Instinct MI300 (gfx942).
  • Para as arquiteturas RISC-V, ARM, S/390 e LoongArch, foi implementado suporte para o tipo «_BitInt (N)» para definir inteiros com um número específico de bits.

Fonte: linux.org.ru

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster