Coleção do compilador GNU

Da Wikipédia, a enciclopédia livre
Ir para a navegação Saltar para pesquisar

Coleção do compilador GNU
Coleção de compiladores GNU logo.svg
GCC 10.2 GNU Compiler Collection self-compilation.png
Captura de tela do GCC 10.2 compilando seu próprio código-fonte
Autor(es) original(is)Richard Stallman
Desenvolvedor(es)Projeto GNU
lançamento inicial22 de março de 1987 ; 34 anos atrás [1] (1987-03-22)
Versão estável
11.2 [2] Edite isso no Wikidata / 28 de julho de 2021
Repositório
Escrito emC , C++ [3]
Sistema operacionalMultiplataforma
PlataformaGNU e muitos outros
Tamanho~15 milhões de LOC [4]
Disponível eminglês
TipoCompilador
LicençaGPLv3+ com exceção GCC Runtime Library [5]
Local na rede Internetgcc .gnu .org

O GNU Compiler Collection ( GCC ) é um compilador otimizador produzido pelo Projeto GNU que suporta várias linguagens de programação , arquiteturas de hardware e sistemas operacionais . A Free Software Foundation (FSF) distribui o GCC como software livre sob a GNU General Public License (GNU GPL). O GCC é um componente chave da cadeia de ferramentas GNU e o compilador padrão para a maioria dos projetos relacionados ao GNU e ao kernel Linux. Com cerca de 15 milhões de linhas de código em 2019, o GCC é um dos maiores programas gratuitos existentes. [4] Ele tem desempenhado um papel importante no crescimento do software livre , tanto como ferramenta quanto como exemplo.

Quando foi lançado pela primeira vez em 1987 por Richard Stallman , o GCC 1.0 foi chamado de GNU C Compiler , pois lidava apenas com a linguagem de programação C. [1] Foi estendido para compilar C++ em dezembro daquele ano. Front-ends foram posteriormente desenvolvidos para Objective-C , Objective-C++ , Fortran , Ada , D e Go , entre outros. [6] As especificações OpenMP e OpenACC também são suportadas nos compiladores C e C++. [7] [8]

O GCC foi portado para mais plataformas e arquiteturas de conjuntos de instruções do que qualquer outro compilador e é amplamente implantado como uma ferramenta no desenvolvimento de software livre e proprietário . O GCC também está disponível para muitos sistemas embarcados , incluindo chips baseados em ARM e baseados em Power ISA .

Além de ser o compilador oficial do sistema operacional GNU , o GCC foi adotado como o compilador padrão por muitos outros sistemas operacionais de computadores modernos do tipo Unix , incluindo a maioria das distribuições Linux . A maioria dos sistemas operacionais da família BSD também mudou para o GCC logo após seu lançamento, embora desde então, FreeBSD , OpenBSD e Apple macOS tenham migrado para o compilador Clang , [9] em grande parte devido a razões de licenciamento. [10] [11] [12] GCC também pode compilar código para Windows , Android ,iOS , Solaris , HP-UX , AIX e DOS. [13]

História

No final de 1983, em um esforço para inicializar o sistema operacional GNU , Richard Stallman pediu permissão a Andrew S. Tanenbaum , autor do Amsterdam Compiler Kit (também conhecido como Free University Compiler Kit ) para usar esse software para GNU. Quando Tanenbaum o avisou que o compilador não era gratuito e que apenas a universidade era gratuita, Stallman decidiu trabalhar em um compilador diferente. [14] Seu plano inicial era reescrever um compilador existente do Lawrence Livermore National Laboratory de Pastel para C com alguma ajuda de Len Tower e outros. [15][16] Stallman escreveu um novo front-end C para o compilador Livermore, mas depois percebeu que exigia megabytes de espaço de pilha, uma impossibilidade em um sistema Unix 68000 com apenas 64 KB, e concluiu que teria que escrever um novo compilador do zero . [15] Nenhum código do compilador Pastel acabou no GCC, embora Stallman tenha usado o front-end C que ele havia escrito. [15] [17]

O GCC foi lançado pela primeira vez em 22 de março de 1987, disponível por FTP do MIT . [18] Stallman foi listado como o autor, mas citou outros por suas contribuições, incluindo Jack Davidson e Christopher Fraser pela ideia de usar RTL como uma linguagem intermediária, Paul Rubin por escrever a maior parte do pré-processador e Leonard Tower por "partes do analisador, gerador de RTL, definições de RTL e da descrição da máquina Vax." [19] Descrito como o "primeiro sucesso de software livre" por Peter H. Salus , o compilador GNU chegou justamente no momento em que a Sun Microsystems estava desvinculando suas ferramentas de desenvolvimento de seu sistema operacional., vendendo-os separadamente a um preço combinado mais alto do que o pacote anterior, o que levou muitos usuários da Sun a comprar ou baixar o GCC em vez das ferramentas do fornecedor. [20] Enquanto Stallman considerava o GNU Emacs como seu projeto principal, em 1990, o GCC suportava treze arquiteturas de computador, superava vários compiladores de fornecedores e era usado comercialmente por várias empresas. [21]

garfo EGCS

Como o GCC foi licenciado sob a GPL, os programadores que quisessem trabalhar em outras direções - particularmente aqueles que escrevem interfaces para linguagens diferentes da C - estavam livres para desenvolver seu próprio fork do compilador, desde que atendessem aos termos da GPL, incluindo seus requisitos para distribuir o código- fonte código . Vários forks se mostraram ineficientes e difíceis de manejar, no entanto, e a dificuldade em obter o trabalho aceito pelo projeto oficial do GCC foi muito frustrante para muitos, pois o projeto favorecia a estabilidade em relação aos novos recursos. [22] A FSF manteve um controle tão próximo sobre o que foi adicionado à versão oficial do GCC 2.x (desenvolvido desde 1992) que o GCC foi usado como um exemplo do modelo de desenvolvimento "catedral" no ensaio de Eric S. RaymondA Catedral e o Bazar .

Em 1997, um grupo de desenvolvedores formou o Experimental/Enhanced GNU Compiler System (EGCS) para mesclar vários forks experimentais em um único projeto. [22] [17] A base da fusão foi um instantâneo de desenvolvimento do GCC (tirado por volta da versão 2.7.2 e posteriormente seguido até a versão 2.8.1). As fusões incluíram g77 (Fortran), PGCC ( GCC otimizado para Pentium P5 ), [17] muitas melhorias em C++ e muitas novas arquiteturas e variantes de sistema operacional . [23]

Embora ambos os projetos tenham seguido de perto as mudanças um do outro, o desenvolvimento do EGCS provou ser consideravelmente mais vigoroso, tanto que a FSF interrompeu oficialmente o desenvolvimento em seu compilador GCC 2.x, abençoou o EGCS como a versão oficial do GCC e nomeou o projeto EGCS como o GCC mantenedores em abril de 1999. Com o lançamento do GCC 2.95 em julho de 1999, os dois projetos foram novamente unidos. [24] [17] Desde então, o GCC tem sido mantido por um grupo variado de programadores de todo o mundo sob a direção de um comitê diretor. [25]

O GCC 3 (2002) removeu um front-end para o CHILL devido à falta de manutenção. [26]

Antes da versão 4.0, o front-end do Fortran era g77, que suportava apenas o FORTRAN 77 , mas depois foi abandonado em favor do novo front-end do GNU Fortran que suporta o Fortran 95 e grande parte do Fortran 2003 e do Fortran 2008 também. [27] [28]

A partir da versão 4.8, o GCC é implementado em C++. [29]

O suporte para Cilk Plus existia do GCC 5 ao GCC 7. [30] [31]

O GCC foi portado para uma ampla variedade de arquiteturas de conjuntos de instruções e é amplamente implantado como uma ferramenta no desenvolvimento de software livre e proprietário . O GCC também está disponível para muitos sistemas embarcados , incluindo Symbian (chamado gcce ), [32] chips baseados em ARM e baseados em Power ISA . [33] O compilador pode atingir uma ampla variedade de plataformas, incluindo consoles de videogame como o PlayStation 2 , [34] Cell SPE do PlayStation 3, [35] e Dreamcast . [36]Ele foi portado para mais tipos de processadores e sistemas operacionais do que qualquer outro compilador. [37] [ fonte auto-publicada? ] [ melhor fonte necessária ]

Idiomas suportados

A partir de maio de 2021 , a recente versão 11.1 do GCC inclui front-ends para programação C ( ) gcc, C++ ( g++), Objective-C , Fortran ( gfortran), Ada ( GNAT ), Go ( gccgo) e D ( gdc, desde 9.1) [38] linguagens, [39] com as extensões de linguagem paralela OpenMP e OpenACC sendo suportadas desde o GCC 5.1. [8] [40] Versões anteriores ao GCC 7 também suportavam Java ( gcj), permitindo a compilação de Java para código de máquina nativo.[41]

Com relação ao suporte de versão de linguagem para C++ e C, desde o GCC 11.1 o destino padrão é gnu++17 , um superconjunto de C++17 , e gnu11 , um superconjunto de C11 , com suporte padrão estrito também disponível. O GCC também fornece suporte experimental para C++20 e C++23 futuro . [42]

Existem front-ends de terceiros para muitas linguagens, como Pascal ( gpc), Modula-2 , Modula-3 e VHDL ( GHDL). [39] Existem algumas ramificações experimentais para suportar linguagens adicionais, como o compilador GCC UPC para Unified Parallel C [43] ou Rust . [44]

Projeto

Visão geral do pipeline de compilação estendido do GCC, incluindo programas especializados como pré- processador , montador e vinculador .
O GCC segue a arquitetura de 3 estágios típica de compiladores multi-idioma e multi-CPU . Todas as árvores de programa são convertidas em uma representação abstrata comum na "extremidade intermediária", permitindo que a otimização de código e as facilidades de geração de código binário sejam compartilhadas por todas as linguagens.

A interface externa do GCC segue as convenções do Unix . Os usuários invocam um programa de driver específico da linguagem ( gccpara C, g++para C++, etc.), que interpreta argumentos de comando , chama o compilador real, executa o montador na saída e, opcionalmente, executa o vinculador para produzir um binário executável completo.

Cada um dos compiladores de linguagem é um programa separado que lê o código-fonte e gera o código de máquina . Todos têm uma estrutura interna comum. Um front-end por idioma analisa o código-fonte nesse idioma e produz uma árvore de sintaxe abstrata ("árvore" para abreviar).

Estes são, se necessário, convertidos para a representação de entrada da extremidade intermediária, chamada de formulário GENERIC ; a extremidade intermediária então gradualmente transforma o programa em direção à sua forma final. Otimizações do compilador e técnicas de análise estática de código (como FORTIFY_SOURCE, [45] uma diretiva do compilador que tenta descobrir alguns estouros de buffer ) são aplicadas ao código. Eles funcionam em várias representações, principalmente a representação GIMPLE independente de arquitetura e a representação RTL dependente de arquitetura . Finalmente, o código de máquina é produzido usando correspondência de padrões específica da arquiteturaoriginalmente baseado em um algoritmo de Jack Davidson e Chris Fraser.

O GCC foi escrito principalmente em C , exceto por partes do front-end Ada . A distribuição inclui as bibliotecas padrão para Ada e C++ cujo código é escrito principalmente nessas linguagens. [46] Em algumas plataformas, a distribuição também inclui uma biblioteca de tempo de execução de baixo nível, libgcc , escrita em uma combinação de C independente de máquina e código de máquina específico do processador , projetado principalmente para lidar com operações aritméticas que o processador de destino não pode executar diretamente. [47]

O GCC usa muitas ferramentas adicionais em sua compilação, muitas das quais são instaladas por padrão por muitas distribuições Unix e Linux (mas que, normalmente, não estão presentes nas instalações do Windows), incluindo Perl , [ explicações adicionais necessárias ] Flex , Bison e outras ferramentas comuns. Além disso, atualmente requer a presença de três bibliotecas adicionais para construir: GMP , MPC e MPFR . [48]

Em maio de 2010, o comitê de direção do GCC decidiu permitir o uso de um compilador C++ para compilar o GCC. [49] O compilador foi planejado para ser escrito principalmente em C mais um subconjunto de recursos de C++. Em particular, isso foi decidido para que os desenvolvedores do GCC pudessem usar os recursos destrutores e genéricos do C++. [50]

Em agosto de 2012, o comitê de direção do GCC anunciou que o GCC agora usa C++ como sua linguagem de implementação. [51] Isso significa que para construir o GCC a partir de fontes, é necessário um compilador C++ que entenda o padrão ISO/IEC C++03 .

Em 18 de maio de 2020, o GCC mudou do padrão ISO/IEC C++03 para o padrão ISO/IEC C++11 (ou seja, necessário para compilar, inicializar, o próprio compilador; por padrão, no entanto, compila versões posteriores do C++). [52]

Front-ends

Os front ends consistem em pré- processamento , análise léxica , análise sintática (parsing) e análise semântica. Os objetivos dos front-ends do compilador são aceitar ou rejeitar programas candidatos de acordo com a gramática e semântica da linguagem, identificar erros e lidar com representações válidas de programas para estágios posteriores do compilador. Este exemplo mostra as etapas do lexer e do analisador executadas para um programa simples escrito em C .

Cada front end usa um analisador para produzir a árvore de sintaxe abstrata de um determinado arquivo de origem . Devido à abstração da árvore de sintaxe, os arquivos de origem de qualquer uma das diferentes linguagens suportadas podem ser processados ​​pelo mesmo back-end . O GCC começou usando analisadores LALR gerados com Bison , mas gradualmente mudou para analisadores descendentes recursivos escritos à mão para C++ em 2004, [53] e para C e Objective-C em 2006. [54] A partir de 2021 todos os front-ends usam mão analisadores descendentes recursivos escritos.

Até o GCC 4.0, a representação em árvore do programa não era totalmente independente do processador alvo. O significado de uma árvore era um pouco diferente para diferentes front-ends de idioma, e os front-ends podiam fornecer seus próprios códigos de árvore. Isso foi simplificado com a introdução de GENERIC e GIMPLE, duas novas formas de árvores independentes de linguagem que foram introduzidas com o advento do GCC 4.0. GENERIC é mais complexo, baseado na representação intermediária do front-end Java do GCC 3.x. GIMPLE é um GENERIC simplificado, no qual várias construções são reduzidas a várias instruções GIMPLE. O C , C++ e Javafront-ends produzem GENERIC diretamente no front-end. Outros front ends têm representações intermediárias diferentes após a análise e as convertem em GENERIC.

Em ambos os casos, o chamado "gimplificador" converte essa forma mais complexa na forma GIMPLE baseada em SSA mais simples, que é a linguagem comum para um grande número de otimizações globais poderosas (escopo de função) independentes de linguagem e arquitetura.

GENÉRICO e GIMPLE

GENERIC é uma linguagem de representação intermediária usada como "fim intermediário" ao compilar o código-fonte em binários executáveis . Um subconjunto, chamado GIMPLE , é direcionado por todos os front-ends do GCC.

O estágio intermediário do GCC faz toda a análise e otimização do código , trabalhando independentemente tanto da linguagem compilada quanto da arquitetura alvo, partindo da representação GENERIC [55] e expandindo-a para a linguagem de transferência de registradores (RTL). A representação GENERIC contém apenas o subconjunto das construções de programação imperativas otimizadas pela extremidade intermediária.

Ao transformar o código fonte em GIMPLE, [56] expressões complexas são divididas em um código de três endereços usando variáveis ​​temporárias . Esta representação foi inspirada na representação SIMPLE proposta no compilador McCAT [57] por Laurie J. Hendren [58] para simplificar a análise e otimização de programas imperativos .

Otimização

A otimização pode ocorrer durante qualquer fase de compilação; no entanto, a maior parte das otimizações é realizada após a análise sintática e semântica do front-end e antes da geração do código do back-end; assim, um nome comum, embora um tanto contraditório, para esta parte do compilador é o "fim do meio".

O conjunto exato de otimizações do GCC varia de versão para versão à medida que se desenvolve, mas inclui os algoritmos padrão, como otimização de loop , jump threading , eliminação de subexpressão comum , programação de instruções e assim por diante. As otimizações RTL são de menor importância com a adição de otimizações globais baseadas em SSA em árvores GIMPLE , [59] pois as otimizações RTL têm um escopo muito mais limitado e têm menos informações de alto nível.

Algumas dessas otimizações executadas nesse nível incluem eliminação de código morto, eliminação de redundância parcial , numeração de valor global , propagação de constante condicional esparsa e substituição escalar de agregados . Otimizações baseadas em dependência de array, como vetorização automática e paralelização automática , também são realizadas. A otimização guiada por perfil também é possível. [60]

Back end

O back-end do GCC é parcialmente especificado por macros de pré -processador e funções específicas para uma arquitetura de destino, por exemplo, para definir seu endianness , tamanho de palavra e convenções de chamada . A parte frontal do back-end usa isso para ajudar a decidir a geração de RTL, portanto, embora o RTL do GCC seja nominalmente independente do processador, a sequência inicial de instruções abstratas já está adaptada ao destino. A qualquer momento, as instruções RTL reais que formam a representação do programa devem estar de acordo com a descrição da máquina da arquitetura de destino.

O arquivo de descrição da máquina contém padrões RTL, juntamente com restrições de operandos e trechos de código para a saída do assembly final. As restrições indicam que um determinado padrão RTL só pode ser aplicado (por exemplo) a certos registradores de hardware, ou (por exemplo) permitir deslocamentos de operandos imediatos de apenas um tamanho limitado (por exemplo, deslocamentos de 12, 16, 24, ... bit, etc.). ). Durante a geração de RTL, as restrições para a arquitetura de destino fornecida são verificadas. Para emitir um determinado trecho de RTL, ele deve corresponder a um (ou mais) dos padrões RTL no arquivo de descrição da máquina e atender às restrições desse padrão; caso contrário, seria impossível converter o RTL final em código de máquina.

No final da compilação, o RTL válido é reduzido a uma forma estrita na qual cada instrução se refere a registradores reais da máquina e a um padrão do arquivo de descrição da máquina alvo. Formar RTL estrito é uma tarefa complicada; um passo importante é a alocação de registradores , onde registradores reais de hardware são escolhidos para substituir os pseudo-registros inicialmente atribuídos. Isto é seguido por uma fase de "recarregamento"; quaisquer pseudo-registros que não foram atribuídos a um registro de hardware real são 'derramados' para a pilha, e RTL para realizar esse derramamento é gerado. Da mesma forma, os deslocamentos grandes demais para caber em uma instrução real devem ser divididos e substituídos por sequências RTL que obedecerão às restrições de deslocamento.

Na fase final, o código de máquina é construído chamando um pequeno trecho de código, associado a cada padrão, para gerar as instruções reais do conjunto de instruções do alvo , usando os registradores finais, deslocamentos e endereços escolhidos durante a fase de recarregamento. O trecho de geração de assembly pode ser apenas uma string, caso em que uma simples substituição de string dos registradores, deslocamentos e/ou endereços na string é executada. O trecho de geração de assembly também pode ser um pequeno bloco de código C, realizando algum trabalho adicional, mas, em última análise, retornando uma string contendo o código de assembly válido.

Biblioteca padrão C++ (libstdc++)

O projeto GCC inclui uma implementação da biblioteca padrão C++ chamada libstdc++, [61] licenciada sob a licença GPLv3 com exceção para vincular aplicativos de código fechado quando as fontes são construídas com o GCC. [62] A versão atual é 11.

Outros recursos

Alguns recursos do GCC incluem:

Otimização do tempo de link
A otimização do tempo de link otimiza os limites do arquivo de objeto para melhorar diretamente o binário vinculado. A otimização do tempo de link depende de um arquivo intermediário contendo a serialização de alguma representação Gimple incluída no arquivo objeto. [ citação necessária ] O arquivo é gerado junto com o arquivo objeto durante a compilação do código-fonte. Cada compilação de origem gera um arquivo de objeto separado e um arquivo auxiliar de tempo de link. Quando os arquivos de objeto são vinculados, o compilador é executado novamente e usa os arquivos auxiliares para otimizar o código nos arquivos de objeto compilados separadamente.
Plug-ins
Os plugins estendem o compilador GCC diretamente. [63] Plugins permitem que um compilador de ações seja adaptado para necessidades específicas por código externo carregado como plugins. Por exemplo, os plugins podem adicionar, substituir ou até mesmo remover passagens intermediárias que operam em representações Gimple . [64] Vários plugins GCC já foram publicados, notadamente:
O suporte de plugins já foi uma questão controversa em 2007. [66]
Memória transacional C++
A linguagem C++ tem uma proposta ativa de memória transacional. Ele pode ser ativado no GCC 6 e mais recente ao compilar com o -fgnu-tm. [7] [67]
Identificadores Unicode
Embora a linguagem C++ exija suporte para caracteres Unicode não ASCII em identificadores , o recurso só tem suporte desde o GCC 10. Assim como no tratamento existente de literais de string, o arquivo de origem é considerado codificado em UTF-8 . O recurso é opcional em C, mas também foi disponibilizado desde essa alteração. [68] [69]
Extensões C
GNU C estende a linguagem de programação C com vários recursos não padrão, incluindo funções aninhadas [70] e typeofexpressões. [71]

Arquiteturas

GCC compilando Hello World no Windows

As famílias de processadores de destino do GCC a partir da versão 11.1 incluem: [72]

Os processadores de destino menos conhecidos suportados na versão padrão incluem:

Processadores adicionais foram suportados por versões GCC mantidas separadamente da versão FSF:

O compilador GCJ Java pode ter como alvo uma arquitetura de linguagem de máquina nativa ou o bytecode Java da máquina virtual Java . [75] Ao redirecionar o GCC para uma nova plataforma, o bootstrap é frequentemente usado. Motorola 68000, Zilog Z80 e outros processadores também são direcionados nas versões GCC desenvolvidas para várias calculadoras gráficas programáveis ​​Texas Instruments, Hewlett Packard, Sharp e Casio. [76]

Licença

O GCC é licenciado sob a GNU General Public License versão 3. [77] A exceção de tempo de execução do GCC permite a compilação de programas proprietários (além do software livre) com o GCC. Isso não afeta os termos de licença do código-fonte do GCC. [78]

Veja também

Referências

  1. ^ a b "Lançamentos do GCC" . Projeto GNU . Recuperado em 24 de julho de 2020 .
  2. ^ "GCC 11.2 lançado" . 28 de julho de 2021.
  3. ^ "Convenções de codificação GCC - Projeto GNU" . gcc.gnu.org . Recuperado em 7 de fevereiro de 2022 .
  4. ^ a b Víctor Rodríguez (1 de outubro de 2019). "Cutting Edge Toolchain (Últimos Recursos no GCC/GLIBC)" . youtube . com . Fundação Linux. Arquivado do original em 7 de novembro de 2021 . Recuperado em 19 de janeiro de 2021 .
  5. ^ "Exceção da biblioteca de tempo de execução do GCC" . Recuperado em 24 de julho de 2020 .
  6. ^ "Linguagens de programação suportadas pelo GCC" . Projeto GNU . Recuperado em 23 de junho de 2014 .
  7. ^ a b "GCC 6 Release Series — Alterações, Novos Recursos e Correções - Projeto GNU" . gcc.gnu.org .
  8. ^ a b "OpenACC - GCC Wiki" . gcc.gnu.org .
  9. ^ "O Projeto de Infraestrutura do Compilador LLVM" . llvm.org .
  10. ^ "Expurgo GPLv3 da Apple" . meta.ath0.com . Recuperado em 12 de janeiro de 2021 .
  11. ^ Linnemann, Reid (20 de junho de 2012). "Por que Clang" . Recuperado em 12 de janeiro de 2021 .
  12. ^ "29 de agosto de 2007: Boletim da Fundação FreeBSD, 29 de agosto de 2007" . 11 de outubro de 2007. Arquivado a partir do original em 11 de outubro de 2007 . Recuperado em 12 de janeiro de 2021 .
  13. ^ "Instalando o GCC: Binários - Projeto GNU - Free Software Foundation (FSF)" . gcc.gnu.org . Recuperado em 12 de janeiro de 2021 .
  14. ^ von Hagen, William (2006). O Guia Definitivo para o GCC . Guias definitivos (2ª ed.). Apress. pág. XXVII. ISBN 978-1-4302-0219-6. Então ele escreveu para o autor do VUCK perguntando se o GNU poderia usá-lo. Evidentemente, o desenvolvedor do VUCK não cooperou, respondendo que a universidade era gratuita, mas que o compilador não era.
  15. ^ a b c Stallman, Richard (20 de setembro de 2011). "Sobre o Projeto GNU" . O Projeto GNU . Recuperado em 9 de outubro de 2011 .
  16. ^ Puzo, Jerome E., ed. (Fevereiro de 1986). "Zoológico do Gnu" . Boletim do Gnu . Fundação de Software Livre. 1 (1) . Recuperado em 11 de agosto de 2007 .
  17. ^ a b c d von Hagen, William (2006). O Guia Definitivo para o GCC . Guias definitivos (2ª ed.). Apress. pág. XXVII. ISBN 978-1-4302-0219-6.
  18. Richard M. Stallman (enviado por Leonard H. Tower Jr.) (22 de março de 1987). "versão de teste beta do compilador GNU C" . Grupo de notíciascomp.lang.c. Recuperado em 9 de outubro de 2011 .
  19. ^ Stallman, Richard M. (22 de junho de 2001) [Primeira publicação em 1988], "Contributors to GNU CC" , Using and Porting the GNU Compiler Collection (GCC) , Free Software Foundation, Inc., p. 7 , recuperado em 18 de junho de 2015 .
  20. ^ Salus, Peter H. (2005). "Capítulo 10. SUN e gcc" . O Daemon, o Gnu e o Pinguim . Groklaw .
  21. ^ Garfinkel, Simson L. (6 de agosto de 1990). "Prepare-se para o software GNU" . Computerworld . pág. 102.
  22. ^ a b Henkel-Wallace, David (15 de agosto de 1997), Um novo projeto de compilador para mesclar os forks GCC existentes , recuperado em 25 de maio de 2012 .
  23. ^ "A Breve História do desenvolvimento do GCC" . www.softpanorama.org . Recuperado em 24 de janeiro de 2021 .
  24. ^ "História - GCC Wiki" . gcc.gnu.org . Recuperado em 28 de setembro de 2020 .
  25. ^ "Comitê de direção do GCC - Projeto GNU" . gcc.gnu.org .
  26. ^ "PATCH] Remover resfriamento" . gcc.gnu.org . Recuperado em 29 de julho de 2010 .
  27. ^ "Gráfico de recursos do Fortran 2003 suportados pelo GNU Fortran" . GNU . Recuperado em 25 de junho de 2009 .
  28. ^ "Gráfico de recursos do Fortran 2008 suportados pelo GNU Fortran" . GNU . Recuperado em 25 de junho de 2009 .
  29. ^ "GCC 4.8 Release Series — Alterações, Novos Recursos e Correções - Projeto GNU" . gcc.gnu.org .
  30. ^ "GCC 5 Release Series - Alterações, Novos Recursos e Correções" . gcc.gnu.org .
  31. ^ "GCC 8 Release Series - Alterações, Novos Recursos e Correções" . gcc.gnu.org .
  32. ^ "Projeto de Melhoria do GCC Symbian" . Recuperado em 8 de novembro de 2007 .
  33. ^ "Pacotes de suporte da placa Linux" . Arquivado do original em 7 de junho de 2011 . Recuperado em 24 de janeiro de 2021 .
  34. ^ "configurando o gcc como um compilador cruzado" . ps2stuff . 8 de junho de 2002. Arquivado a partir do original em 11 de dezembro de 2008 . Recuperado em 12 de dezembro de 2008 .
  35. ^ "CompileFarm - GCC Wiki" . gcc.gnu.org .
  36. ^ "guia sh4 g++" . Arquivado do original em 20 de dezembro de 2002 . Recuperado em 12 de dezembro de 2008 .
  37. ^ "Projeto de Informação Linux" . LINFO . Recuperado em 27 de abril de 2010 . O GCC foi portado para (ou seja, modificado para rodar em) mais de 60 plataformas, o que é mais do que para qualquer outro compilador.
  38. ^ "The D Language Front-End finalmente fundido no GCC 9 - Phoronix" . phoronix . com . Recuperado em 19 de janeiro de 2021 .
  39. ^ a b "GCC Front Ends" . gnu.org . Recuperado em 25 de novembro de 2011 .
  40. ^ "GCC 5 Release Series — Mudanças, Novos Recursos e Correções - Projeto GNU" . gcc.gnu.org .
  41. ^ "GCC 7 Release Series" . gnu.org . Recuperado em 20 de março de 2018 .
  42. ^ "Suporte a padrões C++ no GCC" . Recuperado em 17 de maio de 2021 .
  43. ^ "GCC UPC (GCC Unified Paralelo C)" . Intrepid Technology, Inc. 20 de fevereiro de 2006 . Recuperado em 11 de março de 2009 .
  44. Spengler, Brad (12 de janeiro de 2021). "Open Source Security, Inc. Anuncia Financiamento do GCC Front-End para Rust" .
  45. ^ "Recursos de segurança: Compile Time Buffer Checks (FORTIFY_SOURCE)" . fedoraproject.org . Recuperado em 11 de março de 2009 .
  46. ^ "linguagens usadas para fazer o GCC" .
  47. ^ "Internos do GCC" . GCC.org . Recuperado em 1 de março de 2010 .
  48. ^ "Pré-requisitos para GCC - Projeto GNU" . gcc.gnu.org . Recuperado em 5 de setembro de 2021 .
  49. ^ "GCC permite C++ - até certo ponto" . O H. 1 de junho de 2010.
  50. ^ "Re: Esforços para atrair mais usuários?" . listas.gnu.org .
  51. ^ "Série de lançamento do GCC 4.8: alterações, novos recursos e correções" . Recuperado em 4 de outubro de 2013 .
  52. ^ "bootstrap: Requisito de atualização para C++11" . Recuperado em 18 de maio de 2020 .
  53. ^ "GCC 3.4 Release Series — Alterações, Novos Recursos e Correções - Projeto GNU" . gcc.gnu.org .
  54. ^ "Série de lançamento do GCC 4.1 — Alterações, novos recursos e correções - Projeto GNU" . gcc.gnu.org .
  55. ^ "GENÉRICO (internos da coleção do compilador GNU (GCC))" . gcc.gnu.org .
  56. ^ "GIMPLE (GNU Compiler Collection (GCC) Internals)" . gcc.gnu.org .
  57. ^ "McCAT" . Arquivado do original em 12 de agosto de 2004 . Recuperado em 14 de setembro de 2017 .{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  58. ^ "Home Page de Laurie Hendren" . www.sable.mcgill.ca .
  59. ^ Novillo, Diego (dezembro de 2004). "Da fonte ao binário: o funcionamento interno do GCC" . Revista Red Hat . Arquivado a partir do original em 1 de abril de 2009.
  60. ^ "Instalando o GCC: Construindo - Projeto GNU" . gcc.gnu.org .
  61. ^ "A Biblioteca GNU C++" . Projeto GNU . Recuperado em 21 de fevereiro de 2021 .
  62. ^ "Licença" . Projeto GNU . Recuperado em 21 de fevereiro de 2021 .
  63. ^ "Plugins" . Documentação online do GCC . Recuperado em 8 de julho de 2013 .
  64. ^ Starynkevitch, Basile. "Plugins GCC através do exemplo MELT" (PDF) . Recuperado em 10 de abril de 2014 .
  65. ^ "Sobre GCC MELT" . Arquivado do original em 4 de julho de 2013 . Recuperado em 8 de julho de 2013 .
  66. ^ "GCC desconectado [LWN.net]" . lwn.net .
  67. ^ "TransactionalMemory - GCC Wiki" . gcc.gnu.org .
  68. ^ "Lewis Hyatt - [PATCH] wwwdocs: Suporte de documentos para identificadores estendidos adicionados ao GCC" . gcc.gnu.org . Recuperado em 27 de março de 2020 .
  69. ^ "Recomendações para caracteres identificadores estendidos para C e C++" . www.open-std.org . Recuperado em 27 de março de 2020 .
  70. ^ "Extensões C (usando o GNU Compiler Collection (GCC))" . gcc.gnu.org . Recuperado em 12 de janeiro de 2022 .
  71. ^ "Typeof - Usando o GNU Compiler Collection (GCC)" . gcc.gnu.org . Recuperado em 12 de janeiro de 2022 .
  72. ^ "Resumo de opções (usando a coleção de compiladores GNU (GCC))" . gcc.gnu.org . Recuperado em 21 de agosto de 2020 .
  73. ^ "Projeto Hexagon Wiki" .
  74. ^ "Arquivo do Google Code - armazenamento de longo prazo para o Google Code Project Hosting" . code.google.com .
  75. ^ "O compilador GNU para a linguagem de programação Java" . Arquivado a partir do original em 9 de maio de 2007 . Recuperado em 22 de abril de 2010 .
  76. ^ calculadoras gráficas#programação
  77. ^ "Usando a coleção do compilador GNU" . gnu.org . Recuperado em 5 de novembro de 2019 .
  78. ^ "Exceção de tempo de execução do GCC" . FSF . Recuperado em 10 de abril de 2014 .

Leitura adicional

Links externos

Oficial

Outro