Lançamento do conjunto de compiladores GCC 15

Após um ano de desenvolvimento, foi lançado o compilador gratuito GCC 15.1, a primeira versão significativa na nova linha GCC 15.x. De acordo com o esquema de numeração de versões, a versão 15.0 foi utilizada durante o processo de desenvolvimento, e pouco antes do lançamento do GCC 15.1, uma ramificação do GCC 16.0 já havia sido criada, a partir da qual será formado o próximo lançamento significativo, o GCC 16.1.

Principais mudanças:

  • Ao compilar programas em C, o padrão padrão é C23 (visão geral das mudanças) com extensões GNU (‘-std=gnu23’). Anteriormente, o padrão padrão era C17 — ‘-std=gnu17’. Essa mudança pode potencialmente levar a problemas ao compilar projetos existentes devido à inclusão da constante nullptr, do tipo _BitInt(n) e das palavras-chave bool, true e false, que podem conflitar com identificadores de mesmo nome definidos nas aplicações.
  • Foram implementadas as funcionalidades do padrão C23:
    • A diretiva ‘#embed’, destinada a incorporar recursos binários no código.
    • O atributo ‘unsequenced’, que sinaliza que o resultado não depende da ordem de execução.
    • O atributo ‘reproducible’, que indica que a função sempre retorna o mesmo resultado para os mesmos dados de entrada, ou seja, não depende de outros fatores.
  • Implementados elementos do futuro padrão C2Y (-std=c2y e -std=gnu2y):
    • A possibilidade de declarar variáveis dentro da instrução ‘if’, por exemplo, ‘if (int x = get ()) {…}’.
    • Suporte para atribuição de nomes a loops para referência no código. outer: for (int i = 0; i < IK; ++i) { switch (i) { case 1: break; // salta para CONT1 case 2: break outer; // salta para CONT2 } // CONT1 } // CONT2
    • Suporte para especificar intervalos de valores inteiros nas instruções ‘case’, por exemplo, ‘case 1 … 10:’.
    • Os sufixos ‘i’ e ‘j’ para denotar a parte imaginária em números complexos.
    • A possibilidade de usar os operadores ‘++’ e ‘—’ com números complexos.
    • A construção ‘_Generic(type, expr1, expr2, …)’ para selecionar uma expressão com base no tipo do operando.
    • Suporte para tratar arrays de bytes como outros tipos de objetos, como estruturas e uniões.
    • Suporte para aplicar o operador ‘alignof’ a arrays incompletos (declarados sem especificar o tamanho, por exemplo, ‘int a[]’).
    • Adicionado um novo sintaxe para sequências de escape de caracteres octais, hexadecimais e universais. Em vez de "\u", "\x" e "\nnn" — foram propostas as sequências "\u{}", "\o{}" e "\x{}", nas quais é possível especificar um número arbitrário de dígitos.
    • Funções embutidas "__builtin_stdc_rotate_left" e "__builtin_stdc_rotate_right".
    • Operações de comprimento zero são permitidas em ponteiros NULL (por exemplo, "sizeof(*p)").
  • No frontend para a linguagem C++, foram implementadas funcionalidades em desenvolvimento para o futuro padrão C++26:
    • O operador variádico "friend" ("friend Ts…").
    • Possibilidade de usar a palavra-chave "constexpr" com a variante do operador "new" (placement new) para alocar objetos em memória previamente alocada durante a compilação.
    • Saída de erro ao excluir um ponteiro de tipo incompleto.
    • O sintaxe de definição de parâmetros variádicos com reticências sem vírgula anterior foi declarado obsoleto (por exemplo, ao especificar "void e(int…)" em vez de "void e(int, …)").
    • Indexação de pacotes de parâmetros em templates.
    • Atributos para associações estruturadas;
    • Sintaxe '= delete("razão")';
    • Inclusão de "@", "$" e "`" no conjunto básico de caracteres.
    • O uso de macros para declarar módulos foi proibido.
    • Possibilidade de aplicar associações estruturadas (structured binding) como condição em operadores if e switch.
    • Apoio para comparação direta de arrays foi descontinuado (por exemplo, "int arr1[5]; int arr2[5]; bool same = arr1 == arr2").
    • Mecanismo "#embed" para embutir recursos binários.
    • A classe template is_trivial foi declarada obsoleta.
  • Novas funcionalidades do C++23 foram adicionadas:
    • Proibição de algumas aplicações da diretiva "export" e permissão para uso de "export {}".
    • Apoio para extensão do tempo de vida de objetos temporários em ciclos "for" que percorrem intervalos.
  • Na biblioteca libstdc++, foi implementado suporte experimental para módulos std e std.compat.
  • O uso de inicializador "{0}" para uniões em código C e C++ agora não garante a limpeza de todo o conteúdo, mas resulta na zeragem do primeiro elemento da união. Para limpar toda a união, deve-se usar a expressão "{}", definida na especificação C23, ou especificar a opção "-fzero-init-padding-bits=unions" para restaurar o comportamento anterior.
  • Foi implementado o suporte para o atributo "musttail" ([[gnu::musttail]] e [[clang::musttail]]) para chamadas de cauda garantidas. O atributo é aplicado a expressões de retorno, onde ocorre uma chamada recursiva à função atual, garantindo que tal chamada utilize recursão em cauda, não consumindo memória adicional na pilha (eliminando o risco de esgotamento da memória em um número muito grande de chamadas).
  • Foi implementado o suporte para o atributo flag_enum ([[gnu::flag_enum]] e [[clang::flag_enum]]), aplicado a enums para indicar que seu conteúdo é utilizado em operações bit a bit (eliminando a emissão de avisos no modo "-Wswitch").
  • Adicionado suporte ao atributo "counted_by", que permite especificar um campo em uma estrutura com um array flexível que define o número de elementos. O atributo pode ser usado para aumentar a eficiência nas verificações de estouro de buffer.
  • Para funções, foi adicionado o atributo "nonnull_if_nonzero", que determina que alguns parâmetros de função com ponteiros podem aceitar o valor NULL apenas se outro parâmetro for zero.
  • Foi permitido o uso de inserções de assembly estendidas "asm (...)" fora de funções. Nas inserções de assembly, é permitido sobrescrever a memória na área vermelha da pilha (a parte superior da pilha).
  • A compilação de código C++ foi acelerada graças ao aprimoramento da hashing de templates.
  • Novas otimizações foram adicionadas. O suporte para vetorização de loops que contêm código para saídas prematuras (por exemplo, através de uma chamada break ou return) foi implementado, mesmo que tais loops manipulem arrays ou buffers alocados dinamicamente, cujo tamanho não é conhecido na fase de compilação. Com a opção "-O2" ativada, a vetorização de alguns loops facilmente vetorizáveis foi incluída, para os quais não há informações sobre o número de iterações (tripcount).
  • Foi adicionado um modo de otimização incremental na fase de ligação (LTO, Link-Time Optimization), que reduz significativamente o tempo de recompilação ao usar LTO em situações em que alterações triviais são feitas no código (uma função editada). Para ativar o modo incremental, a opção "-flto-incremental" foi sugerida.
  • A compilação de arquivos de entrada muito grandes foi aprimorada. O rastreamento de números de colunas superiores a 4096 foi implementado. A precisão na indicação do local de erros e avisos em arquivos muito grandes foi aumentada.
  • A clareza dos relatórios na diagnosticação de problemas foi aprimorada. Por exemplo, o local do problema é destacado com o símbolo "⚠️", a disposição da saída em caso de erros em modelos C++ foi alterada, dicas foram adicionadas para facilitar a transição para o padrão C23, e o esquema de cores foi reformulado. Foi adicionada a capacidade de saída de diagnósticos no formato Sarif (-fdiagnostics-format=sarif-file).
  • Foi implementada a biblioteca libgdiagnostics, que permite integrar em seus projetos as funcionalidades do GCC relacionadas à formatação de mensagens de diagnóstico (por exemplo, é possível usar ferramentas de citação, destaque e dicas de correção).
  • Avisos "-Wtrailing-whitespace" e "-Wleading-whitespace" foram adicionados para identificar espaços em branco remanescentes no final das linhas e espaços em branco desnecessários no início das linhas.
  • Foi adicionado o aviso "-Wheader-guard" para informar sobre problemas em macros de proteção de arquivos de cabeçalho que impedem a reinclusão do arquivo de cabeçalho.
  • O front-end para a linguagem D foi atualizado para a versão 2.111.0.
  • No front-end para a linguagem Fortran, foi adicionada suporte para números inteiros sem sinal.
  • Foi incluído o compilador para a linguagem COBOL — gcobol, que dá suporte às plataformas x86-64 e AArch64, e não é projetado para uso em sistemas de 32 bits. O compilador implementa a especificação ISO/IEC 1989:2023 e passa na maior parte dos testes NIST CCVS/85.
  • A implementação dos padrões OpenMP 5.0, 5.1, 5.2 e 6.0 (Open Multi-Processing), que definem APIs e métodos para aplicar programação paralela em sistemas multi-core e híbridos (CPU+GPU/DSP) com memória compartilhada e blocos de vetorização (SIMD), foi continuada. O suporte para metadiretivas e construções como tile, unroll, interop e dispatch foi adicionado. Para algumas GPUs AMD e NVIDIA, o suporte à memória compartilhada unificada foi adicionado (ativada ao especificar unified_shared_memory na diretiva "requires"). O suporte para a expressão "self_maps" foi adicionado.
  • No backend para a arquitetura AArch64, foi adicionado suporte à plataforma MinGW (aarch64-w64-mingw32). Mais de 20 extensões ARM8 foram implementadas e o suporte para a extensão ACLE (Arm C Language Extensions) foi melhorado. Muitas melhorias foram feitas no gerador de código. O suporte para CPU foi adicionado:
    • 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)
  • No backend de geração de código para GPU AMD Radeon (GCN), foi implementado suporte à biblioteca libstdc++ e adicionado suporte experimental para geração de código para as séries de dispositivos gfx9-generic, gfx10-3-generic e gfx11-generic.
  • Foi adicionado ao backend para a arquitetura x86 suporte às extensões do conjunto de instruções Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Suporte adicionado para CPU Intel Diamond Rapids e Xeon Phi.
  • As capacidades dos backends para plataformas LoongArch e AVR foram expandidas.
  • Removido o suporte à arquitetura de destino nios2, aplicada em processadores Nios II. O suporte à ABI ILP32 (-mabi=ilp32) em port para AArch64 foi declarado obsoleto e será removido na próxima versão importante.

Fonte: opennet.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