Avançar para a área de conteúdo

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

A primeira vez que acessar o developerWorks, um perfil será criado para você. Informações do seu perfil (tais como: nome, país / região, e empresa) estarão disponíveis ao público, que poderá acompanhar qualquer conteúdo que você publicar. Seu perfil no developerWorks pode ser atualizado a qualquer momento.

Todas as informações enviadas são seguras.

  • Fechar [x]

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Todas as informações enviadas são seguras.

  • Fechar [x]

Conhecendo o GCC 4

O que Há de Novo na Série de Releases do GNU Compiler Collection

M. Tim Jones, Consultant Engineer, Emulex Corp.
M. Tim Jones
M. Tim Jones é um arquiteto de firmwares embarcados e autor de Inteligência Artificial: Sistemas de Abordagem, GNU/Linux, Programação de Aplicativos AI (atualmente em sua segunda edição), Programação de Aplicativos AI (em sua segunda edição) e BSD Sockets Programming from a Multilanguage Perspective. Sua formação em engenharia vai desde o desenvolvimento de kernels para nave espacial geossincrônica até a arquitetura de sistema embarcado e o desenvolvimento de protocolos de interligação de redes. Tim é um Engenheiro Consultor para a Emulex Corp. em Longmont, Colorado.

Resumo:  Nos últimos anos, o GNU Compiler Collection (GCC) passou por uma grande transição, da versão GCC 3 para a 4. Com o GCC 4 surgiu uma nova estrutura de otimização (e uma nova representação de código intermediário), um novo suporte a destino e linguagem e uma variedade de novos atributos e opções. Conheça os principais recursos novos e seus benefícios.

Data:  28/Out/2008
Nível:  Intermediário
Atividade:  2841 visualizações
Comentários:  


O GCC é a peça fundamental no desenvolvimento de software livre e software fechado. Ele funciona como ativador das arquiteturas e dos sistemas operacionais. Quando um novo processador aparece, seu êxito depende de uma versão GCC que irá fornecer suporte a ele (um back-end que pode gerar código para ele). O GCC também é o ativador do Linux®. O Linux, como um sistema operacional, é amplamente bem-sucedido porque é executado em muitas arquiteturas diferentes. Novamente, uma porta do GCC para o ambiente de destino permite que o Linux tenha uma porta e seja executado nela. Sem tentar pontuá-lo, o GCC ladrilha o caminho para o Linux e para o desenvolvimento embarcado.

Mas o GCC não para por aí. Novas arquiteturas de processadores continuam aparecendo e novas pesquisas encontram melhores formas de otimizar e gerar códigos. Assim, o GCC evolui e, no seu quarto release principal, amadureceu. Este artigo explora as alterações fundamentais no GCC versão 4 para mostrar a você—se você ainda não mudou—porque é hora de usar o compilador padrão.

Breve História

O GCC era originalmente significava como GNU C Compiler quando foi lançado pela primeira vez por Richard Stallman em 1987. (Uma linha de tempo histórica do GCC é mostrada na Figura 1.) Richard começou o projeto em 1984 com o desejo de criar um compilador C aberto que pudesse ser usado, modificado e desenvolvido. Originalmente, o GCC era executado nos primeiros sistemas Sun e DEC VAX.

Como um compilador aberto (ou seja, a fonte era livremente disponibilizada), outras pessoas começaram a fornecer correções e,—ainda mais importante,—atualizações para novas linguagens e arquiteturas de destino. Não muito tempo depois, seu acrônimo mudou para GNU Compiler Collection, pois ele oferecia suporte a diversas linguagens destinadas às arquiteturas mais populares (e exóticas).


Figura 1. Uma História Moderna dos Releases GCC
Uma História Moderna dos Releases GCC

Hoje, o GCC é a cadeia mais popular de ferramentas de compiladores disponíveis. A mesma fonte base pode ser utilizada para criar compiladores para Ada, Fortran, a linguagem Java™, variantes de C (C++ e Objective-C) e abrange o maior número de arquiteturas de processadores de destino de qualquer compilador (30 famílias de processadores com suporte). A fonte base também é totalmente portátil e pode ser executada em mais de 60 plataformas. Os compiladores são altamente ajustáveis, com um grande número de opções para obter o código gerado. Resumindo, o GCC é o canivete suíço dos compiladores e redefine o significado de flexibilidade. Ele também é o sistema de software livre mais complexo que existe: hoje, o GCC engloba quase 1,5 milhões de linhas de código de origem.

Uau! Com isso tudo, você vai acabar pensando que estou apaixonado pelo GCC. Digamos que quando eu desenvolvo um software com o GCC, e minha esposa entra na sala, eu me sinto um pouco desconfortável.


Antes de Começar

Os compiladores são criados em uma arquitetura pipeline, composta por vários estágios, que comunicam diferentes formatos de dados (consulte a Figura 2). O front-end de um compilador é específico de linguagem e inclui um analisador para determinada linguagem, o que resulta em árvores analisadas e na representação intermediária (a Register Transfer Language, ou RTL). O back-end é então responsável pelo uso dessa representação independente da linguagem e instruções do produto para a arquitetura de destino específica. Para isso, o otimizador utiliza a RTL para criar código mais rápido e compacto (ou ambos, quando possível). A RTL otimizada é então alimentada para o gerador de código, que produz o código de destino.


Figura 2. Visualização Simplificada dos Estágios do Compilador
Visualização Simplificada dos Estágios do Compilador

Alterações Principais no GCC 4

O GCC 4 traz muitas alterações para o conjunto de compiladores padrão, o maior oferece suporte para otimizações com a introdução do formato de árvore Static Single Assignment (SSA). Mas, no geral, o compilador é mais rápido em alguns modos de otimização e fornece muitos aperfeiçoamentos, incluindo o novo suporte de destino. O GCC 4 também é muito mais completo quando vem com avisos e erros (na verdade, determinados avisos agora podem ser mostrados como erros com o GCC 4). Uma desvantagem do GCC 4 é que ele não é compatível com binários de objetos criados com os compiladores GCC 3 (o que significa que a origem deve ser recompilada com o GCC 4)—, mas este é preço pago pelo desenvolvimento.

Vamos observar algumas das principais vantagens do novo GCC 4.

A Série do Release 4.0

O release 4.0 (4.0.4 sendo o último da série) foi o primeiro passo para o GCC 4. Assim, ele não era recomendado para o desenvolvimento de produção até que o processo de estabilização pudesse ser concluído. Esse release incluía um grande número de alterações—duas, particularmente, sendo a introdução de uma nova estrutura de otimização (árvore SSA) e o suporte para vetorização automatizada.

Antes do GCC 4, a representação intermediária utilizada era chamada de Register Transfer Language (RTL). A RTL é uma representação de nível baixo, muito próxima à linguagem assembly (inspirada pelas expressões LISP S). O problema com a RTL é que as otimizações que ela permite são muito próximas ao destino. As otimizações que requerem informações de nível maior sobre o programa podem não ser possíveis, pois suas expressões são perdidas na RTL. A árvore SSA foi criada para ser independente de linguagem e de destino, suportando ainda análises melhoradas e otimizações mais valiosas.

A árvore SSA apresenta duas novas representações intermediárias. A primeira é chamada de GENERIC, que é uma representação de árvore genérica formada de árvores front-end de linguagem. As árvores GENERIC são convertidas no formato GIMPLE e em um gráfico de fluxo de controle subsequente para oferecer suporte a otimizações baseadas em SSA. Por fim, as árvores SSA são convertidas em RTL, usadas pelo back-end para a geração de códigos de destino. Uma descrição bem simplificada, mas o resultado é um novo formato intermediário, mais adequado para otimizações de níveis alto e baixo. (Consulte Recursos para obter detalhes mais detalhados sobre esse processo.)

Como as alterações realmente representam uma nova estrutura, é possível definir novas otimizações. Várias novas otimizações foram implementadas até agora, mas há muito trabalho a fazer para garantir que o GCC gere códigos mais compactos e eficientes possíveis.

Outra alteração interessante no GCC 4 é a inclusão de um vetorizador de loop (baseado na estrutura de árvore SSA). Vetorização Automatizada é um recurso que permite que o compilador identifique loops de processamento escalar dentro do código que podem se beneficiar das instruções de vetor disponíveis no processador de destino. O resultado é um código de destino mais eficiente e completo. Outra otimização baseada em loop é o Swing Modulo Scheduling (SMS), usado para criar pipelines de instruções com o intuito de minimizar contagens de ciclos explorando o paralelismo de nível de instrução. Informações adicionais sobre cada uma dessas novas abordagens estão disponíveis em Recursos.

Finalmente, a série 4.0 também introduziu (além de muitas alterações no C e C++) um novo front-end para o Fortran, que oferece suporte ao Fortran 90 e 95 (e não ao Fortran 77, mais antigo, que tinha suporte no GCC 3). Novos recursos do Ada 2005 também podem ser encontrados, bem como suporte para recursos Ada, em muitas outras arquiteturas de destino.

A Série do Release 4.1

Com a nova estrutura de otimização, a série do release 4.1 introduziu um número maior de otimizações, como suporte aperfeiçoado a perfis e estimativa de probabilidade de ramificação mais precisa. Duas das otimizações mais úteis são o melhor suporte sequencial e a capacidade de explorar a localidade do cache de instruções. Quando as funções precisam ser sequenciadas, o compilador não sequencia mais as funções que não são executadas com frequência. Ao contrário, sites de chamadas recentes têm mais probabilidade de serem sequenciados para manter o tamanho do código pequeno, enquanto ainda obtêm os benefícios das funções sequenciais. O GCC também pode auxiliar nas funções de partição em seções recentes ou não. Manter funções recentes juntas (ou seja, funções que são utilizadas com mais frequência) resulta em um melhor uso do cache de instrução, se comparado à poluição do cache com funções antigas.

O front-end verificou diversas atualizações, inclusive o suporte para Objective-C++. Também houve muitas atualizações para Java core library (libgc). O back-end verificou a introdução do suporte para o processador IBM® System z™ 9-109, inclusive números de pontos flutuantes de 128 bits do Institute of Electrical and Electronics Engineers (IEEE) e acesso integrado à memória atômica. Se isso não foi suficiente, o back-end agora pode emitir código para se proteger de ataques às pilhas (ou seja, a detecção do estouro do buffer e reordenação para se proteger de danos ao ponteiro). Algumas funções integradas também foram atualizadas para proteção contra estouros do buffer com uma quantidade mínima de sobrecarga.

A Série do Release 4.2

A série do release 4.2 continuou com novas otimizações e aperfeiçoamentos nas linguagens e arquiteturas de processadores. O back-end foi atualizado para incluir suporte para o processador UltraSPARC T1 da Sun (com codinome Niagara), bem como para o núcleo SB-1A MIPS da Broadcom.

O front-end também verificou alterações na versão 4.2 com a revisão da identificação de visibilidade de C++ e suporte para extensões de entrada/saída (E/S) para fluxos do Fortran 2003. Mas uma das alterações mais interessantes no release 4.2 foi a inclusão do OpenMP para os compiladores C, C++ e Fortran. O OpenMP é uma implementação de multiencadeamento que permite que o compilador gere código para o paralelismo de tarefas e dados.

Utilizando um aspecto do OpenMP, o código é anotado com áreas nas quais o paralelismo deve ocorrer utilizando diretivas de pré-processador. O código é convertido em um programa multiencadeado na duração do bloco, depois unido novamente à medida que cada encadeamento dentro do bloco termina.

A Figura 3 mostra como esse processador funciona na prática. O OpenMP fornece não apenas um conjunto de pragmas (ou seja, diretivas de pré-processadores), mas também funções para C, C++ e Fortran. Na Figura 3, você vê um programa simples que direciona elementos do código em vários encadeamentos (fazendo paralelismo do bloco for). O efeito é mostrado graficamente na Figura 3: um programa tradicional executaria o loop sequencialmente, enquanto a implementação do OpenMP criaria encadeamentos para fazer o paralelismo do bloco for. É possível obter informações adicionais sobre o OpenMP em Recursos.


Figura 3. Exemplo Simples de Suporte ao OpenMP
Exemplo Simples de Suporte ao OpenMP

A Série do Release 4.3

A série do release atual no GCC 4 é a 4.3. Essa série do release mostra uma aceleração de recursos e arquiteturas suportadas (bem como arquiteturas não-suportadas, já que muitas arquiteturas e portas obsoletas foram removidas). Novo suporte de linguagem foi incluído para o Fortran 2003, bem como um host de aperfeiçoamentos gerais do otimizador.

Novos processadores suportados neste release incluem vários processadores da família Coldfire, o processador IBM System z9 EC/BC, Synergistic Processor Unit (SPU) da arquitetura de mecanismo de largura de banda de célula, suporte para SmartMIPS e vários outros. Também será encontrado suporte de compiladores e bibliotecas para Thumb2 (instruções ARM compactadas) e para a arquitetura ARMv7, bem como suporte de ajuste para processadores Core2 e para a família de processadores Geode.

No front-end do compilador, a representação interna para GIMPLE foi redefinida, significando que o compilador consome menos memória.

Além do Release 4.3

O trabalho já começou na série do release 4.4 e está caminhando em direção a um release geral. Na versão 4.4, serão encontradas várias correções de erros e aperfeiçoamentos mais gerais do otimizador. A versão 3.0 da especificação OpenMP também foi integrada para C, C++ e Fortran.

O compilador agora também permite que você defina um nível de otimização no nível de função (e não no nível de arquivo, que era o padrão anterior). Essa funcionalidade é fornecida pelo atributo optimize, que também permite que você especifique as opções individuais do otimizador.

Por fim, suporte ao processador foi incluído no Picochip, que é um processador de vários núcleos de 16 bits. Um ponto interessante sobre o Picochip é que cada núcleo pode ser programado de modo independente, com comunicação fornecida em conjunto.


O que Vem a Seguir?

O futuro obviamente é brilhante para o GCC. A cadeia de ferramentas continua se desenvolvendo—tanto arquitetura quanto incrementalmente—para oferecer suporte às arquiteturas mais recentes de processadores. Você também verá que a linguagem também será bem abrangida pelo GCC. Ainda em desenvolvimento, haverá suporte para diversas linguagens diferentes, como Mercury, GHDL (um front-end do GCC para VHDL) e para a linguagem Unified Parallel C (UPC).

Além do futuro brilhante do GCC, seu desenvolvimento continuado significa benefícios para todos os tipos de softwares (do Linux e Berkeley Software Distribution [BSD] para Apache e tudo o que há entre eles). O software compilado com o GCC 4 geralmente será mais compacto e mais rápido, melhorando em todos os aspectos o segmento de mercado de software.


Recursos

Aprender

Obter produtos e tecnologias

  • Solicite o SEK para Linux, um conjunto de dois DVDs que contém o software de período experimental IBM mais recente para Linux a partir do DB2®, Lotus®, Rational®, Tivoli®e WebSphere®.

  • Com o Software de período experimental IBM, disponível para download diretamente do developerWorks, construa seu próximo projeto de desenvolvimento em Linux.

Discutir

Sobre o autor

M. Tim Jones

M. Tim Jones é um arquiteto de firmwares embarcados e autor de Inteligência Artificial: Sistemas de Abordagem, GNU/Linux, Programação de Aplicativos AI (atualmente em sua segunda edição), Programação de Aplicativos AI (em sua segunda edição) e BSD Sockets Programming from a Multilanguage Perspective. Sua formação em engenharia vai desde o desenvolvimento de kernels para nave espacial geossincrônica até a arquitetura de sistema embarcado e o desenvolvimento de protocolos de interligação de redes. Tim é um Engenheiro Consultor para a Emulex Corp. em Longmont, Colorado.

Ajuda para Relatar Abuso

Relatar abuso

Obrigado. Esta entrada foi sinalizada para atenção do moderador.


Ajuda para Relatar Abuso

Relatar abuso

Falha no envio do Relatório de abuso. Tente novamente mais tarde.


developerWorks: Registre-se


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Selecione seu nome de exibição

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

(Deve possuir de 3 a 31 caracteres.)


Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Classificar este artigo

Comentários

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Linux
ArticleID=382595
ArticleTitle=Conhecendo o GCC 4
publish-date=10282008
author1-email=mtj@mtjones.com
author1-email-cc=

Conheça a IBM da sua cidade

A IBM está mais perto do que você imagina!